您当前的位置:首页 > 互联网教程

C语言 中volatile关键字的用法

发布时间:2025-05-12 10:27:55    发布人:远客网络

C语言 中volatile关键字的用法

一、C语言 中volatile关键字的用法

1、这段代码如果没有加上volatile,它的执行过程是 i= 10, 10->reg寄存器,k= reg值,就是说,k=i实际上是从寄存器里读出来的。这样快捷高效,当然并不是每次都这样,因为寄存器有限。如果在10->reg寄存器的时候,i存储的内存变化了,也就是别的线程修改了i的值,k=i仍然会按照i=10来执行

2、加上volatile后,执行过程是 i= 10, k=*(int*)(&i);它会从i的内存地址上去读,当然值会非常准确,但是效率会比从寄存器中读要慢很多。

二、计算机C语言中的关键字:volatile是什么意思

在计算机C语言编程中,volatile关键字用于标识一个变量,表明其值可能会在程序的预期之外发生变化。这意味着,当程序使用到这个变量时,编译器不会对该变量进行寄存器优化,而是在每次使用时都重新读取其当前值,以确保获取到最新的数据。换句话说,volatile关键字确保了编译器不会对这些变量的访问进行优化,而是每次都直接从内存中读取最新值。

使用volatile关键字的情形主要有以下几种:

1.并行设备的硬件寄存器。这些寄存器的值可能由于外部硬件设备的改变而发生变化,因此需要确保每次访问时都从内存中重新读取最新值。

2.中断服务子程序中访问的非自动变量。中断服务子程序可能会修改这些变量的值,因此在主程序中使用这些变量时需要确保获取到最新的值。

3.在多线程应用中被多个线程共享的变量。由于这些变量可能被不同的线程同时修改,因此在使用这些变量时需要确保每次读取的都是最新值,避免数据竞争问题。

总之,volatile关键字主要用于解决内存可见性问题,确保程序能够正确地反映硬件状态或避免多线程环境下的数据竞争。正确地使用volatile关键字对于保证程序的正确性和可靠性至关重要。

值得注意的是,volatile关键字并不会提供对变量值的原子操作保护。如果需要确保对变量的读写操作是原子的,可能还需要使用其他同步机制,如互斥锁。

在实际编程中,合理地使用volatile关键字可以避免许多难以排查的问题,特别是在涉及硬件设备或多线程编程时。因此,对于可能发生变化的变量,使用volatile关键字是一个很好的实践。

三、C语言中的volatile是什么意思

volatile的本意是一般有两种说法--1.“暂态的”;2.“易变的”。

这两种说法都有可行。但是究竟volatile是什么意思,现举例说明(以Keil-c与a51为例

例子来自Keil FQA),看完例子后你应该明白volatile的意思了,如果还不明白,那只好

---------------------------------------------------------------------

unsigned char xdata xdata_junk;

unsigned char xdata*p=&xdata_junk;

0000 7E00 R MOV R6,#HIGH xdata_junk

0002 7F00 R MOV R7,#LOW xdata_junk

;---- Variable'p' assigned to Register'R6/R7'----

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!注意

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

volatile unsigned char xdata xdata_junk;

volatile unsigned char xdata*p=&xdata_junk;

0000 7E00 R MOV R6,#HIGH xdata_junk

0002 7F00 R MOV R7,#LOW xdata_junk

;---- Variable'p' assigned to Register'R6/R7'----

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

比较结果可以看出来,未用volatile关键字时,只从*p所指的地址读一次

如在a处*p的内容有变化,则t2得到的则不是真正*p的内容。

---------------------------------------------------------------------

volatile unsigned char bdata var;// use volatile keyword here

unsigned char xdata values[10];

for(i= 0; i< sizeof(values); i++){

values[i]= var;// without the volatile keyword, the compiler

// assumes that'var' is unmodified and does not

// reload the variable content.

在此例中,如在a处到下一句运行前,var如有变化则不会,如var=0xff;则在

values[i]= var;得到的还是values[i]= 1;

---------------------------------------------------------------------

#define DBYTE((unsigned char volatile data*) 0)

说明:此处不用volatile关键字,可能得不到真正的内容。

---------------------------------------------------------------------

//***************************************************************

//***************************************************************

//***************************************************************

//函数 void v_IntOccured(void)

//***************************************************************

extern void v_IntOccured(void);

//***************************************************************

//***************************************************************

char xdata cvalue1;//全局xdata

char volatile xdata cvalue2;//全局xdata

//***************************************************************

//***************************************************************

void v_ExtInt0(void) interrupt 0{

//***************************************************************

//***************************************************************

//2.在此处仿真时手动产生中断INT0,使cvalue1++; cvalue2++

//4.在此处仿真时手动产生中断INT0,使cvalue1++; cvalue2++

//***************************************************************

//***************************************************************

仿真可以看出,在没有用volatile时,即2处,程序不能进入v_IntOccured();

但在4处可以进入v_IntOccured();