我正在用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
答案 0 :(得分:10)
查看项目中main
之前运行的设置代码。它可能是一些细长的汇编代码或更复杂的东西,但一般来说它非常接近初始化堆栈并获得C运行时所需的最小处理器设置量。
如果您从main
返回,您的处理器应该做什么?重启?挂?没有一个好的答案,所以你必须查看与你的程序链接的运行时支持代码,看看它的设计师决定了什么。在你的情况下,听起来他们没有允许main
返回,所以处理器只是崩溃/异常,你的程序停止工作。
编辑:看起来你正在寻找的是一种在空闲循环期间进入低功耗状态的方法。这当然是可能的 - 因为你的处理器是ARM Cortex-M4,有一个简单的指令可以做到这一点:
while (1)
{
asm("wfi");
}
如果你正在使用CMSIS(看起来你是这样的,考虑到你使用SystemInit
),那么程序集可能已经为你完成了:
while(1)
{
__WFI();
}
this link的更多详情。
答案 1 :(得分:0)
您没有在操作系统上运行。 main()只是一个与其他函数一样的函数,它从调用它的地方返回。使用这样的裸机系统虽然不是操作系统。因此,如果您的软件全部是中断驱动且main()仅用于设置,那么您需要将处理器保持在无限循环或低功耗模式的受控状态。您可以在main()的末尾或调用的任何设置函数或调用main的程序集中执行此操作:
bl main
b . ;@ an infinite loop
或者如果你想在那里使用wfi:
bl main
xyz:
wfi
b xyz