当前位置: 首页 > article >正文

固件升级之Bootloader(三)

1. bootloader方案

类型作用说明
RT_threadBOOT带操作系统-使用组件-精简
裸机BOOT精简
  • 关于bootloader的软件方案要求
  • 第一点要求必须占用资源小
  • 易于移植扩展
  • 方便灵活修改
  • 带操作系统与裸机之争
  • 上面这点的解决方案是易于移植,不管是裸机或操作系统
  • 把功能性文件放在同一个.c .h 文件中
  • 逻辑函数封装好即可

2. 资料整理

2.1 开源 Bootloader 框架 - RT-FOTA

RT-Thread 官方推出了 STM32 系列单片机的通用 bootloader, 在其网站可以通过网页配置就可以生成 bootloader 的烧录文件,使广大嵌入式工程师不用编写一行代码,就能够轻松完成自己产品的 bootloader 功能。但是由于 RTT 官方的 bootloader 软件 RT-OTA 是商用性质,不公开源码,不仅仅限制了在其他平台的移植,而且也不方便加入产品的特定功能。本人软件水平有限,但是基于对开源精神的崇拜和 RTT 多年的感情,蒙发出利用业余时间编写一款开源的且基于 RTT 系统 bootloader 通用软件,贡献给大家。

【RT-FOTA 主要的功能】
支持 RTT 官方的 RBL 打包软件,使用方式也一致。目前支持包括 CRC32、AES256、quicklz 和 fastlz 功能;
支持命令行模式(FINSH 组件)和出厂固件恢复;
支持 FLASH 分区(FAL 组件);
支持功能扩展(RTT 组件);
其他功能可自行方便扩展;

原始工程编译大小
Program Size: Code=74574 RO-data=8910 RW-data=636 ZI-data=14836

占用flash:74574+8910+636 = 84120 = 82k
占用ram: 636+14836 = 15472 = 15k

可以看出这个资源占用挺大的
超出一般的BOOT容量大小

这个裁剪的话价值不大
不如自己写

可以参考借鉴
所以不选用

2.2 STM32 通用 Bootloader RT_thread

在这里插入图片描述

在这里插入图片描述

功能虽好,但是不支持自由修改逻辑,芯片型号支持少
这一点很不灵活
所以不选用
但是可以学习一下这些功能,
师夷长技以制夷

2.3 rtthread新建工程

自己新建一个工程
然后添加修改
这样灵活性最大
方便维护扩展

软件方案组成
RT_thread+组件+用户逻辑

2.4 Quick bootloader

Quick bootloader 是一个用于快速制作bootloader的组件
在这里插入图片描述

在这里插入图片描述
组件可以裁剪使用
功能设计的挺全面的

获取组件
方式1: 通过 Env配置工具 或 RT-Thread studio 开启软件包,根据需要配置各项参数;
配置路径为 RT-Thread online packages -> system -> qboot
注意:
这个是带操作系统的,必然占用ROM大
所以放弃

2.5 FAT组件

在这里插入图片描述
在这里插入图片描述

2.6 SFUD

在这里插入图片描述
在这里插入图片描述

2.7 EasyFlash

在这里插入图片描述

2.8 理解

在这里插入图片描述
这张图很好理解
三者的关系

看到鸡汤喝点
在这里插入图片描述
人只要成功一次,就能换一顶帽子,

3. 新建工程开始操作

  • 参考链接
  • https://blog.csdn.net/qq_33591039/article/details/121562204

3.1 新建工程

在这里插入图片描述

3.2 构建编译

在这里插入图片描述
可以看到FLASH占用55K , RAM占用5K
需要裁剪

  • BOOT硬件
  • 硬件SPI四个引脚
  • 一个LED引脚

3.3 设置CubeMX

设置flash使用的SPI
设置LED使用的GPIO
设置 NVIC
RT-Thread 操作系统重定义
HardFault_Handler、PendSV_Handler、SysTick_Handler 中断函数,
为了避免重复定义的问题,在生成工程之前,需要在中断配置中,代码生成的选项中,
取消选择三个中断函数(
对应注释选项是 Hard fault interrupt, Pendable request, Time base :System tick timer)

3.4 解决报错

  • 关于SConscript 文件的修改网上有很多资料
  • 语法不深究

报错:
描述 资源 路径 位置 类型
fatal error: stm32l0xx_hal_exti.h: No such file or directory stm32l0xx_hal_conf.h /boot/cubemx/Inc 第 192 行 C/C++ 问题
问题:
CUBEMX是新版的,生成的hal_confg.h里面带了#include stm32f1xx_hal_exti.h
但是RTT里面的是库不是最新的,里面没有这个文件,所以就报错了
解决:
可以屏蔽掉或者找一个文件放进去
#ifdef HAL_EXTI_MODULE_ENABLED
// #include “stm32l0xx_hal_exti.h”
#endif /* HAL_EXTI_MODULE_ENABLED */

