我正在制作嵌入式固件,初始化后的所有事情都发生在 ISR 中。我有它们之间共享的变量,我想知道在什么情况下它们需要是易失性的。我从不阻塞,等待另一个 ISR 的变化。
在不使用易失性的情况下,什么时候可以确定实际内存已被读取或写入?每个 ISR 一次?
附录:
这是针对 ARM Cortex-M0 的,但这实际上并不是一个关于 ISR 的问题,而是一个关于编译器优化的问题,因此,平台实际上并不重要。
这个问题是完全可以回答的,而且答案很简单:
如果没有易失性,您(简单地)不能假设实际的内存访问将ever发生 - 编译器可以自由地得出结论,结果要么完全未使用(如果在它可以看到的内容中很明显),要么它们可以安全地缓存在寄存器中,或者乱序计算(只要visible依赖关系得到维护)。
您需要 挥发性 来告诉编译器访问的副作用对于优化器无法分析的东西可能很重要,例如中断上下文或不同“线程”的上下文。
实际上,易失性就是你对编译器说的“我知道一些你不知道的事情,所以不要在这里耍小聪明”
小心易变的does not保证读取-修改-写入的原子性,甚至在数据类型(或其未对齐)需要多步访问的情况下保证单独读取或写入的原子性。在这些情况下,您不仅面临获得陈旧值的风险,而且还面临完全错误的风险。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)