基于RT-Thread完整版搭建的极简Bootloader

news2024/11/15 19:54:17

项目背景

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

  • example 文件夹提供 PC 上的示例

特性

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

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

  3. 加密、压缩支持如下:

  •  AES256

  •  fastlz

  •  quicklz

原生适配 file 及 fal 操作接口

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

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

全过程日志输出

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

基于 RT-Thread 4.1.0 版本

基于正点原子探索者开发板

040ee0bbbbc1248d8d272fafb30516c4.png

代码地址:

https://github.com/loogg/agile_upgrade_mcu_demos

https://github.com/loogg/agile_upgrade

(请复制至外部浏览器打开)

  • 目录结构

ec722c7ed47e6cb604c40ed1f7f59d8d.png

2、Bootloader

一般 Bootloader 实现的逻辑如下:

bcc5fa3c16b9e77129f9755a7a4ea7f5.png

这种方式适合于简单的裸机程序或可控的 OS 程序(即所有外设硬件都可把控),在准备环境的时候将其全部关闭。

但对于一些复杂的或者 OS 中轮子已造好的程序,有一些因素不花时间研究无法把控,在准备环境时很可能就会遗漏一些未关闭导致出各种各样的问题。

这里提供一种 万能 方法:

- 利用芯片中的不受软件复位影响的可供用户使用的寄存器 (如 STM32 中的备份寄存器)。
- 在需要跳入 APP 运行时将该寄存器赋值然后软件复位。
- 在 OS 还没初始化时判断该寄存器值,如果需要跳转只需要简单的准备环境即可跳转。

44e3e07cd187d32ae936c739702e6956.png

该方法可以使 Bootloader 就作为一个 OS 应用程序开发,需要跳转的时候就操作一下寄存器并软件复位即可。

该仓库下所有的 Bootloader 例子均使用此方法。

以正点原子探索者开发板的 STM32F4 为例,将 system_stm32f4xx.c 文件的 SystemInit 函数修改:

1void boot_start_application(void);
2void SystemInit(void)
3{
4  boot_start_application();
5
6  ...
7}

boot_start_application 的实现为:

1typedef void (*boot_app_func)(void);
 2void boot_start_application(void) {
 3    __HAL_RCC_PWR_CLK_ENABLE();
 4    HAL_PWR_EnableBkUpAccess();
 5
 6    RTC_HandleTypeDef RTC_Handler = {0};
 7    RTC_Handler.Instance = RTC;
 8    uint32_t bkp_data = HAL_RTCEx_BKUPRead(&RTC_Handler, BOOT_BKP);
 9    HAL_RTCEx_BKUPWrite(&RTC_Handler, BOOT_BKP, 0);
10
11    if (bkp_data != 0xA5A5) return;
12
13    boot_app_func app_func = NULL;
14    uint32_t app_addr = BOOT_APP_ADDR;
15    if (((*(__IO uint32_t *)(app_addr + 4)) & 0xff000000) != 0x08000000) return;
16
17    /* 栈顶地址在 128K RAM 间 */
18    if (((*(__IO uint32_t *)app_addr) - 0x20000000) >= (STM32_SRAM_SIZE * 1024)) return;
19
20    app_func = (boot_app_func) * (__IO uint32_t *)(app_addr + 4);
21    /* Configure main stack */
22    __set_MSP(*(__IO uint32_t *)app_addr);
23    /* jump to application */
24    app_func();
25}

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

1static void boot_app_enable(void) {
2    __disable_irq();
3    RTC_HandleTypeDef RTC_Handler = {0};
4    RTC_Handler.Instance = RTC;
5    HAL_RTCEx_BKUPWrite(&RTC_Handler, BOOT_BKP, 0xA5A5);
6    HAL_NVIC_SystemReset();
7}

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

3.1、RTOS 与裸机

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

  1. 开发难易程度

  • 裸机

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

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

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

  • RTOS

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

资源占用

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

1在运行两个线程 (main 线程 + idle 线程) 情况下,ROM 和 RAM 依然保持着极小的尺寸。
2以下是基于 Cortex M3 的 MDK 工程编译结果 (优化等级 3)
3
4Total RO  Size (Code + RO Data)                 4000 (   3.91kB)
5Total RW  Size (RW Data + ZI Data)              1168 (   1.14kB)
6Total ROM Size (Code + RO Data + RW Data)       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)

1Total RO  Size (Code + RO Data)                 8120 (   7.93kB)
2Total RW  Size (RW Data + ZI Data)              1832 (   1.79kB)
3Total ROM Size (Code + RO Data + RW Data)       8136 (   7.95kB)
4
  • 在运行两个线程 (main 线程 + idle 线程) 情况下的 MDK 工程编译结果 (优化等级 0), 适配了 rt_hw_console_output

1Total RO  Size (Code + RO Data)                13256 (  12.95kB)
2Total RW  Size (RW Data + ZI Data)              3136 (   3.06kB)
3Total ROM Size (Code + RO Data + RW Data)      13396 (  13.08kB)
4
  • 两者比较差值

