固件升级中bootloader和app
前言
在之前推出的项目中,有很多粉丝私信我,到底什么是bootloader?什么是APP?是手机APP那种吗?有什么用?解决什么问题等等。因此,笔者再发一次详细版。
1.为什么要用固件升级功能?
我尽量一句话说清楚:目的就是为了产品发布以后想要对产品中的固件程序进行更新,那就需要重新烧录程序,但是产品一般都封装完好,不能拆开进行烧录调试,此时就需要IAP通过预留的通信接口(包括但不仅限于串口、IIC、SPI、CAN等通信方式),将所要更新的程序传入设备,以达到快速更新程序。比如汽车的OTA更新,如果不用OTA更新,只能去线下把汽车拆开再烧程序了,非常麻烦。其中,IAP全称是In Application Programing,即在程序中编程,意思就是说把需要更新的程序传入原来的程序中,原来的程序接收到了更新程序,就跳转到更新程序去执行。
2 .什么是bootloader和APP程序(高频考点)?
Bootloader叫做引导加载程序。在嵌入式系统上电复位后首先运行引导加载程序,它的功能主要是负责系统的上电自检、必要的硬件初始化、建立储存空间映射,并加载和启动操作系统。Bootloader一般储存在bootROM中,当前使用最多的类型是NOR flash rom,在大多数的嵌入式系统中,flash里边不仅储存了bootloader,还储存了用户程序代码。
Bootloader有两种工作模式,一种是启动加载模式,另一种是下载模式;而提到的固件升级就属于bootloader的下载模式。比如博主的整个烟机项目就是一个巨大的bootloader程序,因为它能接收固件并进行跳转执行。
3.为什么不做一个只有更新功能的bootloader,非要在bootloader里边实现如此多的功能呢?
因为在产品中固件更新功能只是为了以防万一,有需要更新的时候才进行更新,不需要更新的时候用原来的功能就够了。
接下来说一下什么是APP程序。APP指的就是需要传输的更新固件,不是手机APP,通常以.bin文件形式发送。又有粉丝问,那为什么要用bin文件,而不用hex文件呢?
因为hex文件是包含地址信息的ASCII文本文件,可直接用于烧录;bin文件是纯二进制数据文件,不含地址信息,烧录时需要指定起始地址。刚好APP区域的划分是由我们自行划分的,起始地址只能自己指定,APP程序自然是要烧录到APP区域执行,因此需要未指定起始地址的bin文件。
4. 固件升级的工作原理是什么?
固件升级的工作原理实际上就是:先将整个Flash划分成boot区和APP区(前提为flash升级),boot区专门用于执行bootloader,APP区专门执行APP程序;然后将bootloader烧录到boot区,接下来通过上位机传入固件,此时bootloader接收固件并跳转到APP区域执行固件。
上述这段话是一个总结,接下来从STM32的上电启动流程、bootloader到底干了什么以及APP程序如何跳转三个层面来进行具体分析。
(1)STM32上电启动流程
(以下是高频考点)当STM32发生复位时,此时硬件会强制PC寄存器指向一个固定地址0X00000000(或者是由boot引脚映射的0x08000000),该地址存放的是主堆栈指针(MSP)的初始值,内核会读取该值并进行堆栈初始化,以创建好C环境以及安全调用中断服务函数。
其次,PC寄存器会执行到0x00000004地址,取出该地址存放的复位中断处理函数,并跳转过去执行;在复位函数中,首先完成系统时钟的初始化,其次调用__main函数,完成数据的初始化,如将Flash中的data段数据拷贝到RAM中,然后将未初始化的全局变量(bss段)清零。最后,__main函数调用main函数,进入到main函数执行。
(2)bootloader程序在固件升级中到底干了什么?
一句话说清楚这个问题。实际上,在固件升级功能中,bootloader就干了三件事情:1、接收上位机传输的固件保存到RAM中;2、将RAM上的固件拷贝到Flash;3、跳转到APP执行。
(3)APP程序怎么跳转的?
跳转APP程序操作实际上就一行代码--调用jump2app()。那为什么调用这个函数就行了呢?
答案是jump2app是一个函数指针,直白点,它就是一个地址0x00000004+M(M是偏移量,或者说是boot区与APP区的分界线);这个地址看起来很熟悉对吧?因为才在上电启动流程里边见过,不同的是多了一个M,这代表的意思是在APP区里重新创建了一个新的中断向量表(依然0x00000000+M存放堆栈指针MSP、0x00000004+M存放复位向量)。
理解了这行地址代表的含义之后,我们再来看jump2app()的含义。这实际上就是取地址操作(这里我不多解释了,如果你不明白,说明你C语言基础还要补),而这个地址里存放的是APP区的复位向量。因此,此处代表的意思就是取出复位向量并跳转执行,也就是执行到了APP区的复位中断服务函数中,然后再次执行系统时钟的初始化、调用__main函数初始化数据,最后调用APP的main函数执行。到此处,开始执行APP程序的main函数功能,跳转APP程序执行成功。
#嵌入式软件开发#
在之前推出的项目中,有很多粉丝私信我,到底什么是bootloader?什么是APP?是手机APP那种吗?有什么用?解决什么问题等等。因此,笔者再发一次详细版。
1.为什么要用固件升级功能?
我尽量一句话说清楚:目的就是为了产品发布以后想要对产品中的固件程序进行更新,那就需要重新烧录程序,但是产品一般都封装完好,不能拆开进行烧录调试,此时就需要IAP通过预留的通信接口(包括但不仅限于串口、IIC、SPI、CAN等通信方式),将所要更新的程序传入设备,以达到快速更新程序。比如汽车的OTA更新,如果不用OTA更新,只能去线下把汽车拆开再烧程序了,非常麻烦。其中,IAP全称是In Application Programing,即在程序中编程,意思就是说把需要更新的程序传入原来的程序中,原来的程序接收到了更新程序,就跳转到更新程序去执行。
2 .什么是bootloader和APP程序(高频考点)?
Bootloader叫做引导加载程序。在嵌入式系统上电复位后首先运行引导加载程序,它的功能主要是负责系统的上电自检、必要的硬件初始化、建立储存空间映射,并加载和启动操作系统。Bootloader一般储存在bootROM中,当前使用最多的类型是NOR flash rom,在大多数的嵌入式系统中,flash里边不仅储存了bootloader,还储存了用户程序代码。
Bootloader有两种工作模式,一种是启动加载模式,另一种是下载模式;而提到的固件升级就属于bootloader的下载模式。比如博主的整个烟机项目就是一个巨大的bootloader程序,因为它能接收固件并进行跳转执行。
3.为什么不做一个只有更新功能的bootloader,非要在bootloader里边实现如此多的功能呢?
因为在产品中固件更新功能只是为了以防万一,有需要更新的时候才进行更新,不需要更新的时候用原来的功能就够了。
接下来说一下什么是APP程序。APP指的就是需要传输的更新固件,不是手机APP,通常以.bin文件形式发送。又有粉丝问,那为什么要用bin文件,而不用hex文件呢?
因为hex文件是包含地址信息的ASCII文本文件,可直接用于烧录;bin文件是纯二进制数据文件,不含地址信息,烧录时需要指定起始地址。刚好APP区域的划分是由我们自行划分的,起始地址只能自己指定,APP程序自然是要烧录到APP区域执行,因此需要未指定起始地址的bin文件。
4. 固件升级的工作原理是什么?
固件升级的工作原理实际上就是:先将整个Flash划分成boot区和APP区(前提为flash升级),boot区专门用于执行bootloader,APP区专门执行APP程序;然后将bootloader烧录到boot区,接下来通过上位机传入固件,此时bootloader接收固件并跳转到APP区域执行固件。
上述这段话是一个总结,接下来从STM32的上电启动流程、bootloader到底干了什么以及APP程序如何跳转三个层面来进行具体分析。
(1)STM32上电启动流程
(以下是高频考点)当STM32发生复位时,此时硬件会强制PC寄存器指向一个固定地址0X00000000(或者是由boot引脚映射的0x08000000),该地址存放的是主堆栈指针(MSP)的初始值,内核会读取该值并进行堆栈初始化,以创建好C环境以及安全调用中断服务函数。
其次,PC寄存器会执行到0x00000004地址,取出该地址存放的复位中断处理函数,并跳转过去执行;在复位函数中,首先完成系统时钟的初始化,其次调用__main函数,完成数据的初始化,如将Flash中的data段数据拷贝到RAM中,然后将未初始化的全局变量(bss段)清零。最后,__main函数调用main函数,进入到main函数执行。
(2)bootloader程序在固件升级中到底干了什么?
一句话说清楚这个问题。实际上,在固件升级功能中,bootloader就干了三件事情:1、接收上位机传输的固件保存到RAM中;2、将RAM上的固件拷贝到Flash;3、跳转到APP执行。
(3)APP程序怎么跳转的?
跳转APP程序操作实际上就一行代码--调用jump2app()。那为什么调用这个函数就行了呢?
答案是jump2app是一个函数指针,直白点,它就是一个地址0x00000004+M(M是偏移量,或者说是boot区与APP区的分界线);这个地址看起来很熟悉对吧?因为才在上电启动流程里边见过,不同的是多了一个M,这代表的意思是在APP区里重新创建了一个新的中断向量表(依然0x00000000+M存放堆栈指针MSP、0x00000004+M存放复位向量)。
理解了这行地址代表的含义之后,我们再来看jump2app()的含义。这实际上就是取地址操作(这里我不多解释了,如果你不明白,说明你C语言基础还要补),而这个地址里存放的是APP区的复位向量。因此,此处代表的意思就是取出复位向量并跳转执行,也就是执行到了APP区的复位中断服务函数中,然后再次执行系统时钟的初始化、调用__main函数初始化数据,最后调用APP的main函数执行。到此处,开始执行APP程序的main函数功能,跳转APP程序执行成功。
#嵌入式软件开发#
全部评论
相关推荐
iiooz:别想太多了,面试官如果看不上,就不会约面了,腾讯很少所谓的kpi,有面就说明能力肯定不错,只是每个面试官筛选方式不同,二面甚至只跟你聊生活的都有,鹅还是很开放的在筛选人这一块 点赞 评论 收藏
分享
查看12道真题和解析