打印
[KungFu8位 MCU]

Chipon bootloader代码开发方案示例

[复制链接]
848|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ylslib|  楼主 | 2019-2-28 09:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

评论
XX12345678 2019-3-13 13:40 回复TA
有完整版的吗,还有程序 
沙发
ylslib|  楼主 | 2019-2-28 09:42 | 只看该作者
一、概述
        可以设计程序空间的前1K、2K或3K(不局限于K,但要Flash自写的行对齐,如可以为2K加32个地址空间)作为bootloader的程序空间。编译的程序序和后续编译的应用程序构成方案的全部代码,样例实现互相共享函数,复用变量,和不同模式的功能,即bootloader赋值引导和更新程序,应用程序为特定的目标的产品功能程序。

使用特权

评论回复
板凳
ylslib|  楼主 | 2019-2-28 09:43 | 只看该作者
二、设计构成
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指定到统一位置。

使用特权

评论回复
地板
ylslib|  楼主 | 2019-2-28 09:44 | 只看该作者
三、项目关联
更新维护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。该样例中已添加。

使用特权

评论回复
5
ylslib|  楼主 | 2019-2-28 09:44 | 只看该作者

使用特权

评论回复
6
ylslib|  楼主 | 2019-2-28 09:44 | 只看该作者
四、图示示例方案
引导输出文件

引导项目编译,需要如图3个文件(实际仅2个对应目标项目有效)复制到对应的开发项目。

使用特权

评论回复
7
ylslib|  楼主 | 2019-2-28 09:45 | 只看该作者
Bootloader项目文件结构


正常C项目开发的文件结构,处理代码的头文件和源文件,额外一个txt文件,3个o文件。

使用特权

评论回复
8
ylslib|  楼主 | 2019-2-28 09:45 | 只看该作者
Bootloader转应用功能参考

Bootloader引导程序转入应用程序应该调用 _user_gsinit_startup()函数后转到user_main入口。如果可能应该先终止Bootloader程序的中断开启,以及占用的资源,如公共变量初值传递,IO端口或串口等功能释放。

使用特权

评论回复
9
ylslib|  楼主 | 2019-2-28 09:45 | 只看该作者
五、其他
        如果bootloader设计不丢失数据参数,可以将应用程序的地址后移,中间空闲部分空间通过flash自写可修改参数,从而作为bootloader的参数数据区域。
        空间空间方法不支持定义初始值,也可以通过定义const变量并通过__at指定地址完成数据的定义。需要注意的时,可以是结构体、可以是数组,但应该按照Flash空间的最小写单元进行进行大小的分配。即32/64/96/128。

使用特权

评论回复
10
bvbgbhbn| | 2019-3-29 16:22 | 只看该作者
感谢分享!最好有整份的文档资料分享上来。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

230

帖子

1

粉丝