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关键字的重要性了。