c - 仅在 ISR 中读取的变量的易失性?
问题描述
是否volatile
需要在主循环中读写但在 ISR 中只读的变量?
编辑:在编写 main 时,ISR 被禁用。因此,该变量被有效地以原子方式使用。
编辑:(非常相关):
解决方案
volatile
是同步访问的不好方法。这是一个优化障碍,但不是更多。
它不是原子的;例如,当您
some_type
在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
并irq
在具有专用缓存的不同内核上运行时,irq
将永远不会看到更新的值
第一个问题需要锁定,但锁定操作通常意味着优化障碍,所以这volatile
是多余的。
第二个问题同上,内存屏障也充当优化屏障。
volatile
对于实现对处理器内存的访问很有用(这可能会在两次读取之间发生变化或在写入时产生副作用)。但通常情况下,它是不需要的而且太贵了。
推荐阅读
- android - 为什么lockCanvas需要这么长时间才能锁定?
- android - 具有唯一替换约束的 Android Room 表
- python - 将密集矩阵代码转换为稀疏矩阵代码
- python - 在 Python 中添加字典条目并附加到 JSON 文件的最佳方法
- c# - 使用 LINQ 替换特定位置的特定子字符串
- java - javafx 不启动视频
- ios - 下载的ios模拟器没有出现在xcode
- python - 当 Na 存在时,用等效字母替换矩阵中的所有数字
- html - 无法在rails中添加背景图像
- c - Windows 内核驱动程序:ZwAllocateVirtualMemory 导致线程终止