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

news2024/11/13 10:27:48

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

STM32通用Bootloader (rt-thread.org)

1.app程序env配置过程

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

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配置

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 0x08010000


extern 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 running
    
    LOG_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远程升级

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

​3.1 在控制台执行命令"http_ota http://xxx/xxx/rtthreadf.rbl “,url更换成自己的

4.遇到的问题

4.1bootload程序编译报错

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

解决: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

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 “升级失败问题

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

4.4.1 添加"rt_thread_mdelay(10);"

4.4.2 在1160行添加else

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

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

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

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

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

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

相关文章

机械革命imini Pro820迷你主机评测和拆解,8845H小主机使用政府补贴仅需两千三

机械革命imini Pro820迷你主机评测和拆解&#xff0c;8845H小主机使用政府补贴仅需两千三。 最近上线了家电补贴相关的活动&#xff0c;最高可以补贴20%&#xff0c;然后就看到了这款mini主机感觉很划算就下单了&#xff0c;用来替换我旧的N5095小主机&#xff0c;当服务器用。…

电子技术基础

目录 二极管 二极管的概念二极管的整流 二极管的防反接 二极管的钳位稳压二极管 三极管 NPN型三极管PNP型三极管三极管的三种状态三极管三个极之间电流的关系 放大电路 三极管共射极放大电路分压式偏置电路静态工作点多级放大功率放大电路 运算放大器 同相比例放大器反相…

旅行商问题 | Matlab基于混合粒子群算法GA-PSO的旅行商问题TSP

目录 效果一览基本介绍建模步骤程序设计参考资料 效果一览 基本介绍 混合粒子群算法GA-PSO是一种结合了遗传算法&#xff08;Genetic Algorithm, GA&#xff09;和粒子群优化算法&#xff08;Particle Swarm Optimization, PSO&#xff09;的优化算法。在解决旅行商问题&#…

「Python数据分析」Pandas进阶,使用groupby分组聚合数据(三)

​在实际数据分析和处理过程中&#xff0c;我们可能需要灵活对分组数据进行聚合操作。这个时候&#xff0c;我们就需要用到用户自定义函数&#xff08;User-Defined Functions&#xff0c;UDFs&#xff09;。 使用用户自定义函数进行聚合 使用用户自定义函数聚合时的性能&…

联想泄露显示本月推出更便宜的Copilot Plus电脑

联想似乎准备推出新的更实惠的 Copilot Plus 电脑。可靠的爆料者Evan Blass发布了一份来自联想的新闻稿&#xff0c;详细介绍了将在本周晚些时候的IFA展会上宣布的各种Copilot Plus电脑&#xff0c;其中包括两款采用尚未公布的8核高通骁龙X Plus芯片的电脑。 这些新的高通芯片…

Qt 创建一个json数组对象写入文档并从文档读出q

