![](/img/trans.png)
[英]GCC memory barrier __sync_synchronize vs asm volatile(“”: : :“memory”)
[英]volatile vs memory barrier for interrupts
设x
和y
是主代码和中断代码之间共享的变量。
我对volatile
是,只有并且总是需要硬件变量和中断变量,这些变量也在主代码中使用。
通过禁用中断,主代码中x
和y
每次使用都保证是原子的。
x
和y
确实需要是volatile
,还是在使用它们强制从RAM重新加载变量之前是否足以放入内存屏障?
一种)
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;
}
内存障碍而volatile
很好。 Linux内核开发人员更喜欢这种方式
有几点需要注意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.