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

stm32(二十)IAP升级优化(双缓存,可恢复)

        这次主要对STM32F103/Keil和LPC2478/IAR加了一个IAP在线升级功能,

        主要记录一下自己的思路,无代码,实在是代码感觉没啥写的,都是一些网上很多流传的东西。

1、开发环境

Keil+stm32f103+JLINK

2、程序思路

        在升级中,必须要考虑的问题就是:升级成功以及失败,然后失败的补救措施。所以我以前的写法是最简单粗暴的

2.1、IAP升级旧版本

bootloader有两个功能,由标志位控制,

        一个是跳转到app程序(一般升级后进入)

        一个是允许升级程序(一般升级失败或者初始状态)

bootloader根据标志位判断当前是升级还是跳转,如果程序处于app则先更新标记位表示进入升级,然后复位,进入bootloader

这个优点就是代码简单,空间利用率高,如果程序很大的话比较适合,但是如果空间使用不大那么可以使用双缓存,毕竟可以在出错之后回滚。

2.2、IAP升级双缓存版本

我使用的单片机内部flash大小为512kb,所以我按照128kb可以划分为5个区域

  1. bootloader大小为64kb,假设地址为0x80000000-0x80010000
  2. 运行区域大小为128kb,主要此地址固定代码中断向量表偏移量,假设地址为0x80010000-0x80030000
  3. 升级数据存储1大小为128kb,假设地址为0x80030000-0x80050000
  4. 升级数据存储2大小为128kb,假设地址为0x80050000-0x80070000
  5. flash数据存储大小为64kb,假设地址为0x80070000-0x80080000

bootloader有两个功能,由标志位控制,

        一个是跳转到app程序

        一个是允许升级程序(一般升级失败或者初始状态)

(1)、其中app程序中,例如当前数据存储1已经存在了运行成功的数据,说明此时运行区域和数据存储1的数据相同,那么这就相当于一个备份,此后升级数据将使用存储2地址。反之亦然。

(2)、然后bootloader的跳转前会判断是否是升级过的,如果升级过,那么将会比如升级数据存储1,那么需要将存储1的数据拷贝到运行区域,然后再跳转,就是将0x80030000-0x80050000的数据复制到0x80010000-0x80030000。反之存储2亦然

(3)、如果不需要复制数据的话就直接跳转,跳转前会将指定标志位设置为错误,跳转到app之后,由app端将标志位设置为正常。这样如果跳转失败,重启后就不会跳转,如果是初始情况将不做任何处理,如果是升级出现的异常,将会从备份数据复制到运行区域然后重新跳转运行。例如此前升级完成,但是此时新数据存储在数据存储1位置,老数据存储在数据存储2位置,复制存储1的数据到运行区域,结果启动失败,那么再次启动后将老数据复制到运行区域,重新运行

注意:已经复制过的就不用复制,只复制升级后的那次

2.3、IAP升级双缓存版本的优化

此前尽管这个是有备份,但是其实是属于空间浪费了,为什么需要如果,是因为代码写死了中断向量表便宜0x10000,所以运行区域必须从0x80010000开始,但是如果代码将中断向量表偏移改为动态的,那么则可以节省出一份空间。其中bootloader只是不需要复制内存到运行区域,其他步骤都一样

  1. bootloader大小为64kb,假设地址为0x80000000-0x80010000
  2. 运行区域1大小为192kb,假设地址为0x80010000-0x80040000
  3. 运行区域2大小为192kb,假设地址为0x80040000-0x80070000
  4. flash数据存储大小为64kb,假设地址为0x80070000-0x80080000

此时,运行区域1的中断向量偏移应该设置为0x80010000,运行区域2的中断向量偏移应该设置为0x80040000。

具体操作如下:

因为跳转前,是由bootloader决定跳转到那个区域的,所以我们只需要将app的开头改为读取当前启动是什么区域,然后根据区域直接更改中断向量偏移的地址即可。

    if(flag == block2){SCB->VTOR = FLASH_BASE | 0x40000;}else{SCB->VTOR = FLASH_BASE | 0x10000;}

注意:2.3未验证,但是逻辑上是不会错的

注意:我的bootloader所有行为都是由上位机控制,上位机发送跳转/准备升级/接收数据/升级完成/复位等一系列命令

相关文章:

stm32(二十)IAP升级优化(双缓存,可恢复)

这次主要对STM32F103/Keil和LPC2478/IAR加了一个IAP在线升级功能, 主要记录一下自己的思路,无代码,实在是代码感觉没啥写的,都是一些网上很多流传的东西。 1、开发环境 Keilstm32f103JLINK 2、程序思路 在升级中,必…...

HDLbits:Exams/ece241 2013 q4

本题是一个实际的应用问题,一个水库,有三个传感器S1、S2、S3提供输入,经过控制电路,四个输出给到四个流量阀。也就是说,本题想让我们根据水位去控制流量阀。 问题的关键在于把什么抽象成state,答案是&…...

