Arm核BootLoader简述、跳转分析、以及多固件链接的多应用解决方案。

        在arm核中,以CortexM3为例,它在机制层面提供给用户一个向量表(Vector)的概念。向量表的定义可以在官方的keil启动文件中找到,启动文件是.s汇编语言。一般是命名为startup_stm32xxx.s。向量表可以通过标号__Vector来辨识。

                在__Vector标号的下面几段语句中,DCD分配了其他标号辨识。

        第一个__initial_sp是堆栈指针的起始地址(MSP),它指向分配给程序的栈区的栈底,此外,arm采用向上增长或向下增长的满栈。详情请看arm具体的堆栈分析。

        第二个Reset_Handler是复位中断的句柄或者说处理函数。也是我们今天要关注的重头戏。它实际上也是一个指针,指向的是复位处理函数。当外部触发复位中断或者是初始化时,可以通过该函数来进行引导或初始化。

        其他的往下罗列的标号我们今天暂不分析,对于简单的BootLoader只需要讨论上述两个内容。

        

        我们再来看Reset_Handler,这个复位标号在功能上做了什么工作,首先PROC 和ENDP是一对编码区域限制指令。随后EXPORT声明了这个复位服务中断函数,并且熟悉为弱{WEAK}(有点类似于重载的机制)。同时IMPORT __main和SystemInit。再往后跳转SystemInit处理,然后再跳到__main来进行处理。

        同时我们可以创建一个简单的代码,并通过keil编译生成.bin二进制文件。通过SublimeText软件我们可以观察到它的最前面的一部分内容。

由于是32位的核,那么每个标号占用的字节数是32/8=4个字节,那么0x58100020便是他的栈指针地址,0x3d010008是其复位中断处理函数。

        因此每次会从0x3d010008这个位置来执行System_Init然后再跳到__main。因此,BootLoader在最后的跳转语句时。需要找到烧录固件的位置(即向量表的起始地址)+4,这样就能找到复位处理函数,从而根据这个函数来预处理和初始化。从而为App部分的代码执行来创建环境。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32 bootloader 是指在STM32单片机上使用bootloader来实现固件升级或应用程序的过程。 为了实现bootloader的正确,我们需要按照以下步骤进行操作: 1. 首先,确保正确配置并使用适当的工具链来编译和生成bootloader应用程序的可执行文件。 2. 将生成的bootloader镜像烧录到STM32的存储器中,可以通过串口、JTAG等方式进行烧录。 3. 配置启动地址和重定位向量表。在编译bootloader时,需要设置合适的启动地址和重定位向量表。启动地址决定了单片机复位后的第一条指令的执行地址,而重定位向量表则是用来存放中断和异常处理函数入口地址的表。这些地址需要与应用程序的起始地址相对应。 4. 编译应用程序,并将生成的应用程序镜像烧录到合适的存储器区域中。 5. 在bootloader中实现应用程序的功能。可以通过设置复位向量表中的复位中断处理函数的入口地址来实现。在之前,需要做一些准备工作,如关闭中断、关闭外设等,以确保应用程序后的正常运行。 6. 更新复位向量表并应用程序。更新复位向量表时,需要将应用程序的起始地址设置到复位中断处理函数的入口地址处。之后,通过应用程序的入口地址,实现从bootloader应用程序的。 总的来说,STM32 bootloader过程涉及到设置启动地址、重定位向量表、烧录和等步骤。通过正确配置和操作,可以实现STM32单片机的固件升级和应用程序的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值