小内存嵌入式设备软件的差分升级设计(学习)
摘要
提出一种改进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…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...