为什么在STM32编程中需要无限循环?

nra*_*aud 1 c microcontroller arm stm32 cortex-m

我用C(gcc)编写STM32F4,它是一个ARM Cortex M4,我看到所有的例子都用无限循环完成了main()函数,即使程序的其余部分都是从中断执行的.如果我尝试从程序中删除循环,则中断也会停止.

为什么我不能删除此循环并退出主线程?

这是集会(我猜它是拇指,但我不能读,即使有文档):

LoopFillZerobss:
ldr  r3, = _ebss
cmp  r2, r3
bcc  FillZerobss

/* Call the clock system intitialization function.*/
bl  SystemInit 
/* Call the application's entry point.*/
bl  main
bx  lr    
.size  Reset_Handler, .-Reset_Handler
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 10

看一下之前main在项目中运行的设置代码.它可能是一些细长的汇编代码或更复杂的东西,但一般来说它非常接近初始化堆栈并获得C运行时所需的最小处理器设置量.

如果你回来了main,你的处理器应该做什么?重启?挂?没有一个好的答案,所以你必须查看与你的程序链接的运行时支持代码,看看它的设计师决定了什么.在你的情况下,听起来他们没有任何允许main返回,所以处理器只是崩溃/异常,你的程序停止工作.

编辑:看起来你正在寻找的是一种在空闲循环期间进入低功耗状态的方法.这当然是可能的 - 因为你的处理器是ARM​​ Cortex-M4,有一个简单的指令可以做到这一点:

while (1)
{
    asm("wfi");
}
Run Code Online (Sandbox Code Playgroud)

如果您正在使用CMSIS(并且它看起来像您的使用SystemInit),那么程序集可能已经为您完成了:

while(1)
{
   __WFI();
}
Run Code Online (Sandbox Code Playgroud)

此链接提供更多详细信息.