天天观焦点:基于RT-Thread完整版搭建的极简Bootloader

2023-04-11 19:18:44    来源:面包芯语

项目背景

Agile Upgrade:用于快速构建 bootloader 的中间件。

example文件夹提供 PC 上的示例


(资料图片仅供参考)

特性

适配RT-Thread官方固件打包工具 (图形化工具及命令行工具)

使用纯 C 开发,不涉及任何硬件接口,可在任何形式的硬件上直接使用

加密、压缩支持如下:

AES256

fastlz

quicklz

原生适配filefal操作接口

移植简单,实现自定义的后端只需适配几个操作接口

使用简单,几行代码即可实现固件升级

全过程日志输出

提供过程回调,可将过程及进度显示在自定义硬件上

基于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函数修改:

boot_start_application的实现为:

设置寄存器并软件复位的实现为:

3、RT-Thread 完整版、RT-Thread Nano 及裸机对比

3.1、RTOS 与裸机

很多人都会觉得裸机开发比 RTOS 简单并且编译出来的空间小的多,但以我的开发经验来说并非如此。

开发难易程度

裸机

裸机开发经常使用的是前后台框架,一个有多步执行操作的task基本上都是使用switch case方式。

一级延时很好处理只需要改变task的再一次进入时间即可。

嵌套延时则需要加状态位并在函数中嵌套switch case,程序非常臃肿。

RTOS

RTOS 中多步操作只需按顺序调用函数即可,挂起也只需调用系统提供的 API ,代码精简且逻辑清晰。

资源占用

RT-Thread Nano举例,官方给出的数据如下:

从数据中可以得知资源占用并没有相差非常大。

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)

在运行两个线程 (main 线程 + idle 线程) 情况下的 MDK 工程编译结果 (优化等级 0), 适配了rt_hw_console_output

标签:

上一篇:

下一篇:

X 关闭

X 关闭