Рассмотрим следующее:
volatile uint32_t i;
Как узнать, относился ли gcc к переменной i или нет? Он будет объявлен как таковой, потому что никакой соседний код не собирается его изменять, а его изменение, вероятно, связано с каким-то прерыванием.
Я не самый худший в мире программист на ассемблере, но я играю в него по телевизору. Может ли кто-нибудь помочь мне понять, как это будет отличаться?
Если взять следующий глупый код:
#include <stdio.h>
#include <inttypes.h>
volatile uint32_t i;
int main(void)
{
if (i == 64738)
return 0;
else
return 1;
}
Скомпилируйте его в объектный формат и дизассемблируйте через objdump, затем сделайте то же самое, удалив 'volatile', разницы нет (согласно diff). Является ли объявление volatile слишком близким к тому месту, где оно проверено или изменено, или я должен всегда использовать некоторый атомарный тип при объявлении чего-либо volatile? Влияют ли на это какие-то флаги оптимизации?
Заметьте, мой дурацкий образец не полностью соответствует моему вопросу, я это понимаю. Я только пытаюсь выяснить, обрабатывал ли gcc переменную как volatile или нет, поэтому я изучаю небольшие дампы, чтобы попытаться найти разницу.