开源软件|嵌入式开发:技巧和窍门——引导加载程序跳转到应用程序代码( 二 )


SCB _ VTOR =(uint 32 _ t)PROGRAM _ FLASH _ BASE;
一旦完成了这些 , 就该跳到应用程序了 。 开发人员可以通过几种不同的方式从引导装载程序跳转到应用程序 。 一种方法是简单地取消引用应用程序的重置向量位置 。 这样做的问题是堆栈指针可能不在正确的位置 , 从而导致奇怪的行为 。 理想情况下 , 开发人员会设置堆栈指针 , 然后设置程序计数器 。 如何做到这一点将因微控制器而异 。 几乎总是需要使用内联汇编代码来完成(这是我唯一一次提倡编写汇编代码) 。 对于ARM微控制器 , 下面是一个示例代码片段:void Flash _ start application(uint 32 _ t start address)
{
asm(\" ldr SP , [r0 , # 0
\");
asm(\"ldr PC , [r0 , # 4
\");

根据所使用的编译器 , 确切的代码会略有不同 。 内联汇编不是C标准 , 所以每个编译器供应商都以不同的方式实现了它 , 或者在某些情况下根本没有实现!让我们来看看这是怎么回事 。
为了最小化汇编语言代码 , 将汇编语言代码包装在C函数中是至关重要的 。 原因是当startAddress被传递到Flash_StartApplication函数中时 , 它会自动存储在寄存器r0中 。 有了这些知识 , 就没有理由添加额外的汇编语言指令来将所需的起始地址加载到寄存器中 。 (是的 , 它为我们节省了一条汇编指令 , 但这样做也更容易维护 , 更灵活) 。 然后 , 第一条汇编指令是获取存储在寄存器r0中偏移量为0(# 0)的值 , 并将其复制到堆栈指针(SP)寄存器 。 然后 , 第二条指令告诉处理器将r0中存储的值加上偏移量4 (#4) , 并将其复制到程序计数器(PC)寄存器中 。 偏移量4实际上是将r0中存储的值加4 。 执行的下一条指令将是应用程序代码的复位向量 。 我们刚刚成功地进入了应用程序!
【开源软件|嵌入式开发:技巧和窍门——引导加载程序跳转到应用程序代码】这就是全部了!按照这个过程 , 嵌入式开发人员现在可以很容易地从引导加载程序跳转到你的应用程序代码 , 并确保它将按照你期望的方式运行 。