以前用volatile只是用来定义寄存器变量,也听说多进程编程需要用到这个,一直没有深刻体会。
今天,通过编译器高级优化,终于发现volatile的重要性了。
问题主要是在给UC864模块开机过程中等待时发生的。
close_mobile_time=0;
while(close_mobile_time<20);
两句话,简单地等到close_mobile_time变量自加超过20次,close_mobile_time变量在15ms时钟中断中自加1.
如果,编译器不优化,CPU每次都会从close_mobile_time变量的地址处取来该值,程序运行正常。
如果采用编译器优化,编译器以为close_mobile_time一直为0,因为2句语句之间没有对close_mobile_time产生影响的语句,所以,在while循环中直接省去了close_mobile_time与20的比较,汇编代码之间编程了跳转到while的语句,即进入了死循环,而close_mobile_time在中断中还是不停地自加。
所以,在声明close_mobile_time变量时,加入volatile关键字,即让编译器不对close_mobile_time变量进行优化,每次取值都从RAM中实际去取该变量的值,这样程序运行就正常了。