首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARM Cortex-M3启动代码

ARM Cortex-M3启动代码
EN

Stack Overflow用户
提问于 2014-10-30 01:18:10
回答 1查看 3.3K关注 0票数 2

我试图了解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堆栈结构的任何解释都将是非常棒的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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个字节将是相当奢侈的!此外,如果您使用的是如上所述的分散加载文件,则只需要重新实现它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26643465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档