1Total RO  Size (Code + RO Data)                 5136 (   5.02kB)
2Total RW  Size (RW Data + ZI Data)              1304 (   1.28kB)
3Total ROM Size (Code + RO Data + RW Data)       5260 (   5.14kB)
4
从上述数据可以得出结论:RT-Thread 完整版 通过裁剪可以完全媲美 RT-Thread Nano,所以首选 RT-Thread 完整版。

4、Bootloader 工程使用

tools 文件夹下包含了固件打包工具和应用层固件 app.bin,起始地址为 0x08080000

应用层分区如下:

d067038308654b73723decc3bab766b2.png

在应用程序中下载固件需要使用 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

68d85a65d1883698ca7b515a02719c26.png

  • .config.w25q_qlz

支持 quicklz 方式压缩的固件,下载分区为 download_w25q

b29e493cf8d7a7ccda75bd8ddfd3a467.png

  • .config.shell_qlz

支持 quicklz 方式压缩的固件,升级失败可通过敲击键盘 Enter 键进入 Shell,下载分区为 download_onchip

7a39e5fb501e64b54a9e59f42a8b09c2.png

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

18b491861f62f59128afc5b90bf73086.png

  • .config.dev_qlz

使用了设备框架,支持 quicklz 方式压缩的固件,下载分区为 download_onchip

f1a76628e8b1fd9ef616ca9d7a3cf0c0.png

  • .config.w25q_dev_qlz

使用了设备框架,支持 quicklz 方式压缩的固件,下载分区为 download_w25q

4903e2cbadb641f1155ae4ace800aee9.png

  • .config.shell_dev_qlz

使用了设备框架,支持 quicklz 方式压缩的固件,升级失败可通过敲击键盘 Enter 键进入 Shell,下载分区为 download_onchip

c4ae43b8d64c337c503247b1a334dc24.png

———————End———————

你可以添加微信:rtthread2020 为好友,注明:公司+姓名,拉进RT-Thread官方微信交流群!

bb9b273ce37fa2c85b3d47514f8b3fbc.gif

点击阅读原文报名

爱我就请给我在看7142721a9a984687e2fc830c9e1b6ffd.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python抓取数据具体流程

之前看了一段有关爬虫的网课深有启发,于是自己也尝试着如如何过去爬虫百科“python”词条等相关页面的整个过程记录下来,方便后期其他人一起来学习。 抓取策略 确定目标:重要的是先确定需要抓取的网站具体的那些部分,下面实例是…

MySQL Buffer Pool 详解

1. Buffer Pool 概述 Buffer Pool 到底是什么?从字面上看是缓存池的意思,没错,它其实也就是缓存池的意思。它是MySQL当中至关重要的一个组件,可以这么说,MySQL的所有的增删改的操作都是在 Buffer Pool 中执行的。 但…

90%的人都不算会爬虫,这才是真正的技术,从0到高手的进阶

很多人以为学会了urlib模块和xpath等几个解析库,学了Selenium就会算精通爬虫了,但到外面想靠爬虫技术接点私活,才发现寸步难行。 龙叔我做了近20年的程序员,今天就告诉你,真正的爬虫高手应该学哪些东西,就…

相向双指针 leetcode 15 16 18 611

简单介绍 与同向双指针区别就是&#xff0c;同向查找的是子串最明显得区别就是两侧进行搜索比较快 基本得模板如下 while(left < right) {if( ){}else if(){}else{ // left与right得遍历while(){}} }具体以题目为例 两数之和比较简单 不展示了 leetcode 15 三数之和 这个…

NOC·核桃编程马拉松复赛低年级组 A 卷真题

1. 舞台区如下所示,角色足球的初始坐标为(0,0)。等待下图程序运行完毕后,足 球的坐标是多少?( ) A(100,100) B(-100,100) C(100,-100) D(0,0) 2. 亮亮设计了一个“击落陨石”的游戏。点击开始按钮后,陨石会出现在舞台区的随机位置,碰到炸弹后就会消失…

webrtc处理视频丢包的机制

1.摘要WebRTC是一个开源的实时交互式音频和视频通信框架。本文讨论了WebRTC中用于处理视频通信路径中数据包丢失的一些机制。讨论了各种系统细节&#xff0c;提出了一种基于时间层的自适应混合NACK/FEC方法。结果显示了该方法如何控制实时视频通信的质量权衡2.介绍WebRTC[1]是一…

特征工程——Tabular Data Features multimodal features

一、前言 机器学习时期&#xff0c;要花费大量的时间在特征设计上&#xff0c;好的输入数据可以让训练事半功倍。而有了深度学习后&#xff0c;神经网络可以自动实现特征提取&#xff0c;解放了手工(理论上是这样&#xff0c;实际也是要进行特征筛选的&#xff0c;因为在应用中…

小程序容器技术在微服务架构中的应用

