IAP升级文件编译后自动加头部信息~简单快捷
当我们开发IAP时,经常会在升级文件头部加上一段产品信息相关的信息,最简单的目的是为了不会把非本产品的OTA升级文件写入本产品。
可以有以下几种方式:
- 在编译后,手动给升级文件加头部信息、文件长度、校验信息;
- 通过一些脚本自动编译、加上头部信息后再自动输出;
- 给项目工程配置,使得编译输出文件即是附加头部信息的升级文件,本文使用gcc编译cortex M0来介绍此种方式;
我的FLASH地址分配为:
在app中定义
const uint8_t __attribute__((section(".product_id"))) product[64] = "PRODUCT_NAME_V1_";
修改链接脚本文件:
新增PRODUCT_ID段,我预留了256字节:
NVIC 中有一个寄存器,称为“向量表偏移量寄存器”(在地址0xE000ED08 处),通过修改它的值就能定位向量表。但必须注意的是:向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字向上增大到是2 的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有32 个中断,则共有32+16(系统异常)=48 个向量,向上增大到2 的整次幂后值为64,因此地址必须能被64*4=256 整除,从而合法的起始地址可以是:0x0, 0x100, 0x200 等。
我们修订app的链接脚本如下:
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K
PRODUCT_ID (rx) : ORIGIN = 0x8002C00, LENGTH = 256
FLASH (rx) : ORIGIN = 0x8002D00, LENGTH = 64K - 11K - 256
}
链接脚本新增一个段:表示从0x8002C00开始存放产品信息【256字节】,
0x8002D00开始存放中断向量表,0x8002D1C0开始存放用户代码。
对于BOOT下载代码写FLASH过程,0x8002C00为下载地址,0x8002D00为程序跳转地址。
/* Define product id section */
SECTIONS
{
.DEF_PRODUCT 0x8002C00 :
{
KEEP (*(.product_id))
} > PRODUCT_ID
}
编译后输出文件
至此,已完成输出文件自动加头部的设计,简单快捷!