我有一台 Cortex M0+ 设备,我为其开发了一个引导加载程序和应用程序,部分基于 IC 制造商提供的一些示例代码。在引导加载程序中,在跳转到应用程序之前,引导加载程序会检索堆栈指针和应用程序重置向量的地址。我已使用应用程序的映射文件验证了该地址是正确的。但是,它获取的堆栈指针地址是 RAM 中的最顶层地址(在本例中为 0x20008000)。我的理解是 Cortex 堆栈(至少对于 M0 等“较低”设备)会向下增长。我只是想确认这是在这种情况下应该用于堆栈指针的地址。
我有一台 Cortex M0+ 设备,我为其开发了一个引导加载程序和应用程序,部分基于 IC 制造商提供的一些示例代码。在引导加载程序中,在跳转到应用程序之前,引导加载程序会检索堆栈指针和应用程序重置向量的地址。我已使用应用程序的映射文件验证了该地址是正确的。但是,它获取的堆栈指针地址是 RAM 中的最顶层地址(在本例中为 0x20008000)。我的理解是 Cortex 堆栈(至少对于 M0 等“较低”设备)会向下增长。我只是想确认这是在这种情况下应该用于堆栈指针的地址。
这不是特定 Cortex CPU 的功能。所有 ARM CPU(包括 Cortex)都支持升序和降序堆栈,以及“满”堆栈和“空”堆栈。
“升序”堆栈从低内存地址向高内存地址增长。相反,“降序”堆栈从高内存地址向低内存地址增长。
“满”堆栈是指堆栈指针指向包含数据的内存位置,并且在存储下一个值之前需要修改(增加或减少)堆栈指针。
“空”堆栈是指堆栈指针已经指向下一个可用空间的情况。要推送数据,请将其存储在当前堆栈指针处,然后修改堆栈指针。
这一切都在这里描述,包括:
因此,让初始堆栈指针指向 RAM 的末尾是您所期望的,因为堆栈必须向下增长。