Is volatile
需要一个在主循环中读写但在 ISR 中只读的变量吗?
编辑:在编写 main 时,ISR 被禁用。因此,该变量被有效地原子地使用。
EDIT:(非常相关):
中断的易失性与内存屏障
volatile
是一种不好的同步访问方式。这是一个优化障碍,但仅此而已。
-
它不是原子的;例如当你的some_type
is uint64_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
根据体系结构,可能需要内存屏障操作。例如。什么时候main
and irq
运行在具有专用缓存的不同内核上,irq
将永远不会看到更新的值
第一个问题需要锁定,但锁定操作通常意味着优化障碍,因此volatile
是多余的。
第二个问题也是如此,其中内存屏障也充当优化屏障。
volatile
对于实现对处理器内存的访问非常有用(这可能会在两次读取之间发生变化,或者在写入时产生副作用)。但通常情况下,它是不必要的并且太昂贵。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)