Пусть x
и y
- переменные, которые совместно используются основным кодом и кодом прерывания.
Моя идея volatile
заключается в том, что он необходим и всегда необходим только для аппаратных переменных и переменных прерываний, которые также используются в основном коде.
Каждое использование x
и y
в основном коде гарантированно будет атомарным при отключении прерываний.
Действительно ли x
и y
должны быть volatile
, или достаточно поставить барьер памяти перед их использованием для принудительной перезагрузки переменных из ОЗУ?
A)
volatile bool x;
volatile int y[100];
int main(void)
{
while (true) {
disable_interrupts();
if (x)
work(y);
x = false;
enable_interrupts();
}
}
В)
bool x;
int y[100];
int main(void)
{
while (true) {
memory_barrier();
disable_interrupts();
if (x)
work(y);
x = false;
enable_interrupts();
}
}
Цели:
Чтобы позволить компилятору оптимизировать work()
.
Уметь использовать стандартные библиотечные функции, такие как memcpy()
(они не предназначены для использования с volatile
переменными).
Редактировать: добавить пример прерывания
interrupts.c
extern volatile? int x;
extern volatile? int y;
void interrupt(void)
{
x = true;
REGY1 = y[7];
y[23] = REGY2;
}