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 。 执行的下一条指令将是应用程序代码的复位向量 。 我们刚刚成功地进入了应用程序!
【开源软件|嵌入式开发:技巧和窍门——引导加载程序跳转到应用程序代码】这就是全部了!按照这个过程 , 嵌入式开发人员现在可以很容易地从引导加载程序跳转到你的应用程序代码 , 并确保它将按照你期望的方式运行 。
- 软件|新电脑需装的6款黑科技软件,轻松玩转新机,建议提前摸透
- 软件|36氪首发 |累积客户超百家 ,基础软件提供商「泛联新安」获新一轮战略投资
- 浏览器|别花冤枉钱!好用且能白嫖的4款电脑软件推荐!请低调使用
- C++|国产杀毒软件为何没落了?前世今生连起来看,就是互联网版宫廷剧
- 支付宝|嵌入式开发:嵌入式基础——重启和重置的区别
- 流氓软件|还在被流氓软件骚扰?一文教你如何用鸿蒙系统彻底根除
- 软件|快手、B站、微信视频号回应网络主播新规,已设有认证或资质要求
- 删库跑路、“投毒”、改协议,开源有哪几大红线千万不能踩?
- 软件|天猫和淘宝哪里不同呢?荆州启中来讲解
- 高通骁龙|6款性价比超高的原型设计软件