ARM Cortex-M3启动代码



我正在努力了解用于STM32微控制器的Keil(realview v4)附带的初始化代码是如何工作的。具体来说,我正在尝试了解堆栈是如何初始化的。

在ARM网站上的文档中,它提到startup_xxx.s中的一个例程__user_initial_stack_heap使用的堆栈不应超过88字节。你知道这种限制是从哪里来的吗?

当重置处理程序调用System_Init时,它似乎在C环境中执行了几个函数,我认为这意味着它使用了某种形式的临时堆栈(它分配了一些自动变量)。然而,一旦它返回并调用__main__user_initial_stack_heap的调用源),所有这些堆栈项都应该在作用域之外。

那么,为什么__user_initial_stack_heap需要使用不超过88个字节呢?__main的其余部分是否使用了大量堆栈?

任何关于cortex-m3堆栈体系结构的解释,因为它与启动序列有关,都是非常棒的。

您将从__user_initial_stackheap()文档中看到,该函数用于遗留支持,并且已被__user_setup_stackheap()取代;后者的文档为你的问题提供了线索:

与__user_initial_stackheap()不同,__user_setup_stackheap()适用于系统,其中应用程序以已经正确的sp(r13)值开始,例如Cortex-M3

[..]

使用__user_setup_stackheap()而不是__user_initial_stackheap()可以提高代码大小,因为不需要临时堆栈

在Cortex-M上,sp在硬件根据存储在矢量表中的值重置时进行初始化,而在较旧的ARM7和ARM9设备上,情况并非如此,有必要在软件中设置堆栈指针。在应用用户定义的堆栈之前,启动代码需要一个小堆栈来使用-例如,如果用户堆栈在外部存储器中,并且在初始化存储器控制器之前无法使用,则可能会出现这种情况。施加88字节的限制只是因为临时堆栈的大小尽可能小,因为它在启动后可能未使用。

在您使用STM32(Cortex-M设备)的情况下,事实上可能没有这样的限制,但您可能应该更新启动代码以使用更新的功能。也就是说,考虑到这个函数所需的行为以及它的结果在寄存器中返回的事实,我建议如果你需要那么多,88字节将是相当奢侈的!此外,您只需要在使用分散加载文件时重新实现它,如前所述。

最新更新