让x
和y
是在主代码和中断代码之间共享的变量。
我对volatile
的想法是,对于并且也在主代码中使用的硬件变量和中断变量,它始终是唯一需要的。
通过禁用中断,可以保证主代码中x
和y
的每次使用都是原子的。
真的需要x
和y
是volatile
,还是在使用它们强制从RAM重新加载变量之前设置一个内存屏障?
A)
volatile bool x;
volatile int y[100];
int main(void)
{
while (true) {
disable_interrupts();
if (x)
work(y);
x = false;
enable_interrupts();
}
}
B)
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;
}
答案 0 :(得分:2)
使用内存屏障代替volatile
很好。 Linux内核开发人员prefer it that way
需要注意一些事情。