小内存嵌入式设备软件的差分升级设计(学习)

摘要

提出一种改进HDiffPatch算法并在复旦微单片机上实现小内存差分升级的方案,即使用单片机内的Flash空间替代算法占用的RAM空间,从而减少算法对单片机RAM空间的需求,以满足小内存微处理器的差分升级,同时对算法内存分配释放函数进行优化,以最大限度地利用RAM空间。

引言

差分升级也称增量升级或补丁升级,其升级的原理很简单:首先通过某种算法找出新软件版本和旧软件版本不同的地方(这个过程称为差分);然后把不同地方抽取出来构成所谓的更新补丁(patch),也称差分包(difference package);之后在旧软件版本的基础上通过还原算法将差异部分还原出来,从而升级为新版本程序。

与整包升级最大的区别在于,差分升级是通过一个差分文件对系统进行升级,其差分文件比新版程序文件更小,所以差分升级带来了许多方便:

  1. 大大缩减了传输数据的大小,提高了软件升级的成功率。
  2. 对于窄带物联网、4G网络等设备远程升级,还可以节省下载流程。
  3. 对于电池供电设备远程升级,缩短了升级时间,降低了升级过程中的功耗。
  4. 软件升级的数据通过传输新旧程序差异数据而非完整程序数据,增强了软件升级的安全性。

当前应用到的差分升级方法只适用于大内存微处理器,对于小内存微处理器无法实现差分升级,因为还原算法需要较大的内存。

系统差分升级算法方案概述

