Cortex M0+ 引导加载程序将 RAM 中的顶部地址传递给应用程序以获取堆栈指针地址 - 正确吗?

问题描述 投票:0回答:1

我有一个 Cortex M0+ 设备,我为其开发了一个引导加载程序和应用程序,部分基于 IC 制造商的一些示例代码。在引导加载程序中,在跳转到应用程序之前,引导加载程序会检索堆栈指针的地址和应用程序的重置向量。我已使用应用程序的地图文件验证地址是否正确。然而,它获得的堆栈指针地址是 RAM 中的最高地址(在本例中为 0x20008000)。我的理解是 Cortex 堆栈(至少对于像 M0 这样的“较低”设备)会向下增长。我只是想确认这是在这种情况下应该用于堆栈指针的地址。

embedded cortex-m
1个回答
0
投票

这不是 CPU 的功能。 ARM(包括 Cortex)支持升序和降序堆栈,以及“满”和“空”堆栈。

“满”堆栈是堆栈指针指向包含数据的内存位置的堆栈,并且在存储下一个值之前需要修改堆栈指针(递增或递减)。

“空”堆栈是堆栈指针已经指向下一个可用空间的地方。要推送数据,请将其存储在当前堆栈指针处,然后修改堆栈指针。

这全部描述于here,其中包括:

ARM 体系结构的过程调用标准 (AAPCS) 以及 ARM 和 Thumb C 和 C++ 编译器始终使用完整的降序堆栈。 PUSH 和 POP 指令采用完整的降序堆栈。它们是具有写回功能的 STMDB 和 LDM 的首选同义词。

因此,初始堆栈指针指向 RAM 末尾就是您所期望的,因为堆栈必须向下增长。

© www.soinside.com 2019 - 2024. All rights reserved.