【问题标题】:Who defines the stack pointer address谁定义了栈指针地址
【发布时间】:2019-02-20 18:50:52
【问题描述】:

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

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

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

【问题讨论】:

  • 初始堆栈指针状态应在微控制器的数据手册中指定。
  • 快速回答是你做的。通常,堆栈指针是启动代码中首先定义的东西之一。您在内存中放置堆栈指针的位置通常由您的数据表强烈暗示,但您(或任何编写 crt0 或 init 内核或其他内容的人)可以选择。您的电路板将跳转到内存中的某个硬连线地址,并在上电时开始执行代码。这是该定义所在的位置,或者您将 .org 启动代码的位置。
  • 旁白:在某些处理器中,NMI 并不是真正不可屏蔽的:它只有在设置堆栈指针后才会启用。
  • 两者。某些体系结构堆栈指针是由硬件定义的,我认为这很少见。以 6502 为例。其他架构完全取决于您,例如基于 arm7 和 cortex-m。你阅读了文档,看看设备有多少内存,决定了软件开发人员希望如何为你的项目分配内存,留下一些用于堆栈。
  • 如果可以并且选择如何设置堆栈指针也是特定于架构的。

标签: c embedded microcontroller startup stack-pointer


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    因此,通常情况下,芯片供应商几乎总是将这完全留给程序员来决定。但是,核心确实指定了是否存在向上计数或向下计数的堆栈。迄今为止最常见的是向下计数,但一些古怪的架构具有向上计数的堆栈(最著名的是 PIC)。

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

    如果您自己编写所有内容,您应该在复位后从复位向量内部写入堆栈指针。

    【讨论】:

    • 好的,谢谢。通常启动代码总是由芯片供应商提供吗? ,或者我们必须从头开始编写它?例如来自 Atmel 的 ARM 芯片
    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2010-12-23
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多