C语言中的 volatile 关键字
在嵌入式软件的代码中,我们常常会见到关键字 volatile,说实话这个关键词经常在代码中见到,但是也没有使用过。昨天心血来潮地研究了一下,今天和大家一起分享一下。
汽车ECU设计

一个菜鸟程序猿的成长之路。116篇原创内容
公众号本文共700字,预估阅读时3分钟volatile 的本意是“易变的” 。因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用 volatile,则编译器将对所声明的语句进行优化。下面我们来举个例子:
1 volatile int p = 5;
2 int total = 0;
3 void main(){
4 int a = p;
5 int b = p;
6 total = a + b;
7 }
编译成汇编的代码如下:

可以看到,编译器当使用变量p的值总是从内存地址中读取。如果我们去掉关键词 volatile ,代码就变成了这个样子!

编译器将会使用%eax 寄存器的值来暂存 p,从而提高程序运行速度!这样就很明白了,如果这个变量在代码执行的过程中,可能会被外界更改(如中断,寄存器,并发),这个时候我们就要考虑使用 volatile 关键字了,具体情况如下:
-
外设寄存器地址映射
-
在中断服务程序中修改全局变量
-
在多线程、多任务应用中,全局变量被多个任务读写当出现上述情况时,我们要优先考虑使用关键字 volatile,从而避免程序出现莫名其妙的错误。
完
拓展阅读:
历史精华文章集合:

氨气“ 携手进步 共同成长 ”
编程 · 目录
上一篇 下一篇
RTOS 中的信号量和互斥量 C语言中的 typedef 关键字
阅读原文