1
3
每一个建筑都有自己的方式。ARM Cortex uCs将初始堆栈指针位置存储为向量表中的前32位值。该值在uC启动时由硬件加载。所以这个地址完全由程序员控制。 然后启动例程可以更改它或设置双堆栈(一个用于线程,另一个用于特权模式)。 |
2
1
RAM中的堆栈位置几乎总是可以通过软件进行配置。在特定于工具链的链接器脚本中,将有一个名为
在任何启动代码中要做的第一件事就是设置堆栈指针。它必须通过汇编程序完成,因为C无法直接写入堆栈指针。在一些内核(如ARM)上,堆栈指针是由硬件自动设置的,该值由链接器脚本放置在向量表中并在flash中编程得到。 所以一般来说,硅供应商几乎总是把这完全交给程序员来决定。然而,核心确实指定了是有递增计数堆栈还是递减计数堆栈。到目前为止,最常见的是向下计数,但一些古怪的架构有向上计数堆栈(最著名的是PIC)。 至于堆栈指针的设置位置,如果启动代码(“CRT”)随工具链一起提供,那么您很早就会在启动代码(“CRT”)中找到它。通常,它采用从链接器脚本获得的值,但如果愿意,也可以对其进行硬编码。这需要在执行任何C代码之前完成,因为C喜欢使用堆栈。 如果您自己编写所有内容,那么应该从重置向量内部将重置后要做的第一件事写入堆栈指针。 |
conopizda2 · 为什么我的静态数组没有被memset清除? 2 年前 |
jhe4x · C按位OR返回的值不正确 2 年前 |
Tim · 如何用c语言打印程序的执行流程# 6 年前 |
jatinBatra · 关于嵌入式固件开发[已关闭] 6 年前 |
Will · 嵌入链接器脚本-是否正确放置“堆栈”和“堆”区域? 6 年前 |
K. Crow · 不等于PIC32上启用中断时操作员不工作[关闭] 6 年前 |
spiff42 · 清除位时唯一的最大不同字节值集 6 年前 |