1. bootloader方案
类型 | 作用 | 说明 |
---|---|---|
RT_thread | BOOT | 带操作系统-使用组件-精简 |
裸机 | 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
- 开启
- 解决编译错误
问题是RTT 设备驱动的问题
自己初始化就可以
3.9 屏蔽文件,添加文件
选中文件,右键,资源配置里面
排除构建或添加构建
RTT Excluded Resource RTT排除资源 取消勾选
取消这个打勾显示隐藏的文件
3.10 RTT输出
日志输出设置
初始化
测试输出
如果输出有异常,
记得拔掉J-LINK重新插上
记得拔掉J-LINK重新插上
记得拔掉J-LINK重新插上
- 这个是自己初始化的
- 如果使用官方的注册使用流程也可以