我试图在特定的微控制器上运行 WDT(它仍在开发中,我无意中将其作为测试样本)并遇到了一个问题,即要启动 WDT,初始化和 WDT 之间需要有延迟开始。没有为此的标准函数,所以我编写了简单的嵌套循环。
我的期望如下:
它实际上就是这样工作的!
但是,我决定改变
i = 2
,预计不会有重大变化while(i--)
之后,j
仍然是0
,这是我在实验中理解的),但是绿色 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();
}
}
当您在第一次循环后将
i
更改为 2 时,j
不是 0
而是 UINT32_MAX
,因为 j
在测试后会递减,即 4'294'967'295。如果您有 80MHz 时钟并且您的循环在 10 个时钟周期内执行(易失性和 -O3),那么将需要 42'949'672'950
时钟周期来完成您的循环。
如果您的代码是从具有
0
等待状态的 SRAM 执行,则需要大约 536 秒。如果从 FLASH 执行,则需要更长的时间。
如果您不启用优化,那么此循环将运行更长的时间