0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

RTThread物联网操作系统 来源:未知 2023-03-10 23:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

项目背景

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

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

特性

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

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

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

  • AES256

  • fastlz

  • quicklz

  • 原生适配filefal操作接口

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

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

  • 全过程日志输出

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

  • 基于RT-Thread 4.1.0版本

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

ba4b9a28-bf56-11ed-bfe3-dac502259ad0.png

代码地址:

https://github.com/loogg/agile_upgrade_mcu_demos

https://github.com/loogg/agile_upgrade

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

  • 目录结构

ba751fc4-bf56-11ed-bfe3-dac502259ad0.png

2、Bootloader

一般Bootloader实现的逻辑如下:

ba88e0b8-bf56-11ed-bfe3-dac502259ad0.png

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

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

这里提供一种万能方法:

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

ba9a9d12-bf56-11ed-bfe3-dac502259ad0.png

该方法可以使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 简单并且编译出来的空间小的多,但以我的开发经验来说并非如此。

  1. 开发难易程度

  • 裸机

    裸机开发经常使用的是前后台框架,一个有多步执行操作的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

应用层分区如下:

bab263ca-bf56-11ed-bfe3-dac502259ad0.png

在应用程序中下载固件需要使用ymodem_ota -p [dst]命令,[dst]为目标分区download_w25qdownload_onchip

以下工程编译结果都是基于优化等级 0

4.1、MinimalistBoot 使用

该工程下提供 3 个配置文件,通过ENV工具的menuconfigLoad配置并save.config后执行scons --target=mdk5 -s即可生成工程。

该工程未使用动态内存分配,故编译结果即为真实内存使用。

配置文件分别为:.config.minimal.config.w25q_qlz.config.shell_qlz

  • .config.minimal

极简Bootloader,不支持压缩和加密类型固件,下载分区为download_onchip

babf99b4-bf56-11ed-bfe3-dac502259ad0.png

  • .config.w25q_qlz

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

badc4672-bf56-11ed-bfe3-dac502259ad0.png

  • .config.shell_qlz

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

bae3f480-bf56-11ed-bfe3-dac502259ad0.png

4.2、FalBoot 使用

该工程基于FAL组件,提供 4 个配置文件,通过ENV工具的menuconfigLoad配置并save.config后执行scons --target=mdk5 -s即可生成工程。

配置文件分别为:.config.minimal.config.dev_qlz.config.w25q_dev_qlz.config.shell_dev_qlz

  • .config.minimal

不支持压缩和加密类型固件,下载分区为download_onchip

baf60986-bf56-11ed-bfe3-dac502259ad0.png

  • .config.dev_qlz

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

bb078ae4-bf56-11ed-bfe3-dac502259ad0.png

  • .config.w25q_dev_qlz

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

bb138196-bf56-11ed-bfe3-dac502259ad0.png

  • .config.shell_dev_qlz

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

bb2902c8-bf56-11ed-bfe3-dac502259ad0.png

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

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

点击阅读原文报名

爱我就请给我在看


		


原文标题:基于RT-Thread完整版搭建的极简Bootloader

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    32

    文章

    1540

    浏览量

    44267

原文标题:基于RT-Thread完整版搭建的极简Bootloader

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RISC-V单片机快速入门02,移植RT_Thread Nano系统

    完整版是在RT_Thread Nano的基础上,增加了众多的软件包构成,同时支持众多物联网组件,是物联网开发的利器。 3.准备工作 (1)裸机源码:上一节环境搭建篇工程即可 (2)RT_
    发表于 11-10 07:23

    首搭RT-Thread程翧车控平台| RT-Thread程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    在智能汽车迈向高集成与高安全的时代,VCU/ECU开发正面临效率与可靠性的双重考验。依赖单一硬件或拼凑软件方案的传统模式,已成为制约创新的瓶颈。为此,RT-Thread带来里程碑式的解决方案
    的头像 发表于 10-31 11:53 479次阅读
    首搭<b class='flag-5'>RT-Thread</b>程翧车控平台| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    RT-Thread Studio 正式支持GD32H7高性能系列MCU | 技术集结

    RT-ThreadNano内核RT-Thread标准版完整生态全链路开发支持工程创建→代码编写→在线调试→烧录下载图形化配置让开发效率倍
    的头像 发表于 10-24 11:52 957次阅读
    <b class='flag-5'>RT-Thread</b> Studio 正式支持GD32H7高性能系列MCU | 技术集结

    请问rt-thread studio可以开发完整的mcu程序吗?

    请教一下:rt-thread studio IDE开发环境,能完整开发的rt-thread 的mcu程序吗? 好多教程的步骤: 1。在rt-thread 的开源的工程中制作BSP包,
    发表于 10-09 09:21

    2025年RT-Thread开发者巡回培训报名正式启动!

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 1135次阅读
    2025年<b class='flag-5'>RT-Thread</b>开发者巡回培训报名正式启动!

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以为修改index_all.json,发现联网的时候,会自动覆盖 另lastet版本
    发表于 09-16 06:06

    在Ubuntu上开发基于先楫MCU的RT-Thread应用指南

    1、前言RT-ThreadEnv是RT-Thread推出的开发辅助工具,针对基于RT-Thread操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的menuconfig
    的头像 发表于 08-29 12:22 1223次阅读
    在Ubuntu上开发基于先楫MCU的<b class='flag-5'>RT-Thread</b>应用指南

    【好书推荐】RT-Thread第20本相关书籍!《嵌入式实时操作系统RT-Thread原理与应用》| 技术集结

    知识与实际应用。本书内容丰富、循序渐进,涵盖从RT-Thread的基础理论到高级应用的完整知识体系,并通过大量实践案例进行讲解。全书共15章,内容包括RT-Thre
    的头像 发表于 08-24 10:05 685次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第20本相关书籍!《嵌入式实时操作系统<b class='flag-5'>RT-Thread</b>原理与应用》| 技术集结

    RT-Thread 遇上 Rust:安全内核 RusT-Thread 的诞生

    大家好,我们是中国科学技术大学操作系统原理与设计(H)课oooooS小组。这个项目是我们的课程大作业:参考RT-Thread架构,使用Rust搭建一个原生的嵌入式操作系统内核。初识Rust是因为xk
    的头像 发表于 08-02 11:03 3206次阅读
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全内核 RusT-<b class='flag-5'>Thread</b> 的诞生

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    6月底,RT-Thread睿赛德受邀参与由上海开源信息技术协会主办的2025上海开源创新精英荟。上海市商委副主任张杰出席会议并致辞。RT-Thread嵌入式操作系统项目凭借其卓越的技术创新与开源生态
    的头像 发表于 07-04 09:04 2420次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    揭秘RT-Thread上的AUTOSAR CP系统

    本文探讨了RT-Thread与AUTOSARCP的融合,解决车载ECU开发中实时性、安全性与灵活性的平衡问题。通过分层安全内核(rt-safetyos/autoos)和工具链整合,兼容AUTOSAR
    的头像 发表于 06-23 20:22 2939次阅读
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系统

    2025 RT-Thread全球技术大会议程正式发布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技术大会)是聚焦基础软件技术创新与实践的嵌入式技术盛会,持续推动技术价值转化
    的头像 发表于 05-27 19:28 1065次阅读
    2025 <b class='flag-5'>RT-Thread</b>全球技术大会议程正式发布!

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 1059次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进

    电源电路实用设计手册—电子档完整版

    全文完整版电子档点击下方附件下载获取!
    发表于 03-14 10:11

    如何将RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植到NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 2431次阅读
    如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上