keil里while跳不出循环可能原因

2 篇文章 0 订阅

keil里while跳不出循环可能原因

  keil里while循环条件A已经在中断中修改为假,却跳不出去循环的可能原因,可能编译器的优化导致。

while(A)
{
	...
}

  在你进入循环的时候,实际上是将A从内存加载到寄存器里面运行的,在整个循环中,A这个变量都只是在读取寄存器里面的值。
  当进入中断的时候,中断里面会从内存加载A到寄存器,修改完之后又存到内存里,然后退出中断,再回到循环里面。但这个时候循环里使用的A并没有重新从内存加载A这个变量,所以一直都在循环里面。

解决方法:

  A定义前加上volatile,详细理解自行查找volatile的用法。
  volatile应该解释为“直接存取原始内存地址”比较合适,“易变的”这种解释简直有点误导人。(参考百科)
  一般说来,volatile用在如下的几个地方:
  1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
  2、多任务环境下各任务间共享的标志应该加volatile;
  3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2 中可以禁止任务调度,3中则只能依靠硬件的良好设计了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值