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

时间:2013-04-27 17:36:33

标签: c arm microcontroller 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

2 个答案:

答案 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