首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对于仅在ISR中读取的变量,是否为易失性?

对于仅在ISR中读取的变量,是否为易失性?
EN

Stack Overflow用户
提问于 2019-03-03 10:38:11
回答 1查看 267关注 0票数 1

对于在主循环中可读可写,但在ISR中为只读的变量,是否需要volatile

编辑:在main中写入时,ISR被禁用。因此,该变量得到了有效的原子使用。

编辑:(非常相关):

volatile vs memory barrier for interrupts

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-06 04:52:45

volatile不是同步访问的好方法。这是一个优化障碍,但仅此而已。

  • 它不是原子的;例如,当你的some_type在没有本地64位数据类型的平台上是uint64_t时,可能只有一部分被读取。例如。

main() irq() /*初始化*/ var0..31 =4var32..63=8 /*修改*/ var32..63 = 23 /*读取*/ a_hi = var32..64 = 32 a_lo = var0..31 =4var0..31=42

  • 根据体系结构的不同,可能需要内存屏障操作。例如,当mainirq在具有专用缓存的不同内核上运行时,irq将永远不会看到更新值

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

第二个问题也是如此,其中内存障碍也是优化障碍。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54965075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档