我试图了解Keil (realview v4)附带的用于STM32微控制器的初始化代码是如何工作的。具体来说,我试图了解堆栈是如何初始化的。
在ARM网站上的文档中,它提到了startup_xxx.s中的一个例程__user_initial_stack_heap不应该使用超过88个字节的堆栈。你知道这个限制是从哪里来的吗?
看来,当重置处理程序调用System_Init时,它在C环境中执行一对函数,我认为这意味着它使用某种形式的临时堆栈(它分配了一些自动变量)。但是,一旦返回,所有这些堆栈项都应该超出作用域,然后调用__main,这是调用__user_initial_stack_heap的地方。
那么,为什么__user_initial_stack_heap不能使用超过88个字节呢?__main的其余部分是否使用了大量的堆栈之类的东西?
对与启动顺序相关的皮层-m3堆栈结构的任何解释都将是非常棒的。
发布于 2014-10-30 09:45:26
您将从堆栈()文档中看到,该函数用于遗留支持,并被堆栈()取代;后者的文档为您的问题提供了一个线索:
与__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个字节将是相当奢侈的!此外,如果您使用的是如上所述的分散加载文件,则只需要重新实现它。
https://stackoverflow.com/questions/26643465
复制相似问题