我有一个功能,可以更新结构,并禁用中断。
bool readBuffer()
{
__disable_irq();
rb->reader += 1; // Just an example
__enable_irq();
return true;
}
因为中断被禁用,所以在更新结构中的值时不可能有另一个中断抢占。
但我是否也应该将读者变量标记为
volatile
?因为理论上另一个中断可以在我进入函数时抢占,但就在 __disable_irq()
之前实际上被称为。当我的函数恢复时,缓存值 rb->reader
将是不正确的。或者编译器 (GCC) 生成的代码不缓存 rb->reader
直到那条线真正被击中?
最佳答案
指定显式优化障碍可能会更好:
bool readBuffer()
{
__disable_irq();
asm volatile ("" ::: "memory"); // Some unexpected memory modification
rb->reader += 1; // Just an example
__enable_irq();
return true;
}
如果在某些其他情况下您希望编译器优化
rb->reader
,这将是有利可图的。变量,因此将其标记为 volatile 将是多余的。
关于multithreading - 这里需要 volatile 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14441692/