嵌入式项目实战之固件IAP升级解决方案(示例芯片CH32V307R)
MCU固件IAP升级的业务主要是MCU在运行过程中,实现固件的下载,更新。编译器生成的升级的文件都是二进制的BIN文件格式,没有校验和版本管理信息。为了实现固件IAP升级过程的可靠性,我们需要加入一些固件管理信息,比如版本,固件长度,校验,型号等。曾看过一些升级方案,固件升级文件都是在BIN文件格式上增加一些前缀或后缀信息,包括了固件版本,校验信息等,俗称为“打包”。通过这种方式实现固件管理业务虽然没问题,但增加了打包解包的业务,管理起来也不够灵活。因为需要在PC端开发工具实现“打包”业务,到MCU端,MCU下载的固件包实现“解包”后,才能更新到APP加载区域。
本文提到的固件IAP方案,是把版本管理,校验等信息通过编译器编译到固件内,而不需要额外的“打包”,“解包”业务。可升级的固件一般都是MCU主程序,我们定义为APP固件。对于APP固件生成,我们做如下工作,
第一步是在代码文件中添加版本管理信息,这些信息可以直接编译到固件文件中。虽然其中的固件长度和固件校验字段值无法直接获取,我们先定义一个初始值。版本管理信息需要编译到固定地址,方便获取这些信息。示例中,我们将之分配到特定的crc段。
第二步是在编译链接脚本文件中,添加对应的段。因为中断向量表代码段长度一般都是固定的,并且必须排在代码段最前面,而主程序长度是不确定的。我们一般是将版本管理信息代码段链接在中断向量表后,主程序之前,方便寻址。
第二步是添加编译脚本,编译脚本为一般编译器支持执行的脚本文件&#x