STM32八股【9】-----volatile关键字
一句话:
主要是为了防止编译器优化导致无法得到最新的值。主要用于以下三处:
1.在中断中修改访问的变量。
2.多任务(线程)共享的变量。
3.硬件寄存器变量
问题
嵌入式程序中常出现变量值改变但代码未正确响应的现象
原因
编译器优化策略导致异常行为:
- 将频繁访问的变量缓存在寄存器中
- 删除看似冗余的内存读取操作
- 对循环中的变量进行推测性优化
uint32_t* status_reg = 0x40021000;
while (*status_reg & 0x01) { // 编译器可能只读取一次寄存器值// 等待状态位变化
}
编译器默认假设变量内容在单线程内不会自发改变
然而实际上:
- 外部中断或其他线程可能改变状态位
- 设备自动更新寄存器内容
- 多核系统中其他处理器可能修改
解决办法
应用场景规范:
- 内存映射硬件寄存器必须声明为volatile
- 被多个执行流共享的全局变量(主程序/中断服务程序)声明为volatile
- 信号处理程序修改的全局变量