volatile 一般用在定义变量前,如:
volatile int count;
作用是每次访问该变量时,强制访问该变量的真实内存。
使用场景:
1.用volatile对抗编译器优化。
2.中断服务程序(ISR)中,修改的变量需要声明为volatile,确保主程序每次读取最新的状态。
3.内存映射寄存器中,硬件寄存器的值可能随时变化。
4.const volatile联合使用,可声明“程序内部不可修改,但外部可能变化”的变量,适用于只读硬件寄存器
注意:volatile不等于线程安全,也不等于原子操作!
volatile只能保证变量访问不被编译器优化;volatile不能保证多个执行流同时访问变量时一定安全。
如果中断和主循环都要修改同一个变量,并且操作不是简单赋值,而是读改写操作,就需要考虑临界区、关中断、原子操作,或者在RTOS中使用互斥锁、队列等同步机制。