RT-Thread 使用HTTP固件下载方式进行OTA远程升级

news/2024/9/17 7:18:07/ 标签: http, stm32, 嵌入式硬件, OTA

参考资料:RT-T官网资料如下链接所示

STM32通用Bootloader (rt-thread.org)

1.app程序env配置过程

参考上述资料中"制作 app 固件"章节,分区大小根据自己设备而定,以下是我以407VET6为例设置的fal分区

https://i-blog.csdnimg.cn/direct/012a61a62a1b476286e8d79e0e16dc32.png" width="562" />

https://i-blog.csdnimg.cn/direct/4f098aff07d440eba44af941a40e3e5a.png" width="899" />

notes:上述分区是由片内flash(on-chip)和外部flash(W25Q64)两部分分区构成,关于外部flash的配置和使用参考文章"RT-T下使用easyflash的配置过程_rtthread easyflash-CSDN博客"

我使用的工程逻辑是先把升级文件通过HTTP下载到外部flash"download"分区中,然后跳转到bootloat里面进行升级;

2.制作bootload bsp工程

在env中进行配置和裁剪功能,主要包括FAL相关配置、on-chip、spi、agile_upgrade相关配置,尽量裁剪到最简:

2.1 关于FAL相关配置、on-chip、spi等相关配置参考文章 RT-T下使用easyflash的配置过程_rtthread easyflash-CSDN博客

2.2 agile_upgrade配置

https://i-blog.csdnimg.cn/direct/78b0e93c30a44cfdb468820262104677.png" width="891" />​

https://i-blog.csdnimg.cn/direct/1081ce5c478c41ec8a9040596ef3fd61.png" width="944" />​

2.3 修改main函数

下边是部分参考代码

#include "main.h"
#include "fal.h"
#include <agile_upgrade.h>#define DBG_TAG "main"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>//app启动地址
#define BOOT_APP_ADDR 0x08010000extern const struct agile_upgrade_ops agile_upgrade_fal_ops;static uint32_t _written_len = 0;
static uint32_t _total_len = 0;static void step_hook(int step) { LOG_D("step: %d\r\n", step); }static void error_hook(int step, int code) { LOG_E("step: %d, err: %d\r\n", step, code); }static void progress_hook(uint32_t cur_size, uint32_t total_size) {_written_len = cur_size;_total_len = total_size;
}void qbt_jump_to_app(void)
{typedef void (*app_func_t)(void);u32 app_addr = BOOT_APP_ADDR;u32 stk_addr = *((__IO uint32_t *)app_addr);app_func_t app_func = (app_func_t)(*((__IO uint32_t *)(app_addr + 4)));if ((((u32)app_func & 0xff000000) != 0x08000000) || ((stk_addr & 0x2ff00000) != 0x20000000)){LOG_E("No legitimate application.");return;}LOG_I("Jump to application running ... \n");rt_thread_mdelay(200);__disable_irq();for(int i=0; i<128; i++){__NVIC_DisableIRQ((IRQn_Type)i);__NVIC_ClearPendingIRQ((IRQn_Type)i);}SysTick->CTRL = 0;SysTick->LOAD = 0;SysTick->VAL = 0;__set_CONTROL(0);__set_MSP(stk_addr);app_func();//Jump to application runningLOG_E("Qboot jump to application fail.");
}int main(void)
{agile_upgrade_set_step_hook(step_hook);agile_upgrade_set_error_hook(error_hook);agile_upgrade_set_progress_hook(progress_hook);agile_upgrade_t src_agu = {0};src_agu.name = "download";src_agu.user_data = "download";src_agu.ops = &agile_upgrade_fal_ops;agile_upgrade_t dst_agu = {0};dst_agu.name = "app";dst_agu.user_data = "app";dst_agu.ops = &agile_upgrade_fal_ops;agile_upgrade_release(&src_agu, &dst_agu, 1);LOG_D("Written len: %u, total len: %u\r\n", _written_len, _total_len);qbt_jump_to_app();return 0;
}

3.实现http远程升级

参考上述资料中"更多固件下载方式"章节,以下是配置

