没有用volatile关键字声明的变量在被访问的时候可能直接从cpu的寄存器中取值(因为之前i被访问过,也就是说之前就从内存中取出i的值保存到某个寄存器中),之所以直接从寄存器中取值,而不去内存中取值,是因为编译器优化代码的结果(访问cpu寄存器比访问ram快)。
然而在 串口中断里 Uart2_Get_Data 的值可能被“以外修改”而CPU寄存器的值没变所以出问题了。volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:中断、system、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
按理说凡是在中断里等频繁更新而外部频繁调用的值都应当用volatile进行修饰 .
|