添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

之前在做EFM32TG的一个项目时,遇到了一个问题,while循环条件为假却还是一直在循环里面无法退出,代码如下:

/***************************************************************************//**
* @brief Delays number of msTick Systicks (typically 1 ms)
* @param dlyTicks Number of ticks to delay
******************************************************************************/
void TickDly(uint32_t dlyTicks)
{
uint32_t curTicks;

curTicks = msTicks;
while ((msTicks - curTicks) < dlyTicks) ;
}

函数功能很简单就是一个毫秒延时,变量msTick在滴答中断中每毫秒自增1。

经过查找资料和跟网友的交流谈一下自己对这个问题的理解:

当进入循环的时候,CPU是把msTick是从内存加载到寄存器中运行的,中断发生的时候同样是把msTick加载到寄存器赋值后在存到内存中,最后退出中断在回到循环中。所以msTick对应的内存值已经发生改变,但循环里面却没有重新从内存中加载变量的值导致循环里面msTick的值并没有发生改变所以无法退出循环。

解决方法就是在msTick加上volatile关键字修饰,这样编译后的程序在msTick变量发生改变的时候就会直接从变量地址中加载该变量的值。

笔者把公司里面很古老的一套程序从IAR的编译环境移植到KEIL环境下,启动文件等问题全部都解决了,能正常编译了。但是卡在了一个 while (send_flag)的一个 循环 里面。send_flag,是中断里面的一个发送完成标志,在中断里面,发送完成后,该标志位在终端里面置0,可是 退出 中断后,在变量观察窗口send_flag已经变成了0了,可是程序就是跳 出去。卡死在 while 循环 。 2、原因...
Java中实现 while 循环 出去的技巧 作为一名经验丰富的开发者,我经常被问到如何在Java中实现一个无法 跳出 while 循环 。这个问题听起来可能有些奇怪,因为在大多数情况下,我们希望 循环 能够根据 条件 跳出 。然而,有时候我们确实需要一个永 停止的 循环 ,比如在某些服务器应用程序或持续运行的后台任务中。 首先,让我...
while 表达式: &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;语句 当程序执行到 while 语句时,首先计算“表达式”的值,如果“表达式”的值为 ,那么结束整个 while 语句。如果“表达式”的值为真,则执行“语句”,执 statement(s); 在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。condition 可以是任意的表达式,当为任意非零值时都为真。当 条件 为真时执行 循环 。 当 条件 时,程... 循环 结构存在以下两个特点: 1. 循环 是无休止进行的,满足一定 条件 时, 循环 才会继续,称之为“ 循环 条件 ”。 2. 循环 是反复执行相同类型的一系列操作,称为“ 循环 操作”或“ 循环 体”。 到底什么是 while 循环 呢??????????? while 循环 是Java语言中比较常用的 循环 结构之一,先判断 循环 条件 ,再执行 循环 操作语句。 while 循环 语法: while ( 循环 条件 ) 循环 操作; 注意!!!! 这里的`condition`是一个布尔表达式,如果它的值为`true`,则 循环 会一直执行 循环 体内的代码,直到`condition`变为`false`。当`condition`为`false`时, 循环 就会自然地停止,因为这是` while ` 循环 设计的 退出 条件 。 如果你想要确保即使`condition`一开始就是`false`, 循环 会执行任何操作并直接结束,你可以将初始状态设置为`condition`为`false`,或者在` while ` 循环 外检查并设置这个 条件 : ```java boolean shouldContinue = false; while (!shouldContinue) { // 初始为 继续 if (someCondition) { // 如果满足某个 条件 ,则改变shouldContinue shouldContinue = true; // 设置为true,进入 循环 // 这里 循环 会被执行,因为初始时shouldContinue为false 但是常规情况下,` while ` 循环 的目的是在某些 条件 满足时持续执行,所以`condition`为 会造成 循环 跳出 ”的问题。如果确实需要在一开始就结束 循环 ,可以考虑使用`if`语句提前判断。