Я пишу код для Cortex-M0 CPU и gcc. У меня есть следующая структура:
struct {
volatile unsigned flag1: 1;
unsigned flag2: 1;
unsigned foo; // something else accessed in main loop
} flags;
flag1
считывается и записывается как из обработчика прерываний GPIO, так и из основного цикла. flag2
считывается и записывается только в основном цикле.
ISR выглядит следующим образом:
void handleIRQ(void) {
if (!flags.flag1) {
flags.flag1 = 1;
// enable some hw timer
}
}
Основной цикл выглядит следующим образом:
for (;;) {
// disable IRQ
if (flags.flag1) {
// handle IRQ
flags.flag1 = 0;
// access (rw) flag2 many times
}
// wait for interrupt, enable IRQ
}
При доступе к flag2
в основном цикле компилятор оптимизирует доступ к нему, чтобы он не извлекался или не сохранялся в памяти каждый раз, когда он читается или записывается в код?
Мне это непонятно, потому что для установки flag1
в ISR нужно будет загрузить целое char
, установить бит и сохранить его обратно.