https://i-blog.csdnimg.cn/direct/1b0f57e43d4f4fc7955451b78c9b609b.png" width="905" />​

https://i-blog.csdnimg.cn/direct/af9728dbfe294c2c81aadc16a328470a.png" width="850" />​3.1 在控制台执行命令"http_ota http://xxx/xxx/rtthreadf.rbl “,url更换成自己的https://i-blog.csdnimg.cn/direct/355a26085f324a688fbc6d448bef8bab.png" width="1003" />​

4.遇到的问题

4.1bootload程序编译报错

原因:link.sct文件中设置的内存大小为64k,但是编译后生成的code代码大小已经68k左右

https://i-blog.csdnimg.cn/direct/b8af07ff306e43ba8d1d1b491349aea9.png" width="720" />​

解决:1.设置优化等级;2.对冗余函数的优化

优化后code代码在40k左右

参考资料:关于ARM Keil5 Optimization level 优化等级的一些分析_keil optimization_夜星辰2023的博客-CSDN博客

MDK中One ELF Section per Function选项功能探究_iceiilin的博客-CSDN博客

4.2 bootload程序进入死循环,没有跳转到app分区

原因:

        4.2.1 程序中通过万能驱动,spi通讯查找外部flash(W25Q16设备失败);

        4.2.2 只在"stm32f4xx_hal_msp.c“中修改spi1相关引脚配置,其他地方可能没有进行配置;

解决:通过STM32CubeMX配置spi1并生成工程

4.3 跳转到app分区后程序不能正常运行

原因:app分区地址设置错误导致修改中断向量表的跳转基地址错误

解决:#define RT_APP_PART_ADDR 0x08010000 0x10000:64k

https://i-blog.csdnimg.cn/direct/2bb3a180dc7a494fa61ec76af8d4c3f3.png" width="973" />​

AT32开发板中直接修改中断向量表 改为 0x10000

#define VECT_TAB_OFFSET 0x10000

STM32中通过函数实现:

/*** Function    ota_app_vtor_reconfig* Description Set Vector Table base location to the start addr of app(RT_APP_PART_ADDR).
*/
static int ota_app_vtor_reconfig(void)
{#define NVIC_VTOR_MASK   0x3FFFFF80/* Set the Vector Table base location by user application firmware definition */SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK;//此处代码的作用是修改中断向量表的跳转基地址return 0;
}
INIT_BOARD_EXPORT(ota_app_vtor_reconfig);

4.4在控制台通过"http_ota http://xxx/xxx/rtthreadf.rbl “升级失败问题

https://i-blog.csdnimg.cn/direct/6f0aa1dbd25a437f8d1755ea22461e38.png" width="614" />

https://i-blog.csdnimg.cn/direct/dea90b850d674137aa990665e6ba234b.png" width="1200" />

解决:修改webclient.c文件两个地方

4.4.1 添加"rt_thread_mdelay(10);"https://i-blog.csdnimg.cn/direct/067e08cf466f42e1979f2a74a1e8835a.png" width="1164" />

4.4.2 在1160行添加else

https://i-blog.csdnimg.cn/direct/21197a2dd9164b80a0d815ba199feee6.png" width="990" />

4.5 http升级后在bootload中写往"app"分区写程序失败

现象分析:从http服务器上获取后,开始升级,跳转到bootload中后,从"download"分区往"app"分区搬运程序,写入失败,从新用jlink烧录程序卡死到这一步,如下图所示:

https://i-blog.csdnimg.cn/direct/f3a9f2b073674a588a19fa49ba88ad50.png" width="1003" />

原因:雅特力单片机不同型号,FLAH大小不同,扇区大小也不同,如下图所示为flash大小为4032K和1024K大小的扇区大小

https://i-blog.csdnimg.cn/direct/2aa072e5654d4d27a89b6e1a0918d272.png" width="1078" />

https://i-blog.csdnimg.cn/direct/9a6162f3aa81450389cf4ec7f7341297.png" width="1048" />

解决:修改board.h文件中FLASH_PAGE_SIZE大小

