当前位置: 首页 > article >正文

开发中需要使用到volatile的情况

变量读写操作是 将变量写进一个内存,然后在内存中加减,最后再把内存里的值赋值给变量。如下图:变量bCanUse进行减一操作。

1.首先bCanUse写入一个叫R0的寄存器

2.在R0中减一

3.将R0的值写入bCanUse

在多个函数中:

函数是有顺序的,要也就是在一个函数会彻底执行完,就是内存的值会最终回给变量,函数B就会从这个变量读取到另一个内存,这个内存的值是正确的。

在freertos的多线程或者多任务中(需要volatile):

函数是轮询执行的,变量x假如在函数A中执行,虽然在内存中加减,但是可能执行一半就到函数B去执行,而变量x的值并没有改变,因为函数A没有执行完(内存的值没有赋值到变量x,也就步骤三没有执行完成)。那么函数B用到的变量x的值还是最初的值。

1. 硬件寄存器访问

硬件寄存器的值可能被硬件设备修改,而编译器无法感知这种修改。因此,访问硬件寄存器时需要使用 volatile

示例:访问 GPIO 寄存器

  • 说明
    GPIO_DATA 是硬件寄存器的地址,其值可能被硬件修改。使用 volatile 确保每次访问都从内存读取或写入。

2. 中断服务程序(ISR)中的变量

如果变量在 ISR 中被修改,而在主程序或其他函数中访问该变量,则需要 volatile

示例:ISR 修改的变量

  • 说明
    flag 在 ISR 中被修改,而主程序中访问 flag。使用 volatile 确保主程序每次访问 flag 时都从内存读取最新值。

3. 多任务模拟中的共享变量

在裸机开发中,可能会通过状态机或轮询模拟多任务。如果多个任务共享变量,且没有使用同步机制,则需要 volatile

示例:多任务模拟

  • 说明
    sharedVar 被两个任务共享,但没有使用同步机制。使用 volatile 确保任务 2 每次访问 sharedVar 时都从内存读取最新值。


http://www.kler.cn/a/548790.html

相关文章:

  • 【大模型系列】入门常识备忘
  • IT行业方向细分,如何做到专家水平——7.边缘计算与物联网(IoT)
  • 算法刷题--哈希表--字母异位词和两个数组的交集
  • 从短片到长片:王琦携《Mountain》续作迈向新高度
  • Python进制转换
  • 智能设备监控:AI 与 Python 助力设备管理的未来
  • Substance Painter快捷键
  • 【AJAX】项目——数据管理平台
  • LabVIEW的吞雨测控系统
  • 【鸿蒙】ArkUI-X跨平台问题集锦
  • 虚拟机安装k8s集群
  • RFID技术在制造环节的应用与价值
  • 中缀表达式转后缀表达式(逆波兰表达式)并进行计算
  • Transformer 模型介绍(四)——编码器 Encoder 和解码器 Decoder
  • redis cluster测试
  • 基于Istio Ambient Mesh的无边车架构:实现零侵入式服务网格的云原生革命
  • Android remount failed: Permission denied 失败解决方法
  • 【前端框架】Vue 3组件生命周期钩子的使用场景
  • 3.5 企业级AI Agent运维体系构建:从容器化部署到智能监控的工业级实践指南
  • 基于单片机的日程管理系统设计