差分升级方案的核心就是使用差异文件(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上位机直接生成差分包。
在这里插入图片描述

  1. 升级前文件路径为选取当前需要升级设备中的旧程序可执行文件。
  2. 升级后文件路径为选取已经更新后的新程序可执行文件。
  3. 单击生成,即可在当前文件夹下生成旧程序的补丁文件。

差分包传输
在这里插入图片描述
差分包下传至设备有多种方式,如有线串口、窄带物联网、红外、4G网络等。
本系统采用有线串口方式通过差分升级上位机将差分包数据传输至设备。

  1. 单击“读取版本”按钮即可确定版本号。
  2. 接着单击“打开文件”按钮选择所需要传输的差分包。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于pycharm安装出现的interpreter field is empty,无法创建项目存储位置

关于pycharm安装出现的interpreter field is empty(解释器为空) 关于pycharm安装出现的interpreter field is empty,无法创建项目存储的位置。如图: 我之前安装的时候一直老是有这个提示,后来才发现是因为没安装这个p…

干货满满的Python知识,学会这些你也能成为大牛

目录 1. 爬取网站数据 2. 数据清洗与处理 3. 数据可视化 4. 机器学习模型训练 5. 深度学习模型训练 6. 总结 1. 爬取网站数据 在我们的Python中呢,使用爬虫可以轻松地获取网站的数据。可以使用urllib、requests、BeautifulSoup等库进行数据爬取和处理。以下是…

案例12 Spring MVC入门案例

网页输入http://localhost:8080/hello&#xff0c;浏览器展示“Hello Spring MVC”。 1. 创建项目 选择Maven快速构建web项目&#xff0c;项目名称为case12-springmvc01。 2.配置Maven依赖 <?xml version"1.0" encoding"UTF-8"?><project xm…

nacos原理

不要纠结于具体代码&#xff0c;随着版本变化源码多变&#xff0c;要学习的是基本原理和思想&#xff1b; Nacos注册中心实现原理分析 Nacos架构图 其中分为这么几个模块&#xff1a; Provider APP&#xff1a;服务提供者。 Consumer APP&#xff1a;服务消费者。 Name Serv…

k8s之StorageClass(NFS)

一、前言 1、环境 k8s v1.23.5 &#xff0c;服务器是centos7.9 192.168.164.20 k8s-master1 192.168.164.30 k8s-node1 192.168.164.40 k8s-node2 2、貌似storageClass在kubernetes v1.20就被砍了。 因为它比较慢&#xff0c;而且耗资源&#xff0c;但可以通过不同的实现镜…

Java并发机制的底层实现原理

一、前置知识 缓存一致性协议&#xff1a;每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了&#xff0c;当处理器发现自己缓存行对应的内存地址被修改&#xff0c;就会将当前处理器的缓存行设置成无效状态&#xff0c;当处理器对这个数据进行修改操作的时…

selenium常见等待机制及其特点和使用方法

目录 1、强制等待 2、隐式等待 3、显示等待 1、强制等待 强制等待是在程序中直接调用Thread.sleep(timeout) ,来完成的&#xff0c;该用法的优点是使用起来方便&#xff0c;语法也比较简单&#xff0c;缺点就是需要强制等待固定的时间&#xff0c;可能会造成测试的时间过…

“探索计算机世界:进程的基本概念与功能“

文章目录 前言什么是进程如何描述进程进程的属性1. 进程标识符2. 内存指针3. 文件描述符表4. 进程的状态5. 优先级6. 上下文7. 记账信息 内存分配并行和并发 前言 作为程序员&#xff0c;理解计算机的组成以及计算机是怎样运行的是很重要的&#xff0c;因为只有了解计算机我们…

Jenkins 使用

Jenkins 使用 文章目录 Jenkins 使用一、jenkins 任务执行二、 Jenkins 连接gitee三、Jenkins 部署静态网站 一、jenkins 任务执行 jenkins 创建 job job的名字最好是有意义的 restart_web_backend restart_web_mysql[rootjenkins ~]# ls /var/lib/jenkins/ config.xml …

QT--崩溃原因分析

本文为学习记录&#xff0c;若有错误&#xff0c;请联系作者&#xff0c;谦虚受教。 文章目录 前言一、目的二、实现步骤1 add2line.exe2 分析文件3 crash文件 三、相关代码1 pro文件2.ccrashstack.h3.ccrashstack.cpp4.main.cpp 总结 前言 你从来来去自由&#xff0c;若你不想…

大模型时代,如何重塑AI人才的培养?知名高校专家为您解答

当下&#xff0c;随着人工智能技术的快速发展&#xff0c;大模型已经成为了人工智能发展的新方向&#xff0c;同时也对新时代AI人才的需求和培养带来了新的思考与挑战&#xff0c;需要结合当下社会对复合型AI人才的需求进行新思考&#xff0c;创新AI人才培养模式&#xff0c;以…

【ARM64 常见汇编指令学习 15 -- ARM 标志位的学习】

文章目录 ARM 标志位介绍Zero Condition flag(零标志位)零标志位判断实例 上篇文章&#xff1a;ARM64 常见汇编指令学习 14 – ARM 汇编 .balign,.balignw,.balign 伪指令学习 下篇文章&#xff1a;ARM64 常见汇编指令学习 16 – ARM64 SMC 指令 ARM 标志位介绍 在ARM架构中&am…

深度对话|如何设计合适的网络经济激励措施

近日&#xff0c;我们与Mysten Labs的首席经济学家Alonso de Gortari进行了对话&#xff0c;讨论了如何在网络运营商和参与者之间找到激励措施的平衡&#xff0c;以及Sui的经济如何不断发展。 是什么让您选择将自己的经济学背景应用于区块链和Web3领域&#xff1f; 起初&…

YOLO相关原理(文件结构、视频检测等)

超参数进化(hyperparameter evolution) 超参数进化是一种使用了genetic algorithm&#xff08;GA&#xff09;遗传算法进行超参数优化的一种方法。 YOLOv5的文件结构 images文件夹内的文件和labels中的文件存在一一对应关系 激活函数&#xff1a;非线性处理单元 activation f…

爬虫014_文件操作_打开关闭_读写_序列化_反序列化---python工作笔记033

报错,没有指定路径,没有指定路径无法创建文件 这样可以在当前目录下创建一个可写的文件 可以看到找到刚才生成的文件,看看内容

探讨uniapp的navigator 页面跳转问题

navigator 页面跳转。该组件类似HTML中的<a>组件&#xff0c;但只能跳转本地页面。目标页面必须在pages.json中注册。 "tabBar": {"color": "#7A7E83","selectedColor": "#3cc51f","borderStyle": "bl…

SpringMVC的架构有什么优势?——控制器(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

走进知识图谱(二)【世界知识图谱篇】知识表示的经典模型与平移模型及基于复杂关系建模的知识表示学习

上篇文章提到&#xff0c;该系列文章将主要围绕世界知识图谱和语言知识图谱这两大类知识图谱进行展开&#xff0c;并且提到知识图谱的主要研究包括了知识表示学习、知识自动获取和知识的推理与应用三大部分。今天主要介绍世界知识图谱的知识表示学习&#xff0c;其中包括经典的…

uniapp 左右滑动切换页面并切换tab

实现效果如图 要实现底部内部的左右滑动切换带动上方tab栏的切换&#xff0c;并且下方内容要实现纵向滚动 &#xff0c;所以需要swiper&#xff0c;swiper-item,scroll-view组合使用 tab栏部分 <view class"tabs"><view class"tab_item" v-for&…

完成图像反差处理

bmp图像的前54字节为图像头&#xff0c;第19个字节开始4字节为图像宽&#xff0c;第23字节开始4字节为图像高&#xff0c;图像大小为&#xff1a;972*720*3542099574&#xff0c;为宽*高*像素点头&#xff0c;如下&#xff1a; 图像的反差处理