https://i-blog.csdnimg.cn/direct/7e464ad7105f4cf3b08b6dec444d6043.png" width="868" />


http://www.ppmy.cn/news/1522576.html

相关文章

科研绘图系列:R语言差异基因四分图(Quad plot)

文章目录 介绍加载R包导入数据数据预处理画图参考介绍 四分图(Quad plot)是一种数据可视化技术,通常用于展示四个变量之间的关系。它由四个子图组成,每个子图都显示两个变量之间的关系。四分图的布局通常是2x2的网格,每个格子代表一个变量对的散点图。 在四分图中,通常…

2024数学建模国赛选题建议+团队助攻资料(已更新完毕)

目录 一、题目特点和选题建议 二、模型选择 1、评价模型 2、预测模型 3、分类模型 4、优化模型 5、统计分析模型 三、white学长团队助攻资料 1、助攻代码 2、成品论文PDF版 3、成品论文word版 9月5日晚18&#xff1a;00就要公布题目了&#xff0c;根据历年竞赛题目…

clickhouse-v24.1-离线部署

部署版本 数据库版本&#xff1a;24.1.1.2048 jdk版本&#xff1a;jdk8 4个文件&#xff08;三个ck的包&#xff09;&#xff1a; OpenJDK8U-jdk_x64_linux_hotspot_8u382b05.tar clickhouse-client-24.1.1.2048.x86_64.rpm clickhouse-common-static-24.1.1.2048.x86_64.…

Unity之获取Avpro视频画面并在本地创建缩略图

一、效果 获取StreamingAssets文件夹下的所有视频&#xff08;包含其子文件夹&#xff09;&#xff0c;获取指定时间的视频画面&#xff0c;然后将图片保存到本地磁盘中。 二、关于Avpro的事件监听 当指定视频时间进度时会触发FinishedSeeking&#xff0c;代表加载完成这时我们…

muduo 网络库学习项目引入 Boost 依赖

