Chipon bootloader代码开发方案示例
一、概述
可以设计程序空间的前1K、2K或3K(不局限于K,但要Flash自写的行对齐,如可以为2K加32个地址空间)作为bootloader的程序空间。编译的程序序和后续编译的应用程序构成方案的全部代码,样例实现互相共享函数,复用变量,和不同模式的功能,即bootloader赋值引导和更新程序,应用程序为特定的目标的产品功能程序。 二、设计构成
Bootloader_Config项目提供的指定空间的引导定义:
该项目编译会提示不通过,这是正常现象,只有文件中无错误即可(为引导库,非完整代码)。
该项目提供stk.o和startup-id.o库。
BootLoader_Code 项目使用C语言设计bootloader引导程序。
如果设计汇编实现bootloader程序可以直接在startup-id.asm的基础上进行汇编代码的开发。如果直接加入到应用项目编译完整hex,需要将该空间通过dw伪指令进行全空间的填充。即bootloader代码占满设计的空间,可以作为o的库文件参与到应用项目的开发中。
occupancy.txt文件定义的用于代码的空间
这里应包含RAM的分配和Flash空间的分配,内容采用data和code的段描述,排除后空间为可用空间。
global.h|c文件示例定义了与bootloader共用的变量,地址通过__at指定到统一位置。 三、项目关联
更新维护Bootloader_Config项目中的startup-id.asm文件,维护对应用程序提供的功能函数,如样例中为id_fun1和id-fun2,根据目标特性这里可以更改为flash自写的读写方法声明。该函数的被调用入口采用夹缝空间,即0x14之前的地址,考虑到存在程序分页,该夹缝可以对应用程序定义3个程序入口。如果需要更多的函数,可以在0x14的低级中断的压栈结束位置继续仿照前面进行定义,即基于0x14的偏移,地址固定可期。
这里设计了定义的BootLoader_Code中的主程序、中断函数1、中断函数2的重映射,这里设计为id_main、id_isr_fun0、id_isr_fun1(文件中函数名的前“_”为C项目到汇编的转换结果)
因为bootloader根据条件转入应用程序,因此固定应用程序的引导入口,这里声明函数(虚拟)为user_main,其他需要的函数包括user_gsinit_startup、user_isr_fun0、user_isr_fun1。如果需要应用程序贡献功能函数给bootloader,这里设计示例user_fun1、user_fun2。在startup-id.asm引导中,这里函数仅定义地址,即bootloader调用时call入口的函数,入口位置完成真正函数的关联。因此这些函数在文件的最后实现引导入口的固定(因为存在切页每个入口设计2个地址,需要维护入口地址)。
Bootloader负责加载芯片的校准值,因此startup-id.asm中main函数设计为加载芯片校准值(仅声明,后续C项目加入库的自动实现)、调用初始化无初始化和初始化数值的变量,即__gsinit_startup。
occupancy.txt中使用排除法,定义了该项目可以使用的RAM空间和Flash空间。
修改链接器,将stk.o库和startup-id.o加入到项目的编译库中,即右键项目属性->C/C++构建->设置。选择配置模式,在工具设置的C Project Linker xx的命令后面加入../stk.o ../startup-id.o。该样例中已添加。 四、图示示例方案
引导输出文件
引导项目编译,需要如图3个文件(实际仅2个对应目标项目有效)复制到对应的开发项目。 Bootloader项目文件结构
正常C项目开发的文件结构,处理代码的头文件和源文件,额外一个txt文件,3个o文件。 Bootloader转应用功能参考
Bootloader引导程序转入应用程序应该调用 _user_gsinit_startup()函数后转到user_main入口。如果可能应该先终止Bootloader程序的中断开启,以及占用的资源,如公共变量初值传递,IO端口或串口等功能释放。 五、其他
如果bootloader设计不丢失数据参数,可以将应用程序的地址后移,中间空闲部分空间通过flash自写可修改参数,从而作为bootloader的参数数据区域。
空间空间方法不支持定义初始值,也可以通过定义const变量并通过__at指定地址完成数据的定义。需要注意的时,可以是结构体、可以是数组,但应该按照Flash空间的最小写单元进行进行大小的分配。即32/64/96/128。 感谢分享!最好有整份的文档资料分享上来。
页:
[1]