为什么使用嵌套循环会导致程序卡住?

问题描述 投票:0回答:1

我试图在特定的微控制器上运行 WDT(它仍在开发中,我无意中将其作为测试样本)并遇到了一个问题,即要启动 WDT,初始化和 WDT 之间需要有延迟开始。没有为此的标准函数,所以我编写了简单的嵌套循环。

我的期望如下:

  • 初始化外设后,
  • 绿色LED亮起(表示功能已生效),
  • 然后出现延迟,
  • 绿色 LED 熄灭,
  • WDT 开始,并且
  • 红色 LED 无限循环亮起。
  • 然后WDT完成倒计时,重置控制器,一切重新开始。

它实际上就是这样工作的!

但是,我决定改变

i = 2
,预计不会有重大变化
(在第一个
while(i--)
之后,
j
仍然是
0
,这是我在实验中理解的),
并且延迟时间应该改变一定数量的时钟周期,这应该不会被我注意到,并且我仍然应该观察两个 LED 的闪烁。

但是绿色 LED 没有关闭,红色 LED 没有打开。

你能告诉我可能是什么问题吗?是跟C语言、编译器有关,还是跟单片机有关?

这是代码:

int main()
{
    volatile uint32_t i=1;
    volatile uint32_t j=1000000;;

    setup();
    GREEN_LED_OFF();
    RED_LED_OFF();
    WDT_Init();
    GREEN_LED_ON();
    while(i--)
    {
        while(j--)
        {

        }
    }
    GREEN_LED_OFF();
    HAL_WDT_Start(&hwdt, 100);
    while(1)
    {
        RED_LED_ON();
    }
}
c while-loop microcontroller
1个回答
0
投票

当您在第一次循环后将

i
更改为 2 时,
j
不是
0
而是
UINT32_MAX
,因为
j
在测试后会递减,即 4'294'967'295。如果您有 80MHz 时钟并且您的循环在 10 个时钟周期内执行(易失性和 -O3),那么将需要
42'949'672'950
时钟周期来完成您的循环。

如果您的代码是从具有

0
等待状态的 SRAM 执行,则需要大约 536 秒。如果从 FLASH 执行,则需要更长的时间。

如果您不启用优化,那么此循环将运行更长的时间

© www.soinside.com 2019 - 2024. All rights reserved.