我有一个更新结构的功能,还可以禁用中断。
bool readBuffer()
{
__disable_irq();
rb->reader += 1; // Just an example
__enable_irq();
return true;
}
由于禁用了中断,因此在更新结构中的值时,不可能抢占另一个中断。
但是我还应该将读者变量标记为volatile
吗?从理论上讲,当我进入函数时,其他中断可以抢占,但在实际调用__disable_irq()
之前。当我的函数恢复时,rb->reader
的缓存值将不正确。或者编译器(GCC)是否生成不缓存rb->reader
的代码,直到该行实际被命中?
答案 0 :(得分:1)
可能会更好地指定显式优化障碍:
bool readBuffer()
{
__disable_irq();
asm volatile ("" ::: "memory"); // Some unexpected memory modification
rb->reader += 1; // Just an example
__enable_irq();
return true;
}
如果在某些其他情况下您希望编译器优化rb->reader
变量,并将其标记为volatile,那将是有利可图的。