小内存嵌入式设备软件的差分升级设计(学习)
摘要
提出一种改进HDiffPatch算法并在复旦微单片机上实现小内存差分升级的方案,即使用单片机内的Flash空间替代算法占用的RAM空间,从而减少算法对单片机RAM空间的需求,以满足小内存微处理器的差分升级,同时对算法内存分配释放函数进行优化,以最大限度地利用RAM空间。
引言
差分升级也称增量升级或补丁升级,其升级的原理很简单:首先通过某种算法找出新软件版本和旧软件版本不同的地方(这个过程称为差分);然后把不同地方抽取出来构成所谓的更新补丁(patch),也称差分包(difference package);之后在旧软件版本的基础上通过还原算法将差异部分还原出来,从而升级为新版本程序。
与整包升级最大的区别在于,差分升级是通过一个差分文件对系统进行升级,其差分文件比新版程序文件更小,所以差分升级带来了许多方便:
- 大大缩减了传输数据的大小,提高了软件升级的成功率。
- 对于窄带物联网、4G网络等设备远程升级,还可以节省下载流程。
- 对于电池供电设备远程升级,缩短了升级时间,降低了升级过程中的功耗。
- 软件升级的数据通过传输新旧程序差异数据而非完整程序数据,增强了软件升级的安全性。
当前应用到的差分升级方法只适用于大内存微处理器,对于小内存微处理器无法实现差分升级,因为还原算法需要较大的内存。
系统差分升级算法方案概述
差分升级方案的核心就是使用差异文件(diff)和补丁文件(patch)算法来对新旧程序文件进行diff/patch操作。BsDiff/BsPatch与xdelta是当前使用较多的两种算法,但有一种比前两者更加高效的开源算法应用得越来越多,即HDiffPatch算法。
同等条件下,对比测试HDiffPatch与BsDiff4.3、xdelta3.1两种算法生成的diff数据文件大小、运行时间、占用内存。
HDiffPatch开源算法GitHub提供的测试对比结果表明:HDiff比BsDiff生成的diff数据文件小15%以上,运行时间更短(约其1/4),占用内存更小(约其2/3);在资源紧张且受限的设备中进行patch时,HPatch比BsPatch运行得更快(在整个patch阶段,HPatch最慢时比BsPatch快约1倍,运行最快时约5倍),内存占用更小,约为BsPatch的1/2。
HDiff比xdelta生成的diff数据文件小25%以上,运行时间几乎相同,内存占用小于其1/5;进行patch时,HPatch运行时间比xdelta大约慢50%,内存占用小于其1/5。
对于嵌入式设备,内存资源有限,在不影响性能的情况下降低内存消耗比速度更加重要,因此本系统采用开源HDiffPatch算法实现程序的差分升级。
系统总体设计框图
系统差分升级流程主要有3步:首先是差分包的产生;其次是差分包的传输;最后是新程序的还原。
本系统差分包通过具有HDiffPatch算法的上位机生成。当系统需要进行差分升级时,将差分包通过红外、窄带物联网、有线网口、4G网络、有线串口或其它无线通信方式传输至嵌入式设备。
对于非有线方式的远程升级,在应用层完成差分包数据的接收,接收数据校验无误后产生复位,单片机复位后进入BootLoader,通过差分算法在BootLoader中还原新的应用程序。
差分升级可实现多台设备同时升级,但需要再传输差分包的上位机上实现多个线程,以确保每个任务之间都相互独立,数据收发不产生干扰。
系统硬件设计
本系统嵌入式平台采用的是复旦微单片机 FM33L026,该芯片CPU内核为 ARMCortex M0架构,CPU 最高主频为48 MHz,RAM 总 容 量 为16KB,程 序 Flash总 容 量 为128KB,6路串口。系统硬件外围电路主要有时钟电路、复位电路、电源电路、串口电路和红外电路等。
系统软件设计
软件需要实现差分包升级,首先通过上位机制作出新旧软件版本的差分包文件,然后通过数据通信链路将差分包文件传输至嵌入式设备,嵌入式设备接收到数据后再BootLoader启动程序中利用HDiffPatch算法中的patch将新程序还原出来,还原成功后执行新应用程序。
将嵌入式设备程序运行过程划分为两个阶段:第一阶段为BootLoader程序启动阶段,第二阶段为Application应用程序运行阶段。
为了节约资源,本系统无线方式的差分包数据接收在应用程序中完成(应用程序本身具有无线功能,借助无线功能同时完成差分数据包的接收,节约空间资源)。
差分升级流程
单片机Flash划分空间
HDiffPatch简介
HDiffPatch差分算法由HDiff和HPatch两种算法组成,两种算法的时间复杂度计算方法相同,为O(newSize+oldSize);内存使用情况分别为newSize+oldSize*5+O(1)字节(当oldSize不小于2G时,oldSize系数由5改为9)和newSize+oldSize+O(1)字节。
HDiffPatch差分算法早期是用于安卓手机客户端的开源算法,它可以跨平台使用。
在开源算法代码中,通过调用create_diff(newData 字节数组,oldData字节数组,out diffData)函数生成了oldData到newData的差异数据diffData;再调用patch(out newData,oldData,diffData)函数将设备中的oldData和接收到的diffData合成newData(在Diff时,可以将补丁包直接压缩,在patch时,无需提前解压)。
系统测试
差分包的生成
本系统通过DiffPatch上位机直接生成差分包。
- 升级前文件路径为选取当前需要升级设备中的旧程序可执行文件。
- 升级后文件路径为选取已经更新后的新程序可执行文件。
- 单击生成,即可在当前文件夹下生成旧程序的补丁文件。
差分包传输
差分包下传至设备有多种方式,如有线串口、窄带物联网、红外、4G网络等。
本系统采用有线串口方式通过差分升级上位机将差分包数据传输至设备。
- 单击“读取版本”按钮即可确定版本号。
- 接着单击“打开文件”按钮选择所需要传输的差分包。
相关文章:

