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

STM32八股【9】-----volatile关键字

一句话:

主要是为了防止编译器优化导致无法得到最新的值。主要用于以下三处:
1.在中断中修改访问的变量。
2.多任务(线程)共享的变量。
3.硬件寄存器变量

问题

嵌入式程序中常出现变量值改变但代码未正确响应的现象

原因

编译器优化策略导致异常行为:

  • 将频繁访问的变量缓存在寄存器中
  • 删除看似冗余的内存读取操作
  • 对循环中的变量进行推测性优化
uint32_t* status_reg = 0x40021000;
while (*status_reg & 0x01) {  // 编译器可能只读取一次寄存器值// 等待状态位变化
}

编译器默认假设变量内容在单线程内不会自发改变
然而实际上:

  • 外部中断或其他线程可能改变状态位
  • 设备自动更新寄存器内容
  • 多核系统中其他处理器可能修改

解决办法

应用场景规范:

  • 内存映射硬件寄存器必须声明为volatile
  • 被多个执行流共享的全局变量(主程序/中断服务程序)声明为volatile
  • 信号处理程序修改的全局变量
http://www.dtcms.com/a/198927.html

相关文章:

  • 学习!FastAPI
  • ubuntu安装vmware启动虚拟机失败
  • 计算机组成与体系结构:缓存一致性(Cache Coherence)
  • 第四章:WebSocket 通信机制全解与客户端发包实录
  • BOM知识点
  • 线程池学习笔记
  • Linux系统编程——system函数和popen函数的使用方法以及区别
  • 三维重建(二十三)——各种参数的测试(废案)
  • IIS入门指南:原理、部署与实战
  • 容器化:用于机器学习的 Docker 和 Kubernetes
  • SRIO(Serial RapidIO)握手流程
  • 算符优先分析之输入串分析
  • 【深度学习】残差网络(ResNet)
  • python学习day29
  • Neovim 如何安装和配置缩进标识插件 indent-blankline.nvim
  • 贝塞尔曲线原理
  • Manus vs Lovart:AI Agent技术深度解析与实战指南
  • MyBatis框架(入门)
  • Arduino UNO采集血压/心率/血氧/体温等数据传输到Blinker云平台 手机APP显示数据
  • 【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析
  • 计算机系统---TPU(张量处理单元)
  • Java——创建多线程的四种方式
  • 【大模型面试每日一题】Day 22:若训练中发现Loss突然剧烈波动(Spike),可能有哪些原因?如何定位和修复?
  • MySQL之储存引擎和视图
  • C语言:在 Win 10 上,gcc 如何编译 调用 Tcl/Tk 的C程序
  • Hugo安装Stack主题
  • DAY 4 缺失值的处理
  • Spring ioc和Aop
  • 【ROS2】虚拟机使用fishros脚本一键安装humble
  • Codeforces 1017 Div4(ABCDEFG)