了解STM32的STMicro重置处理程序示例代码

了解STM32的STMicro重置处理程序示例代码,stm32,hal,Stm32,Hal,STMicro为STM32提供的重置处理程序代码示例(在我的示例中是针对STM32H753的)如下所示: Reset_Handler: ldr sp, =_estack movs r1, #0 b LoopCopyDataInit ... 我不理解设置堆栈指针的第一条指令 事实上,向量表的定义如下: 这意味着堆栈指针由CPU从向量表中的第一个字开始设置。这由调试确认(在执行重置处理程序的第一条指令之前中断时,SP设置正确) 是否有理由将此指令ldr sp,=\u esta

STMicro为STM32提供的重置处理程序代码示例(在我的示例中是针对STM32H753的)如下所示:

Reset_Handler:
  ldr  sp, =_estack
  movs r1, #0
  b  LoopCopyDataInit
  ...
我不理解设置堆栈指针的第一条指令

事实上,向量表的定义如下:

这意味着堆栈指针由CPU从向量表中的第一个字开始设置。这由调试确认(在执行重置处理程序的第一条指令之前中断时,SP设置正确)


是否有理由将此指令
ldr sp,=\u estack
保留在thr Reset Handler中

向量表的第一个位置包含初始堆栈地址。但是程序员可能想为它设置另一个值或设置双堆栈

在链接器脚本中,您有:

\u estack=地址

在非常简单的启动文件中:

g_pfnVectors:
  .word  _estack
  .word  Reset_Handler

但是您可以将这些值更改为不同的值,或者从引导加载程序调用ResetHandler。然后您需要将堆栈指针设置为正确的值。

是的,我知道这一点,但实际上,
ldr sp,=\u estack
不会更改堆栈指针,因为它已经设置为
\u estack
。还是我遗漏了什么?在这种情况下,情况并没有改变。但是程序员在编写从引导加载程序调用的程序时很可能使用相同的启动。在一般启动中,最好使用此指令