项目背景
Agile Upgrade:用于快速构建 bootloader 的中间件。
-
example
文件夹提供 PC 上的示例
特性
-
AES256
-
fastlz
-
quicklz
-
原生适配
file
及fal
操作接口 -
移植简单,实现自定义的后端只需适配几个操作接口
-
使用简单,几行代码即可实现固件升级
-
全过程日志输出
-
提供过程回调,可将过程及进度显示在自定义硬件上
-
基于
RT-Thread 4.1.0
版本 -
基于正点原子探索者开发板
代码地址:
https://github.com/loogg/agile_upgrade_mcu_demos
https://github.com/loogg/agile_upgrade
(请复制至外部浏览器打开)
-
目录结构
2、Bootloader
一般Bootloader
实现的逻辑如下:
这种方式适合于简单的裸机程序或可控的 OS 程序(即所有外设硬件都可把控),在准备环境的时候将其全部关闭。
但对于一些复杂的或者 OS 中轮子已造好的程序,有一些因素不花时间研究无法把控,在准备环境时很可能就会遗漏一些未关闭导致出各种各样的问题。
这里提供一种万能方法:
- 利用芯片中的不受软件复位影响的可供用户使用的寄存器 (如 STM32 中的备份寄存器)。
- 在需要跳入 APP 运行时将该寄存器赋值然后软件复位。
- 在 OS 还没初始化时判断该寄存器值,如果需要跳转只需要简单的准备环境即可跳转。
该方法可以使Bootloader
就作为一个 OS 应用程序开发,需要跳转的时候就操作一下寄存器并软件复位即可。
该仓库下所有的Bootloader
例子均使用此方法。
以正点原子探索者开发板的STM32F4
为例,将system_stm32f4xx.c
文件的SystemInit
函数修改:
1voidboot_start_application(void);
2voidSystemInit(void)
3{
4boot_start_application();
5
6...
7}
boot_start_application
的实现为:
1typedefvoid(*boot_app_func)(void);
2voidboot_start_application(void){
3__HAL_RCC_PWR_CLK_ENABLE();
4HAL_PWR_EnableBkUpAccess();
5
6RTC_HandleTypeDefRTC_Handler={0};
7RTC_Handler.Instance=RTC;
8uint32_tbkp_data=HAL_RTCEx_BKUPRead(&RTC_Handler,BOOT_BKP);
9HAL_RTCEx_BKUPWrite(&RTC_Handler,BOOT_BKP,0);
10
11if(bkp_data!=0xA5A5)return;
12
13boot_app_funcapp_func=NULL;
14uint32_tapp_addr=BOOT_APP_ADDR;
15if(((*(__IOuint32_t*)(app_addr+4))&0xff000000)!=0x08000000)return;
16
17/*栈顶地址在128KRAM间*/
18if(((*(__IOuint32_t*)app_addr)-0x20000000)>=(STM32_SRAM_SIZE*1024))return;
19
20app_func=(boot_app_func)*(__IOuint32_t*)(app_addr+4);
21/*Configuremainstack*/
22__set_MSP(*(__IOuint32_t*)app_addr);
23/*jumptoapplication*/
24app_func();
25}
设置寄存器并软件复位的实现为:
1staticvoidboot_app_enable(void){
2__disable_irq();
3RTC_HandleTypeDefRTC_Handler={0};
4RTC_Handler.Instance=RTC;
5HAL_RTCEx_BKUPWrite(&RTC_Handler,BOOT_BKP,0xA5A5);
6HAL_NVIC_SystemReset();
7}
3、RT-Thread 完整版、RT-Thread Nano 及裸机对比
3.1、RTOS 与裸机
很多人都会觉得裸机开发比 RTOS 简单并且编译出来的空间小的多,但以我的开发经验来说并非如此。
-
开发难易程度
-
裸机
裸机开发经常使用的是前后台框架,一个有多步执行操作的
task
基本上都是使用switch case
方式。一级延时很好处理只需要改变
task
的再一次进入时间即可。嵌套延时则需要加状态位并在函数中嵌套
switch case
,程序非常臃肿。 -
RTOS
RTOS 中多步操作只需按顺序调用函数即可,挂起也只需调用系统提供的 API ,代码精简且逻辑清晰。
-
资源占用
以
RT-Thread Nano
举例,官方给出的数据如下:
1在运行两个线程(main 线程+ idle 线程)情况下,ROM 和 RAM 依然保持着极小的尺寸。
2以下是基于CortexM3的MDK工程编译结果(优化等级3)
3
4TotalROSize(Code+ROData)4000(3.91kB)
5TotalRWSize(RWData+ZIData)1168(1.14kB)
6TotalROMSize(Code+ROData+RWData)4092(4.00kB)
7
从数据中可以得知资源占用并没有相差非常大。
3.2、RT-Thread 完整版与 RT-Thread Nano
许多人对于这两个的争议在于:RT-Thread 完整版
资源占用太大,小芯片用不了等等。
这里我就用事实来证明并非如此,完全可以裁剪到Nano
一样的大小,并且RT-Thread 完整版
还支持menuconfig
不需要自己添加代码文件,真香。
同时RT-Thread
还有许多纯 C 语言的不涉及硬件的软件包,使用menuconfig
拿来即用,真香。
这里我以正点原子探索者开发板bsp
为例,基于RT-Thread v4.1.0
版本,具体工程查看 RTT_Template。
-
CubeMX
生成的 MDK 工程编译结果 (优化等级 0)
1TotalROSize(Code+ROData)8120(7.93kB)
2TotalRWSize(RWData+ZIData)1832(1.79kB)
3TotalROMSize(Code+ROData+RWData)8136(7.95kB)
4
-
在运行两个线程 (main 线程 + idle 线程) 情况下的 MDK 工程编译结果 (优化等级 0), 适配了
rt_hw_console_output
1TotalROSize(Code+ROData)13256(12.95kB)
2TotalRWSize(RWData+ZIData)3136(3.06kB)
3TotalROMSize(Code+ROData+RWData)13396(13.08kB)
4
-
两者比较差值
1TotalROSize(Code+ROData)5136(5.02kB)
2TotalRWSize(RWData+ZIData)1304(1.28kB)
3TotalROMSize(Code+ROData+RWData)5260(5.14kB)
4
从上述数据可以得出结论:RT-Thread 完整版
通过裁剪可以完全媲美RT-Thread Nano
,所以首选RT-Thread 完整版
。
4、Bootloader 工程使用
tools文件夹下包含了固件打包工具和应用层固件app.bin
,起始地址为0x08080000
。
应用层分区如下:
在应用程序中下载固件需要使用ymodem_ota -p [dst]
命令,[dst]
为目标分区download_w25q
或download_onchip
。
以下工程编译结果都是基于优化等级 0
。
4.1、MinimalistBoot 使用
该工程下提供 3 个配置文件,通过ENV
工具的menuconfig
Load
配置并save
为.config
后执行scons --target=mdk5 -s
即可生成工程。
该工程未使用动态内存分配,故编译结果即为真实内存使用。
配置文件分别为:.config.minimal
、.config.w25q_qlz
和.config.shell_qlz
。
-
.config.minimal
极简Bootloader
,不支持压缩和加密类型固件,下载分区为download_onchip
。
-
.config.w25q_qlz
支持quicklz
方式压缩的固件,下载分区为download_w25q
。
-
.config.shell_qlz
支持quicklz
方式压缩的固件,升级失败可通过敲击键盘Enter
键进入Shell
,下载分区为download_onchip
。
4.2、FalBoot 使用
该工程基于FAL
组件,提供 4 个配置文件,通过ENV
工具的menuconfig
Load
配置并save
为.config
后执行scons --target=mdk5 -s
即可生成工程。
配置文件分别为:.config.minimal
、.config.dev_qlz
、.config.w25q_dev_qlz
和.config.shell_dev_qlz
。
-
.config.minimal
不支持压缩和加密类型固件,下载分区为download_onchip
。
-
.config.dev_qlz
使用了设备框架,支持quicklz
方式压缩的固件,下载分区为download_onchip
。
-
.config.w25q_dev_qlz
使用了设备框架,支持quicklz
方式压缩的固件,下载分区为download_w25q
。
-
.config.shell_dev_qlz
使用了设备框架,支持quicklz
方式压缩的固件,升级失败可通过敲击键盘Enter
键进入Shell
,下载分区为download_onchip
。
———————End———————
你可以添加微信:rtthread2020 为好友,注明:公司+姓名,拉进RT-Thread官方微信交流群!
↓点击阅读原文报名
爱我就请给我在看
-
RT-Thread
+关注
关注
31文章
1288浏览量
40114
原文标题:基于RT-Thread完整版搭建的极简Bootloader
文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论