void createJsonArray() { // 创建一个JSON数组 QJsonArray jsonArray; // 创建一些JSON对象并添加到数组中 for (int i 0; i < 3; i) { QJsonObject jsonObject; jsonObject["key" QString::number(i)] "value" QStri…

原点安全荣获“AutoSec Awards 安全之星”优秀汽车数据安全合规方案奖

9月3日&#xff0c;「AutoSec 2024第八届中国汽车网络安全周暨第五届智能汽车数据安全展」在上海盛大开幕。本届大会由谈思实验室和谈思汽车主办、上海市车联网协会联合主办&#xff0c;以汽车“网络数据安全、软件安全、功能安全”为主题&#xff0c;汇聚了国内外的技术专家、…

Meta关闭Spark AR平台:未来规划与影响分析

Meta宣布将关闭其移动AR创作平台Spark AR&#xff0c;这一消息在业界引起了广泛关注。尽管Snap和TikTok在AR滤镜领域取得了巨大成功&#xff0c;但Meta却选择了另一条发展道路。本文将探讨这一决策背后的可能原因及其对未来的影响。 关闭Spark AR平台的背后 硬件为主&#xff…

PyTorch 创建数据集

图片数据和标签数据准备 1.本文所用图片数据在同级文件夹中 ,文件路径为train/’ 2.标签数据在同级文件&#xff0c;文件路径为train.csv 3。将标签数据提取 train_csvpd.read_csv(train.csv)创建继承类 第一步&#xff0c;首先创建数据类对象 此时可以想象为单个数据单元的…

【PyTorch】基础环境如何打开

前期安装可以基于这个视频&#xff0c;本文是为了给自己存档如何打开pycharm和jupyter notebookPyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】_哔哩哔哩_bilibili Pycharm 配置 新建项目的时候选择解释器pytorch-gpu即可。 Jupyte…

【C++ 第二十二章】C++的类型转换

1.C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收返回值类型不一致时&#xff0c;就需要发生类型转化&#xff0c;C语言中总共有两种形式的类型转换&#xff1a;隐式类型转换和…

CDA数据分析一级考试备考攻略

一、了解考试内容和结构 CDA一级考试主要涉及的内容包括&#xff1a;数据分析概述与职业操守、数据结构、数据库基础与数据模型、数据可视化分析与报表制作、Power BI应用、业务数据分析与报告编写等。 CDA Level Ⅰ 认证考试大纲:https://www.cdaglobal.com/certification.h…

一文还原时序数据库 IoTDB 在 TPCx-IoT 的测试全流程!

在云服务硬件环境下&#xff0c;IoTDB 写入、查询、利用资源能力均表现出色&#xff01; 之前&#xff0c;我们为大家介绍了基于 IoTDB 的企业级产品 TimechoDB&#xff0c;在 TPCx-IoT 基准测试中打破世界纪录&#xff0c;取得的双指标第一成绩&#xff0c;和选择 TPCx-IoT 的…

【Python机器学习】核心数、进程、线程、超线程、L1、L2、L3级缓存

如何知道自己电脑的CPU是几核的,打开任务管理器(同时按下:Esc键、SHIFT键、CTRL键) 然后,点击任务管理器左上角的性能选项,观察右下角中的内核:后面的数字,就是你CPU的核心数,下图中我的是16个核心的。 需要注意的是,下面的逻辑处理器:32 表示支持 32 线程(即超线…

【爬虫软件】批量采集短视频博主的主页作品

用python开发的DY爬虫采集软件&#xff0c;可自动按博主抓取其已发布视频数据。 软件界面&#xff1a; 采集结果: 日志记录&#xff1a; 软件说明&#xff1a; 演示视频&#xff1a; https://www.bilibili.com/video/BV1Kb42187qf 讲解文章&#xff1a; https://www.bi…

2024数学建模国赛选题建议+团队助攻资料

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

QT: Unable to create a debugging engine.

1.问题场景&#xff1a; 第一次安装QT&#xff0c;没有配置debug功能 打开控制面板》程序》找到Kit 重启电脑即可 2.问题场景&#xff1a; qt原本一直好好的&#xff0c;突然有天打开运行调试版本&#xff0c;提示Unable to create a debugging engine.错误。这个是指无法创…

CIOE中国光博会&电巢科技即将联办“智能消费电子创新发展论坛”

在科技浪潮汹涌澎湃的当下&#xff0c;从通信领域的高速光传输&#xff0c;到消费电子中的高清显示与先进成像技术&#xff0c;光电技术的应用范围不断拓展且日益深化。而AIGC 凭借其丰富的内容供给与个性化反馈能力&#xff0c;正为新一代消费电子及智能穿戴产品开辟崭新的发展…

具身智能猜想 ——机器人进化

设想一个机器人进化的仿真模拟环境&#xff0c;可以通过 “基因突变” 产生新功能&#xff0c;让机器人逐步进化。以下是这个进化系统的关键要素和可能的实现步骤&#xff1a; 1. 仿真环境 虚拟世界&#xff1a;创建一个包含多样化任务和挑战的虚拟环境&#xff0c;如探索、抓…

uniapp 实现tabbar图标凸起

实现tabbar图标凸起有两种&#xff0c;第一种是自定义tabbar&#xff0c;第二种就是使用官方的tabbar跟api实现&#xff0c;自定义在体验中不如原生的tabbar&#xff0c;所以我下面展示的是使用官方的tabbar跟api实现 效果如图&#xff1a; 左边是未选中中间的凸起&#xff0c…