文章目录 下载 [Boost 源码库](https://www.boost.org/)编译通过 CMake 引入 Boost 项目Boost 链接库指引文档的问题 muduo 这个项目比较老旧了&#xff0c;但是仍然是学习网络库实现的一个不错的参考&#xff0c;所以还是得看看书自己动手实践一下。 没想到跟着书上的代码练手…

2024国赛数学建模备赛|30种常用的算法模型之最优算法-非线性规划

1.1 非线性规划的实例与定义 如果目标函数或约束条件中包含非线性函数&#xff0c;就称这种规划问题为非线性规划问题。一般说来&#xff0c;解非线性规划要比解线性规划问题困难得多。而且&#xff0c;也不象线性规划有 单纯形法这一通用方法&#xff0c;非线性规划目前还没…

SpringBoot3+Vue3开发商店上货管理系统

系统介绍 上货管理系统是专门为各种类型商店打造的一款进货管理系统。针对整个商店进货流程&#xff0c;提供很多方便功能&#xff0c;帮助店家完成上货流程。比如上货清单管理功能、上货清单确认功能、供货商管理功能、商品管理功能等。 技术栈 后端&#xff1a;SpringBoot…

Spark MLlib模型训练—回归算法 Factorization Machines Regression

Spark MLlib模型训练—回归算法 Factorization Machines Regression 在大数据与机器学习领域,推荐系统、广告点击率预测以及评分预测等应用场景中,经常涉及到高度稀疏的特征数据,这对传统的回归模型提出了挑战。因子分解机(Factorization Machines, FMs)是一种广泛应用于…

python例子:相片处理工具(可视化)

作品名称&#xff1a;相片处理工具&#xff08;可视化&#xff09; 开发环境&#xff1a;PyCharm 2023.3.4 python3.7 用到的库&#xff1a;sys、os、cv2、numpy、math和random 作品简介&#xff1a;运行例子后&#xff0c;先选择需要处理的图片&#xff0c;然后可对图片进…

深入了解CSS混合模式

CSS混合模式&#xff08;也称为CSS Blend Modes&#xff09;是一种强大的功能&#xff0c;它允许开发者在CSS中控制元素如何与它们的背景或其他元素混合。这些模式类似于图像编辑软件&#xff08;如Photoshop&#xff09;中的混合模式&#xff0c;使得开发者能够创建出复杂而富…

vulhub Thinkphp5 2-rce远程代码执行漏洞

1.执行以下命令启动靶场环境并在浏览器访问 cd /vulhub/thinkphp/2-rce #进入漏洞环境所在目录 docker-compose up -d #启动靶场 docker ps #查看容器信息 2.访问网页 3.构造payload 192.168.157.142:8080?s/Index/index/L/${phpinfo()} 4、写入一句话木马&#xff0c;使用…

《JavaEE进阶》----12.<SpringIOCDI【扫描路径+DI详解+经典面试题+总结】>

本篇博客主要讲解 扫描路径 DI详解&#xff1a;三种注入方式及优缺点 经典面试题 总结 五、环境扫描路径 虽然我们没有告诉Spring扫描路径是什么&#xff0c;但是有一些注解已经告诉Spring扫描路径是什么了 如启动类注解SpringBootApplication。 里面有一个注解是componentS…

移动应用门户实现的技术方案

移动应用门户是专为移动设备&#xff08;如智能手机和平板电脑&#xff09;设计的应用程序&#xff0c;比如&#xff1a;小程序、APP等&#xff0c;用户可以通过应用商店下载并安装。这些应用程序提供了更好的用户体验&#xff0c;通常具有更高的性能和交互性&#xff0c;可以直…

数据结构的简单认识

数据结构是计算机存储、组织数据的方式。它可以分为逻辑结构和物理结构。 逻辑结构主要有集合、线性结构、树形结构和图形结构。集合中的数据元素间除“同属于一个集合”外&#xff0c;无其他关系&#xff1b;线性结构的数据元素之间存在一对一的关系&#xff0c;如链表、栈和队…

linux系统中,计算两个文件的相对路径

realpath --relative-to/home/itheima/smartnic/smartinc/blocks/ruby/seanet_diamond/tb/parser/test_parser_top /home/itheima/smartnic/smartinc/corundum/fpga/lib/eth/lib/axis/rtl/axis_fifo.v 检验方式就是直接在当前路径下&#xff0c;把输出的路径复制一份&#xff0…

Java | Leetcode Java题解之第386题字典序排数

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> lexicalOrder(int n) {List<Integer> ret new ArrayList<Integer>();int number 1;for (int i 0; i < n; i) {ret.add(number);if (number * 10 < n) {number * 10;} els…

【RabbitMQ】基本概念以及安装教程

1. 什么是MQ MQ( Message queue),从字面意思上看,本质是个队列,FIFO 先入先出&#xff0c;只不过队列中存放的内容是消息(message)而已.消息可以非常简单,比如只包含文本字符串,JSON等,也可以很复杂,比如内嵌对象.MQ多用于分布式系统之间进行通信 系统之间的调用通常有两种方式…

揭秘 AMD GPU 上 PyTorch Profiler 的性能洞察

Unveiling performance insights with PyTorch Profiler on an AMD GPU — ROCm Blogs 2024年5月29日&#xff0c;作者&#xff1a;Phillip Dang。 在机器学习领域&#xff0c;优化性能通常和改进模型架构一样重要。在本文中&#xff0c;我们将深入探讨 PyTorch Profiler&#…

基于深度学习的结构优化与生成

基于深度学习的结构优化与生成技术应用于多种领域&#xff0c;例如建筑设计、机械工程、材料科学等。该技术通过使用深度学习模型分析和优化结构形状、材料分布、拓扑结构等因素&#xff0c;旨在提高结构性能、减少材料浪费、降低成本、并加快设计流程。 1. 结构优化与生成的核…

从零开始写论文:如何借助ChatGPT生成完美摘要?

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 在写论文的过程中&#xff0c;摘要是一个非常重要的部分&#xff0c;它能够帮助读者快速理解论文的核心内容&#xff0c;决定是否进一步阅读全文。但是许多学生在写摘要的时候常常感到困惑&#xff0c;不知…