首页 > 解决方案 > 仅在 ISR 中读取的变量的易失性?

问题描述

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

编辑:在编写 main 时,ISR 被禁用。因此,该变量被有效地以原子方式使用。

编辑:(非常相关):

中断的易失性与内存屏障

标签: cinterruptvolatile

解决方案


volatile是同步访问的不好方法。这是一个优化障碍,但不是更多。

  • 它不是原子的;例如,当您some_typeuint64_t没有本机 64 位数据类型的平台上时,可能只有一部分是只读的。例如

    main()                  irq()
    
    /* initialization */ 
    var[0..31]  = 4
    var[32..63] = 8
    
    /* modificatoin */ 
    var[32..63] = 23
                          /* read */
                          a_hi = var[32..64] = 32
                          a_lo = var[0..31]  = 4
    var[0..31] = 42
    
  • 根据架构,可能需要内存屏障操作。例如,当mainirq在具有专用缓存的不同内核上运行时,irq将永远不会看到更新的值

第一个问题需要锁定,但锁定操作通常意味着优化障碍,所以这volatile是多余的。

第二个问题同上,内存屏障也充当优化屏障。

volatile对于实现对处理器内存的访问很有用(这可能会在两次读取之间发生变化或在写入时产生副作用)。但通常情况下,它是不需要的而且太贵了。


推荐阅读