什么时候需要在 ISR 中使用 volatile?

oyv*_*ind 1 c volatile interrupt-handling

我正在制作嵌入式固件,初始化后的所有事情都发生在 ISR 中。我有它们之间共享的变量,我想知道在什么情况下它们需要是易失性的。我从不阻塞,等待另一个 ISR 的变化。

在不使用易失性的情况下,什么时候可以确定实际内存已被读取或写入?每个 ISR 一次?

附录:
这是针对 ARM Cortex-M0 的,但这实际上并不是一个关于 ISR 的问题,而是一个关于编译器优化的问题,因此,平台实际上并不重要。

Chr*_*ton 5

这个问题是完全可以回答的,而且答案很简单:

如果没有易失性,您(简单地)不能假设实际的内存访问将会发生- 编译器可以自由地得出结论,结果要么完全未使用(如果在它可以看到的内容中很明显),要么它们可以安全地缓存在寄存器,或乱序计算(只要保持可见的依赖关系)。

您需要 挥发性 来告诉编译器访问的副作用对于优化器无法分析的东西可能很重要,例如中断上下文或不同“线程”的上下文。

实际上,易失性就是你对编译器说的“我知道一些你不知道的事情,所以不要在这里耍小聪明”

请注意,易失性不能保证读取-修改-写入的原子性,甚至在数据类型(或其未对齐)需要多步访问的情况下也不能保证单独读取或写入。在这些情况下,您不仅面临获得陈旧值的风险,而且还面临完全错误的风险。