# 警惕!主循环中断共用全局变量不添加volatile的隐患
在电机控制系统中,全局变量的正确使用对于系统稳定性和性能至关重要。本文将探讨在主循环和中断同时修改全局变量speed_ref而未添加volatile关键字时可能产生的后果,并给出解决方案。
问题原因分析
- 编译器优化: 在标准C语言中,不加
volatile的变量在编译器优化过程中可能会被视为非易失性,导致其读操作被提升到循环外部,或直接使用寄存器缓存的值。 - 不同执行上下文: 主循环和中断是两种不同的执行上下文,中断可能异步修改
speed_ref,而主循环则可能在稍后读取,这时如果编译器没有正确处理speed_ref的读写,就可能读取到旧值。
解决方案
- 添加volatile关键字: 将全局变量
speed_ref声明为volatile可以告知编译器,这个变量可能会在任何时间被改变,防止其进行不当的优化。 - 代码示例:
```c
volatile int speed_ref = 0;
void main_loop() {
// 主循环逻辑
if (speed_ref < some_threshold) {
// 执行操作
}
}
void interrupt_handler() {
// 中断服务程序
speed_ref = new_speed_value;
}