admin管理员组

文章数量:1532657

2024年6月22日发(作者:)

C语言中volatile的含义

C语言中volatile的含义

通常在程序中申明了一个变量时,编译器会尽量把它存放在

通用寄存器中,例如ebx。当CPU把其值放到ebx中后就不会再

关心对应内存中的值。若此时其他程序(例如内核程序或一个中

断)修改了内存中它的值,ebx中的值并不会随之更新。为了解

决这种情况就创建了volatile限定词,让代码在引用该变量时一

定要从指定位置取得其值。

关键字volatile有什么含意?并给出三个不同的例子。 一个

定义为volatile的变量是说这变量可能会被意想不到地改变,这

样,编译器就不会去假设这个变量的值了。精确地说就是,优化

器在用到这个变量时必须每次都小心地重新读取这个变量的值,

而不是使用保存在寄存器里的备份。下面是volatile变量的几个

例子:

1. 并行设备的硬件寄存器(如:状态寄存器)

2. 一个中断服务子程序中会访问到的非自动变量Non-

automatic variables

3. 多线程应用中被几个任务共享的变量

回答不出这个问题的人是不会被雇佣的。我认为这是区分C

程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员

经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile

变量。不懂得volatile内容将会带来灾难。

假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这

样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile

完全的重要性。

1. 一个参数既可以是const还可以是volatile吗?解释为什

么。

2. 一个指针可以是volatile 吗?解释为什么。

3. 下面的函数有什么错误:

int squarevolatile int *ptr

return *ptr * *ptr;

下面是答案:

1. 是的。一个例子是只读的状态寄存器。它是volatile因为

它可能被意想不到地改变。它是const因为程序不应该试图去修

改它。

2. 是的。尽管这并不很常见。一个例子是当一个中服务子程

序修该一个指向一个buffer的指针时。

3. 这段代码的有个恶作剧。这段代码的目的是用来返指针

*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,

编译器将产生类似下面的代码:

复制代码 代码如下:

本文标签: 变量代码寄存器