使用winavr的过程中,遇到的有关volatile的问题

SIGNAL(SIG_OUTPUT_COMPARE0A)
{

 timecount ++;

}

……

 while(1)
 {
      if(timecount > = 10)
     { 
           R_LED_ON;
           timecount = 0;
           break; 
     }

 }

定时中断设置为2ms一次

程序中有这样两部分,执行完前面一部分后,就会在while循环等待,直到进入十次定时中断后,timecount=10,就执行if,退出while循环,

功能是用于控制整个程序运行大循环的时间。

但实际运行时,通过仿真发现,总是无法进入if语句,

解决办法为将timecount定义时前加volatile或者在makefile中将优化等级设为0;(将优化等级设为0后出现新问题,同样的程序,优化等级为0的,无法正常写入eeprom……设为s的则正常。。。原因不明)

原因分析,数据读取的步骤是从SRAM到寄存器中(此例为R24)然后送入CPU进行运算,timecount的值由于在while循环中未被改动,所以被优化后,由于R24中一直保存着timecount的值,CPU直接从R24中读值,当发生中断时,所有寄存器的值被保存起来入栈,timecount被修改后保存入SRAM中,恢复现场,R24值在CPU看来还是保存的timecount,所以仍然读到的还是修改之前的值。。。。

折腾了好久,这下总算意识到volatile关键字的重要性了。

posted on 2011-08-16 16:50  dusts  阅读(490)  评论(0)    收藏  举报

导航