一、 定义
volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译、读取、存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取存储数据,不做优化,在做嵌入式开发的时候,因为有时变量地址有可能是系统的一个外设地址,他的值的变化并不在程序控制范围内,随时有可能变化,因此需要对他进行声明,每次读取或者存储直接对地址进行操作。
变量如果加了 volatile 修饰,则会从内存重新装载内容,而不是直接从寄存器拷贝内容。
volatile 的作用 是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
二、 使用volatile 的情况
1、并行设备的寄存器(例如状态寄存器)
存储器映射的硬件寄存器通常加volatile。
设备寄存器会在你的程序不知道或者不介入的时候发生改变,那是因为设备寄存器可以被外设硬件修改,相反,变量中的不会变。设备寄存器的内容是易失的,或者在不注意的时候被修改,当声明指向设备寄存器的指针时一定要用volatile,它会告诉编译器不要对存储在这个地址的数据进行假设,编译器在优化这个变量时应该把它看作编译时未知的。
2、一个中断服务子程序中会访问到的非自动变量
3、多线程应用中被几个任务共享的变量
volatile 常见问题
1、一个参数可以是const还可以是volatile吗?
可以。比如只读的状态寄存器。它是volatile因为它可能被意想不到的改变,它是const因为 程序不应该试图去修改它。
2、一个指针可以是volatile吗?
可以。当一个服务中子程序修改一个指向buffer的指针时