随着移动互联网的发展&#xff0c;小程序已经成为了一种非常流行的应用方式&#xff0c;它可以在不安装任何应用的情况下&#xff0c;直接在移动终端设备&#xff08;如&#xff1a;App&#xff0c;iPad等&#xff09;中运行。微服务架构则是一种的分布式系统架构&#xff0c;可…

Ubuntu16.04 源码安装nginx

nginx源码包&#xff1a;http://nginx.org/download/ 目录1.可联网设备直接通过apt-get安装2.不可联网设备通过安装包编译和移植2.1 首先选择一台可联网的设备2.2 将编译好的文件夹拷贝到目标设备上问题&#xff1a;nginx启动 nginx: [emerg] bind() to 0.0.0.0:80 failed (98:…

机器学习100天(三十四):034 先验概率、条件概率

《机器学习100天》完整目录:目录 机器学习100天,今天讲的是:先验概率、条件概率。 一、先验概率、条件概率 机器学习中,我们经常听到两个数学概念:先验概率、后验概率。抛开复杂数学公式不谈,我们通过一个实际的例子来帮助大家理解这两种概率。 最近天气炎热,红色石头…

问题三十四:傅立叶变换——高通滤波

高通滤波器是一种可以通过去除图像低频信息来增强高频信息的滤波器。在图像处理中&#xff0c;高通滤波器常常用于去除模糊或平滑效果&#xff0c;以及增强边缘或细节。在本篇回答中&#xff0c;我们将使用Python和OpenCV实现高通滤波器。 Step 1&#xff1a;加载图像并进行傅…

JVM系统优化实践(6):年轻代、老年代与数据计算

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;上回说道如果当前Survivor区中年龄相同的一批对象总大小 ≥ Survivor总数 50%&#xff0c;那么这批对象及比它们年龄更大的对象&#xff0c;就都直接进入老年代。…

三八女神节有哪些数码好物?2023年三八女神节数码好物清单

2023年的三八女神节就快到了&#xff0c;大家还在烦恼&#xff0c;不知道有哪些数码好物&#xff1f;在此&#xff0c;我来给大家分享几款三八女神节实用性强的数码好物&#xff0c;一起来看看吧。 一、蓝牙耳机&#xff1a;南卡小音舱 参考价&#xff1a;239 推荐理由&…

flutter window安装过程

这里写自定义目录标题#下载相关官网地址&#xff1a;https://flutter.cn/docs/get-started/install/windows 根据官网下载相关包flutter_windows_3.7.5-stable.zip 解压到c盘&#xff0c;在path配置相关解压路径(c:\flutter)。 执行 where flutter dart &#xff0c;发现没有提…

Pytorch深度学习实战3-5:详解计算图与自动微分机(附实例)

目录1 计算图原理2 基于计算图的传播3 神经网络计算图4 自动微分机5 Pytorch中的自动微分5.1 梯度缓存5.2 参数冻结1 计算图原理 计算图(Computational Graph)是机器学习领域中推导神经网络和其他模型算法&#xff0c;以及软件编程实现的有效工具。 计算图的核心是将模型表示…

Vue3 企业级项目实战:项目须知与课程约定

本节内容很重要&#xff0c;希望大家能够耐心看完。 Vue3 企业级项目实战 - 程序员十三 - 掘金小册Vue3 Element Plus Spring Boot 企业级项目开发&#xff0c;升职加薪&#xff0c;快人一步。。「Vue3 企业级项目实战」由程序员十三撰写&#xff0c;2744人购买https://s.ju…

解决方案| anyRTC 融合其他厂商视频会议系统方案

背景 视频会议市场经历疫情后&#xff0c;不管是硬件视频会议还是云视频会议已经在各行各业铺开使用&#xff0c;特别是政府行业&#xff0c;职能部门除了几大硬件视频会议外&#xff0c;也开始逐渐尝试云视频会议&#xff0c;视频会议的场景运用除了日常的交流、沟通、学习外…

开启互联网赚钱模式

随着互联网的发展&#xff0c;现在几乎会玩手机和电脑的都离不开网络&#xff0c;自然出现了很多网络赚钱的项目&#xff0c;受到了很多新人创业者和做副业兼职者的欢迎。很多朋友都想利用电脑或手机在网上赚钱。其实不管做什么项目&#xff0c;都有一个过程&#xff0c;没有什…

【监控】Linux部署postgres_exporter及PG配置(非Docker)

目录一、下载及部署二、postgres_exporter配置1. 停止脚本stop.sh2. 启动脚本start.sh3. queries.yaml三、PostgreSQL数据库配置1. 修改postgresql.conf配置文件2. 创建用户、表、扩展等四、参考一、下载及部署 下载地址 选一个amd64下载 上传至服务器&#xff0c;解压 tax…

$ 6 :选择、循环

if-else语句 #include <stdio.h> //判断输入值是否大于0 int main() {int i;while (scanf("%d",&i)){if (i > 0)//不要在括号后加分号{printf("i is bigger than O\n");}else {printf("i is not bigger than O\n");}}return O; } …