前言
我本人之前一直是写Windows程序的,最近由于公司项目的原因开始接触嵌入式程序。我发现在嵌入式程序中,volatile关键字用的很多,在写Windows程序时,我几乎没用过该关键字,只知道它是防止代码优化的。这篇文章就简要说下该关键字的作用。
一、volatile关键字怎么用
volatile关键字只能修改变量,不能修饰函数。如下
volatile int flag=0;
int volatile flag=0;
二、volatile使用场景
1.中断
在嵌入式编程中,经常有以下的场景。在中断函数中设置全局变量的值,在周期调用函数中,根据该全局变量执行不同的操作。也就是说通过该全局变量传递,中断到达的事件。
代码如下(示例):
bool isrFlag = false;
void task()
{
while(!isrFlag)
{
//do something
}
//do other thing
}
interrupt void io_isr
{
isrFlag=true;
}
上面的代码,在没有做代码优化的情况下,会运行的非常好。
但是加了代码优化,就会出现task一直在while循环里执行,不会跳到//do other thing的部分。
出现以上情况的原因是,编译器判断while循环是个死循环,因为!isrFlag条件一直成立。
编译器就将其优化成不判断条件,一直循环执行//do something.
这个时候就需要volatile关键字,修饰isrFlag。告诉编译器关于isrFlag变量的代码,不要做优化,老老实实的每次去读变量的值,进行条件判断。
2.多线程
多线程跟以上中断的情况类似,当使用全局变量作为多线程同步的手段时,再有代码优化的存在,就会出现中断中一样的情况。再次不做赘述。
总结
根据上面的描述可以看出,volatile关键字是跟代码优化息息相关的。如果没有编译器代码优化,就没有volatile关键字。但是也不要因噎废食,就不要代码优化了。代码优化的存在,可以提升代码效率,提高内存使用率等好处。做好volatile及代码优化的平衡即可。