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)
此链接提供更多详细信息.