3.5 再次编译

在这里插入图片描述
可以看到资源占用挺大,需要裁剪

3.6 rt_thread setting

在这里插入图片描述

关掉不必要的系统设置
编译后大小
RAM: 3.59k
ROM: 13.9K
这个快14K了,资源占用太大了,这种方式放弃

3.7 优化等级

参考链接
https://gitee.com/rtthread/docs-online/blob/master/rt-thread-version/rt-thread-standard/application-note/system/optimization/Optimize-code-size/an0049-optimize-code-size.md

RT-Thread-Studio 使用的是 GCC 编译器,GCC 编译器对代码的编译优化有一系列的配置项,大体分为五个优化等级:-O0、-O1、-O2、-O3 和 -Os。

-O0:关闭所有优化选项,是 GCC 默认的等级,目的是让编译器减少编译时间并使调试产生预期的结果。在 RT-Thread-Studio 中,默认也是配置的该选项,如果编译的代码尺寸较大,我们建议更换优化等级(一般我们会选择 O2 等级)。

-O1:这是最基本的优化等级。编译器会在不花费太多编译时间的同时试图生成更快更小的代码。这些优化是非常基础的,但一般这些任务肯定能顺利完成。

-O2:O1 的进阶。这是推荐的优化等级,除非你有特殊的需求。O2 会比 O1 启用更多的优化选项。当设置了 O2 等级后,编译器会试图增加编译的时间和提升生成代码的性能(我们一般选用此优化等级完成编译任务)。

-O3:这是最高的优化等级,O3 开启了 O2 指定的所有优化,并启用了更多的优化选项。例如构建用于保存变量的伪寄存器网络(使得调试更加困难)、优化循环执行过程等。开启 O3 优化不一定会减少代码尺寸,有可能会为了减少代码执行时间反而增加代码体积。一般我们不使用此优化等级。

-Os:该这个等级用来优化代码尺寸。其中启用了 O2 中不增加目标文件大小的优化选项。这对于磁盘空间极其紧张或者 CPU 缓存较小的机器非常有用。一般使用 O2 等级之后发现生成的目标文件尺寸偏大,可以尝试使用 Os 等级进一步的优化。下表是GCC 优化等级列表。

3.8 SEGGER RTT

  1. 开启
    在这里插入图片描述
  2. 解决编译错误

在这里插入图片描述

在这里插入图片描述

问题是RTT 设备驱动的问题
自己初始化就可以

3.9 屏蔽文件,添加文件

选中文件,右键,资源配置里面
排除构建或添加构建
RTT Excluded Resource RTT排除资源 取消勾选
在这里插入图片描述

取消这个打勾显示隐藏的文件

3.10 RTT输出

日志输出设置
在这里插入图片描述
初始化
在这里插入图片描述
测试输出
在这里插入图片描述
如果输出有异常,
记得拔掉J-LINK重新插上
记得拔掉J-LINK重新插上
记得拔掉J-LINK重新插上

  • 这个是自己初始化的
  • 如果使用官方的注册使用流程也可以

http://www.kler.cn/news/310754.html

相关文章:

  • SpringBoot基础实战系列(二)springboot解析json与HttpMessageConverter
  • 利用echarts 显示图片信息
  • PathoDuet: HE 和 IHC 染色病理切片分析的基础模型|文献速递-Transformer架构在医学影像分析中的应用
  • PHP 环境搭建教程
  • Gin渲染
  • 变电站缺陷数据集8307张,带xml标注和txt标注,可以直接用于yolo训练
  • 基于深度学习的零售柜商品识别系统实战思路
  • 阅信云CTO向永清:35岁不应该成为技术职业发展的瓶颈|OceanBase 《DB大咖说》
  • Elasticsearch知识点整理
  • 【计算机毕业设计】医院电子病历
  • 线程池的执行流程
  • Java中的语法糖:让编程更简洁的特性
  • neo4j安装为服务+配置环境变量
  • linux之mysql安装
  • pip清华源地址
  • Vue 自定义指令实战
  • Vue 常见的几种通信方式(总结)
  • ShouldSniffAttr解说
  • Linux: debug:dump_stack 实例
  • 极狐GitLab 重要安全版本:17.3.3, 17.2.7, 17.1.8, 17.0.8, 16.11.10
  • C#使用HttpWebRequest下载文件
  • Java通信协议——UDP通信协议,模拟聊天室(完整详解,附有代码)
  • android含有EditText的键盘弹出后界面的正确处理
  • 人工智能 | 基于ChatGPT开发人工智能服务平台
  • 单片机嵌入式编程中常用技术点
  • Python基础 | 在虚拟环境中安装并在指定文件夹中打开Jupyter notebook
  • Java在零工市场中的应用:构建灵活高效的劳动力平台
  • 【算法】局部敏感哈希(LSH):高效解决相似性搜索问题的利器
  • html页面整合vue2或vue3
  • 选择适合你企业发展的服务器