volatile修饰符在C语言中的用法
本文章将讨论volatile这个修饰符在C语言中的使用。了解这个修饰符的程序员都知道,最为一个指令关键字,其作用是确保指令本身不会受到编译器的优化而产生未知的程序bug。对此,本文将结合嵌入式中C语言的实际运用来详细讲解。
volatile关键字告诉编译器,这个变量可能在任何时刻都会被改变。有时变量的改变对编译器来说有点“隐蔽”,也许就是这种隐蔽让编译给我们的程序造成了一些未知的bug。
语法:
首先我们来看看volatile的使用方法,通过下面的两种方法实现对int变量的修饰;
ü int volatile var;
ü volatile int var;
当然如果要修饰一个指针变量可以如下
ü int volatile * pointer;
ü volatile int * pointer;
就C语言中的使用volatile来说,一般我们会在一下三种情况中使用volatile关键字
? 映射的外设SFR(Special Function Register)
? 在中断服务函数中修改全局变量
? 在多线程中修改的全局变量
特殊功能寄存器:
在嵌入式偏硬件方面的程序,我们经常要控制一些外围硬件设备,就拿最简单的I/0端口来说,我们会去操作映射到对应IO端口的寄存器。
假设某一个寄存器的地址为0x1234,在C语言中,我们可以定义一个指针指pReg向这个地址:
unsigned int * pReg = (unsigned int *)0x1234;
在实际运用中(例如uart、ADC等等)ÿ