什么是React的虚拟DOM(Virtual DOM)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

Response Status Code 301、302

目录 Information Django redirect Influence Information HTTP状态码301、302和304分别表示以下情况: codeinformation301(Moved Permanently) 永久重定向。当请求的资源已经被永久地移动到了一个新的URI时,服务器会返回这个…...

import { ref, onMounted, reactive } from ‘vue‘

ref, onMounted, reactive 用于创建和操作响应式数据、生命周期钩子。 1.ref 用来创建一个响应式的引用(Reactive Reference)的函数,主要用于创建基本数据类型(如数字、字符串等)的响应式数据。 通过 ref 创建的变…...

【TB作品】基于MSP430G2553单片机的超声波测距与报警系统,原理图,PCB

功能: 1 超声波测距显示 2 按键设置报警上下限 3 蜂鸣器报警 原理图: PCB样式: 实物: 代码: https://github.com/xddun/blog_code_search...

npm install报错

在命令提示符窗口下载npm,报错如下: $npm install报错信息如下: npm WARN old lockfile npm WARN old lockfile The package-lock.json file was created with an old version of npm, npm WARN old lockfile so supplemental metadata must…...

Flutter自定义model实体类

在某些场景下,我们可能需要自定义Flutter model实体类,来创建更加结构化和有组织的代码,提高代码的可重用性,并增强Flutter应用程序的整体可维护性。 自定义小部件:在创建自己的小部件时,可能需要定义自定义数据类型来…...

java项目实现不停服更新的4种方案(InsCode AI 创作助手)

文章目录 1. Blue-Green 部署2. 滚动更新3. 使用负载均衡器4. 灰度发布 在软件开发和维护中,不停机更新是确保应用程序持续可用的关键任务之一。以下是四种常见的不停机更新策略及其示例: 1. Blue-Green 部署 概念: Blue-Green 部署是一种部…...

7.1 yolov5优化模型时,自动标注xml数据

yolov5优化模型时,一般需要继续标注一些检测错误的图片,将其标为xml数据。以下是根据训练好的模型自动标注xml数据的python代码: 注意:代码中包含了本人的yolov5的测试过程,测试过程可以自己根据yolov5的测试文件自行…...

开发者职场“生存状态”大调研报告分析 - 第一版

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…...

在MySQL中使用!=还能走索引吗?

在MySQL中使用!还能走索引吗? 一般情况下,我们会在一个索引上较多的使用等值查询或者范围查询,此时索引大多可以帮助我们极快的查询出我们需要的数据。 那当我们在where条件中对索引列使用!查询,索引还能发挥他的作用吗&#xf…...

【算法题】2897. 对数组执行操作使平方和最大

题目: 给你一个下标从 0 开始的整数数组 nums 和一个 正 整数 k 。 你可以对数组执行以下操作 任意次 : 选择两个互不相同的下标 i 和 j ,同时 将 nums[i] 更新为 (nums[i] AND nums[j]) 且将 nums[j] 更新为 (nums[i] OR nums[j]) &#…...

2023年中国划船机产量、销量及市场规模分析[图]

划船机是一种健身器材,它模拟了划船的运动,可以锻炼身体的肌肉力量和协调性。划船机通常由座椅、把手、脚踏板和传动装置组成,使用者可以通过拉动把手来模拟划船的动作,从而达到锻炼身体的目的。 划船机产业链 资料来源&#xff…...

Kafka和RabbitMQ的对比

Rabbitmq比kafka可靠,kafka更适合IO高吞吐的处理,比如ELK日志收集 Kafka和RabbitMq一样是通用意图消息代理,他们都是以分布式部署为目的。但是他们对消息语义模型的定义的假设是非常不同的。 a) 以下场景比较适合使用Kafka。如果有大量的事…...

ffmpeg从一个视频中提取音频

ffmpeg -i ~/video/video.mp4 -vn -acodec copy ~/video/audioFile.m4a 从video.mp4中提取音频到文件audioFile.m4a中 查看提取的音频文件 ffprobe ~/video/audioFile.m4a...

CCF CSP题解:坐标变换(其一)(202309-1)

链接 OJ链接&#xff1a;传送门 AC代码 #include <iostream>using namespace std;int n, m;int dx 0, dy 0;int main() {cin >> n >> m;for (int i 0; i < n; i) {int x, y;cin >> x >> y;dx x;dy y;}for (int i 0; i < m; i) {i…...

跳表C语言

【C语言】算法学习跳表_c语言跳表-CSDN博客 leetcode原题&#xff0c;代码如下 #define MAX(a, b) ((a) > (b) ? (a) : (b)) const int MAX_LEVEL 32; const int P_FACTOR RAND_MAX >> 2;typedef struct SkiplistNode {int val;int maxLevel;struct SkiplistNode…...

