5

对于带有 C 启动代码的微控制器和嵌入式系统而言,C 启动代码的功能之一是初始化堆栈指针。

这个初始栈指针地址和C启动代码一般都是芯片厂商定义和提供的吗?

还是由我们作为固件/软件开发人员手动修改或创建 C 启动代码并指定堆栈指针?这部分让我感到困惑。

4

2 回答 2

3

每个架构都按照自己的方式行事。ARM Cortex uC 将初始堆栈指针位置存储为向量表中的前 32 位值。该值在 uC 启动时由硬件加载。所以这个地址完全可以由程序员控制。

然后启动例程可以更改它或设置双堆栈(一个用于线程,另一个用于特权模式)。

于 2019-02-20T19:51:39.320 回答
1

RAM 中的堆栈位置几乎总是可以通过软件进行配置。在您的工具链特定链接器脚本中,将有一个称为.stack或类似的区域,您可以决定将其放置在某个地址,或指定某个大小。这只是内存映射部分。

在任何启动代码中要做的第一件事就是设置堆栈指针。它必须通过汇编程序完成,因为 C 无法直接写入堆栈指针。在 ARM 等某些内核上,堆栈指针由硬件自动设置,复位后,您的链接描述文件已放置在向量表中并在闪存中编程。

所以一般来说,芯片供应商几乎总是把这完全留给程序员来决定。但是,核心确实指定了是否存在向上计数或向下计数的堆栈。到目前为止最常见的是向下计数,但一些古怪的架构具有向上计数的堆栈(最著名的是 PIC)。

至于堆栈指针的设置位置,您会在启动代码(“CRT”)的早期找到它,如果此类代码与您的工具链一起交付。通常它采用从链接描述文件获得的值,但如果您愿意,也可以对其进行硬编码。它需要在执行任何 C 代码之前完成,因为 C 喜欢使用堆栈。

如果您自己编写所有内容,则应该从复位向量内部将复位后所做的第一件事写入堆栈指针。

于 2019-02-21T10:28:20.720 回答