1

我正在用 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
4

2 回答 2

10

查看之前main在您的项目中运行的设置代码。它可能是一些精简的汇编代码或更复杂的东西,但通常它非常接近初始化堆栈和启动 C 运行时所需的最低处理器设置量。

如果您从 回来main,您的处理器应该做什么?重置?悬挂?没有一个好的答案,因此您必须查看与您的程序链接的运行时支持代码,以了解其设计者的决定。在您的情况下,听起来他们没有为main返回做任何准备,因此处理器只是崩溃/发生异常并且您的程序停止工作。

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

while (1)
{
    asm("wfi");
}

如果您使用的是 CMSIS(鉴于您使用了 CMSIS,看起来您是SystemInit),组装可能已经为您完成:

while(1)
{
   __WFI();
}

更多细节在这个链接

于 2013-04-27T17:42:24.947 回答
0

您没有在操作系统上运行。main() 和其他函数一样只是一个函数,它从调用它的位置返回。像这样的裸机系统虽然不是操作系统。因此,如果您的软件都是中断驱动的并且 main() 只是用于设置,那么您需要将处理器保持在无限循环或低功耗模式下的受控状态。您可以在 main() 的末尾或调用任何设置函数或调用 main 的程序集中执行此操作:

bl main
b . ;@ an infinite loop

或者如果你想在那里使用无线网络:

bl main
xyz:
wfi
b xyz
于 2013-04-28T14:46:15.987 回答