在编写嵌入式驱动的时候,经常要用到或看到volatile关键字,刚开始写驱动的时候,需要读取数据的时候,因为没有利用volatile关键字,导致没能正确的读取内容,后来查代码的时候才发现问题。
volatile关键字的主要目的就是告知编译器,对于所定义的变量不需要优化,也就是当第一次用到这个变量的时候,编译器会将这个变量存储在一个寄存器中,当再次利用的时候,不会去RAM中取,而是直接从寄存器中拿,这样虽然速度快了,但是有可能在RAM中内容已经改变了,但是寄存器存的并没有改变,这样就会导致读到得数据并不是我们想要的。利用volatile关键字,就是要告知编译器,每次都要重新读取这个值,不要用寄存器中的值。
网上这些解释都比较多,不过多数都是转来转去的,其中有一些还是不错的,下面得link是我觉得不错的。http://blog.21ic.com/user1/2949/archives/2007/35599.html
volatile主要应用在如下几种情况:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
在上面的链接中有提到 “一个参数既可以是const还可以是volatile吗?解释为什么。”其实我觉得const就是告诉程序员你所定义的这个东西,不要再重新赋值改变他原来的内容,而volatile是这片内存里内容可能会变化,因此两者可以一起用。