volatile 英[ˈvɒlətaɪl] 本意是易变的。在C语言中是一种类型修饰符。
寄存器的读/写速度是远大于内存单位的读写的,编译器一般会选择把数据放在寄存器中二减少对内存单位的读写,从而可能读取到脏数据,即错误数据。
volatile 本质来说就是为了防止编译器对代码进行优化而没有执行指令或者执行有误!
单纯这样说,可能还是不够直观,举个例子,比如说我们常用到的IO口模拟单片机时序,来看一下下面的伪代码:
/*volatile*/ int *pPTA0_OUT = 0x400FF000u;
*pPTA0_OUT = 1;
*pPTA0_OUT = 0;
看第一句,如果不加volatile
修饰的时候,编译器会认为两次对地址0x400FF000u
进行写操作,而两次写入之间没有读取该地址的数据,认为第一次写入是无效的,故而忽略第一次的写入指令!
对于时序,这样的忽略也许就是致命的。
所以这种时候就很有必要加入volatile
关键字了!