volatile仅用于在ISR中读取的变量?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (16)

volatile在主循环中读取和写入的变量是否需要,但在ISR中是只读的?

编辑:在主要编写的那一刻,ISR被禁用。因此,变量可以原子地有效地使用。

提问于
用户回答回答于

对于在主循环中读写的变量是否需要volatile,但在ISR中是只读的?

volatile这不是问题,因为保证main循环的写入不会被分开。

main()没有ISR呼叫保护的任何变化都可能导致问题volatile。声明volatile不会保存该问题的代码。

volatile some_type obj;

void ISR() {
  foo(obj);
}

int main() {
  for (;;) {
    // volatile useful here to prevent the assignment from being optimized away.
    some_type tmp = bar();

    // protect from potential interruption need here.

    // Without protection, ISR(), 
    // doesn't know it is working with a completely written `obj`
    obj = tmp;

    // release from potential interruption
}

volatile在两个方向都很有用,因为main()知道ISR()可能已经改变objmain()也没有优化掉分配。

然而,由于ISR()没有改变obj,所以volatile 不需要。

obj atomic可能有所帮助 - 但这是另一个问题。

扫码关注云+社区

领取腾讯云代金券