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

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

  •  0
  • nobby  · 技术社区  · 11 月前

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

    1 回复  |  直到 11 月前
        1
  •  1
  •   pmacfarlane    11 月前

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

    “上升”堆栈从低内存地址向高内存地址增长。相反,“递减”堆栈从高内存地址向下扩展到较低的地址。

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

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

    这一切都已描述 here ,并包括以下内容:

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

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