【JavaEE】_tomcat的安装与简单使用

目录 1. 安装tomcat 1.1 下载tomcat并解压缩 1.2 启动tomcat 1.3 访问tomcat欢迎页面 2. tomcat简单使用&#xff1a;部署前端代码 3. 基于tomcat的网站后端开发 tomcat是一个HTTP服务器&#xff0c;HTTP协议就是HTTP客户端与HTTP服务器之间通信使用的协议。 其中HTTP客…...

React 状态管理 - Context API 前世今生(上)旧版v16.3前

目录 扩展学习资料 Context api before React v16.3 Context 实战使用-Context Context VS Props Context Props Context的缺陷 New Context API 的实践 扩展学习资料 名称 链接 备注 new context api https://reactjs.org/docs/context.html 英文 old context …...

微服务、SOA 和 API 之间的区别

在软件开发中&#xff0c;组织的投资方式发生了重大转变&#xff0c;部署了面向架构的方法。这一切都始于 SOA&#xff0c;然后转变为我们称之为微服务的东西。添加到其中的是另一个概念&#xff0c;指定为 API。 在过去的几年里&#xff0c;SOA 和微服务仍然是讨论的话题。随…...

python打印正反直角三角形

我们用while循环&#xff0c;第一行打印一颗星&#xff0c;第二行打印两颗星&#xff0c;依次循环到五颗 我们写while循环时&#xff0c;先定义一个变量&#xff0c;然后在循环中增加值 i0 while < 5:j0while j <i:print(*,end\t)j1print() # 换行i1我们还可以打印反…...

ubuntu安装Miniconda并举例使用

更新系统包 sudo apt update sudo apt upgrade官网下载Miniconda&#xff0c;最好是实体机下载后放进虚拟机&#xff0c;方法可以参考Xftp 7连接服务器或者本地虚拟机文章 https://docs.conda.io/en/latest/miniconda.html#linux-installers 进入安装目录执行&#xff0c;右键…...

如何保护您的数据免受.360勒索病毒的感染

导言&#xff1a; 网络安全漏洞和威胁伴随着我们的日常生活。其中&#xff0c; 360 勒索病毒成为了引发广泛关注的网络威胁之一。本文91数据恢复将深入探索 360 勒索病毒&#xff0c;揭示它背后的黑暗故事和如何防范此类风险。 如果受感染的数据确实有恢复的价值与必要性&#…...

2024计算机保研--哈工大、中山、国防科大

前言 标题中的学校是我在九月前差不多拿到 o f f e r offer offer&#xff0c;且有可能会去的学校&#xff0c;这篇博客也不能算是经验贴&#xff0c;只能算是血泪史吧。趁着我还记得这几个月的经历&#xff0c;还是记录一下吧&#xff0c;刚才刷知乎看了七月哥&#xff08;是…...

Hadoop分布式集群搭建教程

目录 前言环境准备一、创建虚拟机二、虚拟机网络配置三、克隆虚拟机四、Linux系统配置五、Hadoop的部署配置六、Hadoop集群的启动 前言 大数据课程需要搭建Hadoop分布式集群&#xff0c;在这里记录一下搭建过程 环境准备 搭建Haoop分布式集群所需环境&#xff1a; VMware&a…...

学习函数式编程、可变参数及 defer - GO语言从入门到实战

函数是⼀等公⺠、学习函数式编程、可变参数及 defer - GO语言从入门到实战 函数是⼀等公⺠ 在Go语言中&#xff0c;函数可以分配给一个变量&#xff0c;可以作为函数的参数&#xff0c;也可以作为函数的返回值。这样的行为就可以理解为函数属于一等公民。 与其他主要编程语⾔…...

Linux 文件链接

Linux 下的文件链接有两类。一个是类似于 win 电脑的快捷方式&#xff0c;我们称为软链接&#xff0c;软链接也可以叫做符号链接。另一种是通过文件系统的 inode 连接来产生的&#xff0c;类似于 windows 电脑的复制&#xff0c;但是不产生新的文件&#xff0c;我们称为硬链接。…...

1.go web之gin框架

Gin框架 一、准备 1.下载依赖 go get -u github.com/gin-gonic/gin2.引入依赖 import "github.com/gin-gonic/gin"3. &#xff08;可选&#xff09;如果使用诸如 http.StatusOK 之类的常量&#xff0c;则需要引入 net/http 包 import "net/http"二、基…...

工程物料管理信息化建设(十二)——关于工程物料管理系统最后的思考

目录 1 功能回顾1.1 MTO模块1.2 请购模块1.3 采购模块1.4 催交模块1.5 现场管理模块1.6 数据分析和看板模块1.7 其它模块 2 最后几个问题2.1 按管线发料和直接发料重叠2.2 YHA 材料编码的唯一性问题2.3 “合同量单-箱单-入库单” 数据映射 3 关于未来的思考3.1 三个专业之间的关…...