【问题标题】:Initial stack pointer not starting at the required offset (where are the extra byte offsets coming from?)初始堆栈指针未从所需的偏移量开始(额外的字节偏移量来自哪里?)
【发布时间】:2016-03-03 17:50:18
【问题描述】:

我在从 Keil 获取的 Cortex-M3 启动文件中有以下示例代码(使用 Microlib 编译)。

; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
                EXPORT  __initial_sp
Stack_Size      EQU     0x00000100

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

这个区域最终被放入一个 RAM 区域,从地址 0x20000000 开始,可执行区域的大小在 scatter 文件中为 0x400

当我进入调试器时,我看到内存地址0x0 的值是0x20000118,这是初始堆栈指针,甚至寄存器窗口也将msp 寄存器显示为0x20000118

但我的理解是堆栈的开始将从0x20000100 开始,因为上面的代码 sn-p 就是这样做的。

我无法知道这些额外的 0x18 字节是从哪里来的。

另外,我刚刚关闭了 Microlib 模式,现在我看到初始堆栈指针是 0x20000120
同样,这些额外的 0x20 字节偏移量从哪里到堆栈指针。

为什么堆栈不是从我想要的位置开始(0x20000100),而是有一些额外的偏移量?

【问题讨论】:

    标签: stack arm cortex-m3 keil


    【解决方案1】:

    不,这段代码 sn-p 并没有说初始堆栈指针将位于 0x20000100。

    首先,它是EXPORTs 符号“__initial_sp”。这只将此符号声明为“全局”(由其他文件访问)。接下来,将值 0x100 分配给符号“Stack_Size”。接下来的说明是创建虚拟的“STACK”部分,其大小为“stack_size”。

    初始堆栈指针值将(通常)由链接描述文件计算。您还需要查看向量表的源代码(在大多数情况下,它将位于名为 startup.s 或类似文件的文件中)并查看将哪个符号用作第一个条目(真的是“ __initial_sp”?)。

    注意,如果您有(例如)32KB 的 RAM 并且您的 RAM 从 0x20000000 开始,那么您希望(通常)您的初始 SP 位于 0x20008000(RAM 的末尾)。如果“堆栈大小”等于“0x100”,则意味着您不希望 SP 小于 0x20007F00。但是,您也可以在取决于其他部分(例如 .heap 或 .data)大小的地址处拥有初始堆栈指针。这就是为什么您在链接到标准库时会看到差异(它会改变其他部分的大小)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 2017-05-10
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多