# 基于F407核心板的差分OTA实验 **Repository Path**: liangxu6666/bspatch_application ## Basic Information - **Project Name**: 基于F407核心板的差分OTA实验 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-01-07 - **Last Updated**: 2025-02-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. 移植参考:https://blog.csdn.net/qq_35333978/article/details/128211763?spm=1001.2014.3001.5501 2. 源码连接:https://gitee.com/qq791314247/mcu_bsdiff_upgrade/tree/v1.0.0/#https://gitee.com/link?target=https%3A%2F%2Fblog.csdn.net%2Fqq_35333978%2Farticle%2Fdetails%2F128211763%3Fspm%3D1001.2014.3001.5501 一、本项目适用f407板子做差分移植DEMO 二、功能实现: 1. 使用“secureCRT”串口工具实现Xemodem协议传输app测试程序; 2. 使用串口命令 "start_xmodem_app1" 开始等待传输 app10.bin 文件; 3. 使用串口命令 "start_xmodem_patch" 开始等待传输 patch.bin 文件; 4. 使用串口命令 "start_app1_patch_to_app2" 开始将 app10.bin+patch.bin 合成 app11.bin 文件; 5. 使用"start_jump_app1"、"start_jump_app2" 实现boot向app程序跳转。 三、内存管理: 1. 使用正点原子的内存管理方案; 2. 给接口提供CCM内存,加速差分运算。 四、BSDiff算法原理: 1. 简介:bsdiff是由Conlin Percival开源的一个优秀的差分算法,在Android系统中所使用的imgdiff本质上就是bsdiff。 2. 原理: a. 传统差分:包含复制和插入两种操作,劣势:对源代码进行少量的修改就会导致二进制文件产生较大的差异,从而复制和插入指令增多 b. bsdiff差分:bsdiff算法中会找到以下两部分,求出字节差异,产生的数据将会是高度可压缩的 ⅰ. 不受更新代码影响的部分:这一区域变化非常稀疏,即使有变化也是部分指针或寄存器的地址进行了一两个字节的变动,这就导致字节差异几乎为0 ⅱ. 更新代码后间接影响的部分:有些代码和数据的地址会发生偏移,而且偏移值相同。 3. bsdiff更新数据的基本结构: a. Header:头部,用于记录文件的大小 起始位置 长度/字节 内容 0 8 "BSDIFF40" 8 8 ctrl block 长度 16 8 diff block 长度 24 8 新文件的大小 b. ctrl block:由(x,y,z)组成; ⅰ. x : 从old中读取x字节和diff block中读取x字节做字节加运算 ⅱ. y : 代表从extra block中读取y字节数据并且插入到新文件中 ⅲ. z : 在old中向前移动z字节 c. diff block : 字节的差值 d. extra block : new文件中新生成的字节值 4. bsdiff 算法步骤: a. 通过后缀排序(时间复杂度nlogn,空间复杂度O(n))技术对old文件的内容进行排序,形成字典序。 ⅰ. 后缀排序:给定一个字符串,按字典序升序输出它的所有后缀子串的第一个字符所在位置 ⅱ. 后缀排序详细:https://www.cnblogs.com/yifusuyi/p/11739881.html b. 最长匹配:通过二分法查找计算出 diff string 和 extra string c. 将 diff string+extra string 压缩到更新文件中 /******************算法直观案例**************/ old:abcdfghilklmnopqrstuvwxyz1234567890abcd new:abcdffhijkluvaxyz123456789zxcvbnm old字典序后缀排序结果: qsufsort:I[0]==40,0, qsufsort:I[1]==39,10, qsufsort:I[2]==34,48,0abcd qsufsort:I[3]==25,49,1234567890abcd qsufsort:I[4]==26,50,234567890abcd qsufsort:I[5]==27,51,34567890abcd qsufsort:I[6]==28,52,4567890abcd qsufsort:I[7]==29,53,567890abcd ... 一、差分: 1. 得到diffstring lastsacn = 0,len = 11 new:abcdffhijkl - old:abcdfghilkl 字节值相减获得diffstring 之后还原ctrl block: x = 11 ; old读11字节 和 diff block读取11字节 做加运算 y = 0 ; extra block 读 0 字节 z = 0 ; old读取起始位置为0字节 2. 得到diffstring: new:uvaxyz123456789 - old:uvwxyz123456789 字节值相减获得diff string 之后还原ctrl block: x = 15 ; old读15 和 diff block读取15 加运算 y = 0 ; extra block 读 0 字节 z = 19 ; old读取起始位置为19字节 3. extra string 额外数据: zxcvbnm 未能匹配 x = 0 ; y = 7 ; extra block 读 7 字节 z = 0 ; 二、压缩 diff string+extra string