谁定义堆栈指针地址

时间:2019-02-20 18:50:53

标签: c embedded microcontroller startup stack-pointer

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

此初始堆栈指针地址和C启动代码是否通常由芯片供应商定义和提供?

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

2 个答案:

答案 0 :(得分:2)

每个体系结构都是这样。 ARM Cortex uC的初始堆栈指针位置存储为向量表中的前32位值。 uC启动时,此值由硬件加载。因此,该地址可由程序员完全控制。

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

答案 1 :(得分:1)

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

在任何启动代码中,第一件事就是设置堆栈指针。由于C无法直接写入堆栈指针,因此必须通过汇编器完成。在某些内核(如ARM)上,堆栈指针是由硬件自动设置的,而不会重置,该链接器是根据链接描述文件放置在向量表中并在Flash中编程的值来设置的。

因此,一般而言,芯片供应商几乎总是将其完全留给程序员来决定。核心确实指定了是向上计数还是向下计数的堆栈。到目前为止,最常见的是递减计数,但是某些奇数球体系结构具有递增计数堆栈(最著名的是PIC)。

关于设置堆栈指针的位置,如果该代码随工具链一起提供,您会在启动代码(“ CRT”)中很早就找到它。通常,它采用从链接程序脚本获得的值,但是如果愿意,也可以对其进行硬编码。由于C喜欢使用堆栈,因此需要在执行任何C代码之前完成。

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

相关问题