关于keil中,while循环条件不成立却无法跳出的问题

如下图中的while循环

其中变量 如下定义

static uint8_t nb_uart_tx_done = 0;

且在中断中将其赋值1,发现当中断中已经赋值,这个while也跳转不出来,如下是仿真观察到的变量和while不跳出情形

查阅资料发现是这么个情况:

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

解决方法:
  nb_uart_tx_done 变量的定义前加上volatile,详细理解自行查找volatile的用法。

static volatile uint8_t nb_uart_tx_done = 0;

  如此一来就不会有前面的加载到寄存器的问题了
  一般说来,volatile用在如下的几个地方:
  1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
  2、多任务环境下各任务间共享的标志应该加volatile;
  3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2 中可以禁止任务调度,3中则只能依靠硬件的良好设计了。