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

本文深入探讨了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关键字的重要性了。

转载于:https://www.cnblogs.com/dusts/archive/2011/08/16/2140800.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值