[笔记]C语言关键字volatile的作用

写在前面

C语言关键字volatile的作用,总结,笔记

前两天面试的时候被问到C语言关键字volatile的作用,一时答不上来,这个关键字以前有在程序中见到过,有印象但是不深刻,在日常的单片机程序开发中也很少使用到。

然后上网查了下,发现有人和我一样的经历

“我在网上看见一个帖子说回答不出这个问题的人是不会被雇佣的。这是区分C程序员和嵌入式系统程序员的最基本的问题。”

volatile关键字用于声明那些可能会有意想不到的改变的变量,这个变量可能会被意想不到的改变。由于访问寄存器中数据比访问内存中的数据速度快,因此编译器一般会优化而减少访问内存,如果变量改变则数据会出错,所以使用volatile声明变量,则编译器每次都重新从内存读取变量数据,而不是使用保存在寄存器里的备份。总的来说,我们不能确保寄存器中的数据一定不会改变,则需要使用volatile。

从如下的例子中来看:

1
#define rURXH0 (*(volatile unsigned char *)0x50000024) //UART 0 Receive buffer

0x50000024是地址,如果没有将这个地址强行转换位volatile,那么我们在使用rURXH0时,可能直接从CPU的寄存器中读取数据。因为之前rURXH0被访问过,之前从内存中取出的rURXH0的值被保存在某个寄存器中,由于编译器优化的结果,会直接从寄存器中读取rURXH0的值,不去内存读取。使用volatile进行强行转换之后,执行结构每次读取数据都会去内存中读取而不是去寄存器中读取。

volatile关键字降低编译器的优化度,但是确保了程序的正确性。


参考文献

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×