代码之家  ›  专栏  ›  技术社区  ›  Engineer999

谁定义堆栈指针地址

  •  1
  • Engineer999  · 技术社区  · 5 年前

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

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

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

    0 回复  |  直到 5 年前
        1
  •  3
  •   0___________    5 年前

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

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

        2
  •  1
  •   Lundin    5 年前

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

    在任何启动代码中要做的第一件事就是设置堆栈指针。它必须通过汇编程序完成,因为C无法直接写入堆栈指针。在一些内核(如ARM)上,堆栈指针是由硬件自动设置的,该值由链接器脚本放置在向量表中并在flash中编程得到。

    所以一般来说,硅供应商几乎总是把这完全交给程序员来决定。然而,核心确实指定了是有递增计数堆栈还是递减计数堆栈。到目前为止,最常见的是向下计数,但一些古怪的架构有向上计数堆栈(最著名的是PIC)。

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

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