小内存嵌入式设备软件的差分升级设计(学习)
摘要 提出一种改进HDiffPatch算法并在复旦微单片机上实现小内存差分升级的方案,即使用单片机内的Flash空间替代算法占用的RAM空间,从而减少算法对单片机RAM空间的需求,以满足小内存微处理器的差分升级,同时对算法内存分配释放函数…...

小程序具体开发
window 导航栏 属性名类型默认值作用navigationBarTitleText string字字符串导航栏标题内容navigationBarBackgroundColorHexcolor#000000设置导航栏背景颜色(比如荧黄色 #ffa)navigationBarTextStylestringwhite设置导航栏标题的颜色(仅含有…...

《TCP IP网络编程》第十六章
第 16 章 关于 I/O 流分离的其他内容 16.1 分离 I/O 流 「分离 I/O 流」是一种常用表达。有 I/O 工具可区分二者,无论采用哪种方法,都可以认为是分离了 I/O 流。 2次 I/O 流分离: 第一种是第 10 章的「TCP I/O 过程」分离。通 shutdown(soc…...

HTML5 基础标签
目录 前言 标题标签 段落标签 换行标签和水平线标签 文本格式化标签 图像标签 超链接标签 多媒体标签 列表标签 无序列表 有序列表 表格 合并单元格 表单 无语义的布局标签 字符实体 前言 当今互联网时代,网页是我们获取信息、交流和展示自己的重要渠…...

二、Qt的安装(Linux系统下安装Qt6过程)
一、Qt资源下载网址 网址:点击下载http://download.qt.io/ 下载:点击下载(CSDN) 二、下载二进制安装包 进入Qt资源下载网址,进入对应的资源目录,找对应系统平台的二进制安装包选择进行下载,在这这里我们选择Linux下的二…...

Python 中被忽视的核心功能
这篇文章主要介绍了一些在 Python 编程中可能被忽视的核心功能,包括默认参数、海象运算符、*args 和 **kwargs 的使用、变量交换、str 与 repr 的区别、可迭代对象的扩展解包、多个上下文管理器的使用、Python 调试器、collections.Counter 的使用、itertools 的使用…...

Java+Excel+POI+testNG基于数据驱动做一个简单的接口测试【杭州多测师_王sir】
一、创建一个apicases.xlsx放入到eclipse的resource里面,然后refresh刷新一下 二、在pom.xml文件中加入poi和testng的mvn repository、然后在eclipse的对应目录下放入features和plugins,重启eclipse就可以看到testNG了 <!--poi excel解析 --><d…...

2023.8.12号论文阅读
文章目录 TriFormer: A Multi-modal Transformer Framework For Mild Cognitive Impairment Conversion Prediction摘要本文方法实验结果 SwIPE: Efficient and Robust Medical Image Segmentation with Implicit Patch Embeddings摘要本文方法实验结果 TriFormer: A Multi-mod…...

R语言中的函数24:Combinat:combn(), permn()
介绍 combinat中的combn()和permn()函数可以得到所有的排列组合的情况 combn()函数 combn(x, m, funNULL, simplifyTRUE, …)x – 组合的向量源m – 要取的元素的数量fun – 应用于每个组合的函数(可能为空)simplify – 逻辑的,如果是FALSE,返回一个列…...
C++隐式调用和explicit关键字
隐式类型转换 #include <iostream> using namespace std;class Point { public:int x, y;Point(int x 0, int y 0): x(x), y(y) {} };void displayPoint(const Point& p) {cout << "(" << p.x << "," << p.y <&l…...
Git 清除所有本地修改
Git 清除所有本地修改 1. 上才艺 1. 上才艺 git reset --hard && git clean -dfreset 返回到某个节点,不保留修改(删除的是已跟踪的文件)clean 删除的是未跟踪的文件 谢谢...

快速获得图像中像素值的小工具
之前项目中为了做lka中获得rgb图像信息,网上大多方案是确定相关的区域然后输出像素值,这个方法太麻烦,做了一个简单的使用鼠标点击图片某区域,然后直接在终端输出该区域的像素值。下面是源码: import cv2 import matp…...
yolo数据增强
yolo数据增强 🔥 数据集说明 😂一. labelimg 😅1. labelimg数据增强2. labelimg转换为yolo数据集二. labelme 😆1. labelme 分割数据增强2. labelme分割数据集转换yolo分割数据集三. coco 数据集格式1. coco 数据集格式数据增强 并转换至labelme 格式2. coco 数据集格式…...

环保行业如何开发废品回收微信小程序
废品回收是近年来受到越来越多人关注的环保行动。为了推动废品回收的普及和方便,我们可以利用微信小程序进行制作,方便人们随时随地参与废品回收。 首先,我们需要注册并登录乔拓云账号,并进入后台。乔拓云是一个提供微信小程序制作…...

个人对哈希数据结构学习总结 -- 理论篇
个人对哈希数据结构学习总结 -- 理论篇 引言哈希表设计思考哈希冲突Hash Functions冲突解决开放地址法(Open Addressing)分离链表法(Separate Chaining)Two-way Chaining Dynamic Hash Tableschained Hashingextendible hashinglinear hashing说明 spiral storage 使用场景小结…...

在CMamke生成的VS项目中插入程序
在主文件夹的CMakeLists.tex中加入SET(COMPILE_WITH_LSVM OFF CACHE BOOL "Compile with LSVM") 再添加IF(COMPILE_WITH_LSVM) MESSAGE("Compiling with: LSVM") ADD_DEFINITIONS(-DCOMPILE_WITH_LSVM) ADD_SUBDIRECTORY(LSVM) LIST(APPEND SRC LSVM_wrap…...

198、仿真-基于51单片机函数波形发生器调幅度频率波形Proteus仿真(程序+Proteus仿真+原理图+流程图+元器件清单+配套资料等)
毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…...
Django 初级指南:创建你的第一个 Django 项目
Django 是一个强大的 Python Web 框架,它采用了“模型-视图-控制器”(MVC)的设计模式,能够帮助开发者快速、简洁地创建高质量的 Web 应用。这篇文章将引导你创建你的第一个 Django 项目。 一、安装 Django 首先,你需…...
【MySQL】使用C++连接数据库
目录 前置工作代码常用函数接口整体示例: 前置工作 创建数据库并选中 mysql> create database conn; Query OK, 1 row affected (0.01 sec)mysql> show databases; -------------------- | Database | -------------------- | information_schema…...

php代码审计,php漏洞详解
文章目录 1、输入验证和输出显示2、命令注入(Command Injection)3、eval 注入(Eval Injection)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL 注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)7、Session 会话劫持(Session Hijacking…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...