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

it2023-07-10  79

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中则只能依靠硬件的良好设计了。

最新回复(0)