项目背景
Agile Upgrade:用于快速构建 bootloader 的中间件。
example文件夹提供 PC 上的示例
(资料图片仅供参考)
特性
适配RT-Thread官方固件打包工具 (图形化工具及命令行工具)
使用纯 C 开发,不涉及任何硬件接口,可在任何形式的硬件上直接使用
加密、压缩支持如下:
AES256
fastlz
quicklz
原生适配file及fal操作接口
移植简单,实现自定义的后端只需适配几个操作接口
使用简单,几行代码即可实现固件升级
全过程日志输出
提供过程回调,可将过程及进度显示在自定义硬件上
基于RT-Thread 4.1.0版本
基于正点原子探索者开发板
代码地址:
https://github.com/loogg/agile_upgrade_mcu_demos
https://github.com/loogg/agile_upgrade
(请复制至外部浏览器打开)
目录结构
一般Bootloader实现的逻辑如下:
这种方式适合于简单的裸机程序或可控的 OS 程序(即所有外设硬件都可把控),在准备环境的时候将其全部关闭。
但对于一些复杂的或者 OS 中轮子已造好的程序,有一些因素不花时间研究无法把控,在准备环境时很可能就会遗漏一些未关闭导致出各种各样的问题。
这里提供一种万能方法:
- 利用芯片中的不受软件复位影响的可供用户使用的寄存器 (如 STM32 中的备份寄存器)。- 在需要跳入 APP 运行时将该寄存器赋值然后软件复位。- 在 OS 还没初始化时判断该寄存器值,如果需要跳转只需要简单的准备环境即可跳转。
该方法可以使Bootloader就作为一个 OS 应用程序开发,需要跳转的时候就操作一下寄存器并软件复位即可。
该仓库下所有的Bootloader例子均使用此方法。
以正点原子探索者开发板的STM32F4为例,将system_stm32f4xx.c文件的SystemInit函数修改:
boot_start_application的实现为:
设置寄存器并软件复位的实现为:
很多人都会觉得裸机开发比 RTOS 简单并且编译出来的空间小的多,但以我的开发经验来说并非如此。
开发难易程度
裸机
裸机开发经常使用的是前后台框架,一个有多步执行操作的task基本上都是使用switch case方式。
一级延时很好处理只需要改变task的再一次进入时间即可。
嵌套延时则需要加状态位并在函数中嵌套switch case,程序非常臃肿。
RTOS
RTOS 中多步操作只需按顺序调用函数即可,挂起也只需调用系统提供的 API ,代码精简且逻辑清晰。
资源占用
以RT-Thread Nano举例,官方给出的数据如下:
从数据中可以得知资源占用并没有相差非常大。
许多人对于这两个的争议在于:RT-Thread 完整版资源占用太大,小芯片用不了等等。
这里我就用事实来证明并非如此,完全可以裁剪到Nano一样的大小,并且RT-Thread 完整版还支持menuconfig不需要自己添加代码文件,真香。
同时RT-Thread还有许多纯 C 语言的不涉及硬件的软件包,使用menuconfig拿来即用,真香。
这里我以正点原子探索者开发板bsp为例,基于RT-Thread v4.1.0版本,具体工程查看 RTT_Template。
CubeMX生成的 MDK 工程编译结果 (优化等级 0)
在运行两个线程 (main 线程 + idle 线程) 情况下的 MDK 工程编译结果 (优化等级 0), 适配了rt_hw_console_output
X 关闭
Copyright © 2015-2022 人人造纸网版权所有 备案号:粤ICP备18023326号-36 联系邮箱:8557298@qq.com