C语言中的 volatile 关键字

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

汽车ECU设计

C语言中的 volatile 关键字:原文配图 3

一个菜鸟程序猿的成长之路。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 }

编译成汇编的代码如下:

C语言中的 volatile 关键字:原文配图 1

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

C语言中的 volatile 关键字:原文配图 2

编译器将会使用%eax 寄存器的值来暂存 p,从而提高程序运行速度!这样就很明白了,如果这个变量在代码执行的过程中,可能会被外界更改(如中断,寄存器,并发),这个时候我们就要考虑使用 volatile 关键字了,具体情况如下:

  1. 外设寄存器地址映射

  2. 在中断服务程序中修改全局变量

  3. 在多线程、多任务应用中,全局变量被多个任务读写当出现上述情况时,我们要优先考虑使用关键字 volatile,从而避免程序出现莫名其妙的错误。

完

拓展阅读:

早在盘古开天之前 (Main的故事)

C语言 Memory Layout

历史精华文章集合:

【汽车ECU设计】汽车总线文章合集

【汽车ECU设计】Autosar文章合集

【汽车ECU设计】工作思考合集

【汽车ECU设计】第51~100期目录

【汽车ECU设计】第1~50期目录

C语言中的 volatile 关键字:原文配图 4

氨气“ 携手进步 共同成长 ”

编程 · 目录

上一篇 下一篇

RTOS 中的信号量和互斥量 C语言中的 typedef 关键字

阅读原文

← 返回文章列表