网易首页 > 网易号 > 正文 申请入驻

STM32差分升级大法:1MB固件秒变几十KB!

0
分享至

前面几篇,整包升级已经跑通了。有人问,每次都传1MB固件,是不是太浪费?流量花钱,时间也长。有没有办法,只传改动的那一点?有,叫差分升级。这篇把它讲透。你会发现,它和前面的Bootloader是一脉相承的。
一、为什么整包升级太浪费

假设你有一台设备。固件大小1MB。这次只改了三个函数,加了几十行代码。

可整包升级,还是得把1MB全传一遍。

串口还能忍。换成4G,流量要钱。换成LoRa,带宽只有几百bps,1MB传完要好几个小时。这就不划算了。

差分升级的思路很简单。设备上有旧固件。服务器上有旧和新两份。服务器算出"新减旧"的差异,只把这个差异传过来。设备拿着旧固件加差异,在自己身上还原出新固件。

差异通常很小。改了几十行,差异可能就几KB到几十KB。

二、核心:服务器算差,设备做加

这一步要分清楚。难的在服务器,不在设备。

服务器用bsdiff这类算法,把旧固件和新固件对齐。找出哪些字节没变,哪些变了。然后输出三块东西。

控制块,告诉设备"复制多少,从旧固件哪里抄,再加什么偏移"。差异块,就是那些变了的内容。新增块,旧固件里没有、纯新增的数据。

设备这边只做一件事。照着控制块,从旧固件搬字节,叠加差异,写进新固件。这个过程叫补丁应用,英文叫patch apply。它不需要做复杂匹配,所以MCU上跑得动。

换句话说,重活服务器干了。设备只做按图索骥的体力活。

// 简化版补丁应用:控制块是一串三元组 (copy_len, seek_off, add_len)
// 设备依次读取,从old抄copy_len字节到new,再追加add_len字节补丁数据
intapply_patch(constuint8_t *old, uint8_t *new,
constuint8_t *ctrl, uint32_t ctrl_len,
constuint8_t *patch, uint32_t patch_len) {
uint32_t old_pos = 0, new_pos = 0, patch_pos = 0, ctrl_pos = 0;
while (ctrl_pos < ctrl_len) {
uint32_t copy_len = read_u32(ctrl, &ctrl_pos); // 从old抄多少
int32_t seek_off = read_i32(ctrl, &ctrl_pos); // old指针挪多少
uint32_t add_len = read_u32(ctrl, &ctrl_pos); // 补丁追加多少
for (uint32_t i = 0; i < copy_len; i++) // 1) 从旧固件搬
new[new_pos + i] = old[old_pos + i];
old_pos += copy_len; new_pos += copy_len;
for (uint32_t i = 0; i < add_len; i++) // 2) 叠加差异
new[new_pos + i] = patch[patch_pos + i];
patch_pos += add_len; new_pos += add_len;
old_pos += seek_off; // 3) 移动旧固件指针
}
return new_pos; // 新固件的总长度
}

这段代码是原理示意。真实bsdiff还会把差异块压缩,设备要先解压再叠加。但骨架就是这三步。

三、存储怎么摆:这是个真问题

整包升级时,你只要一块下载缓冲,和一个写目标Flash的区。差分升级麻烦在,你得同时拿着"旧的"和"算新的"。

以一颗带1MB Flash的STM32L496举例。之前我们把Flash分成四块:Bootloader、APP1、APP2、KEY。

差分升级时,APP1正在跑,它就是"旧固件"。补丁从串口收进来,先放进一块RAM缓冲,或者外部SPI Flash。Bootloader读APP1当old,读补丁当patch,把还原出的new写到APP2。

写完校验CRC没问题,再把KEY里的运行标志指向APP2,重启。下次就从APP2跑新固件了。

关键点:补丁要小。几十KB的补丁,内部RAM多半放得下。要是补丁比RAM还大,就得借用外部Flash当暂存,复杂度就上去了。

场景 需要旧固件 需要补丁缓冲 写目标 备注 整包升级 不用 一小块 APP区 最简单 差分(小补丁) APP1区 RAM几十KB APP2区 最常用 差分(大补丁) APP1区 外部Flash APP2区 补丁超RAM才用 四、它怎么接上前面的Bootloader

你发现没有,差分升级一点没动前面的框架。

传输层没变。还是A5 A0那套帧,还是那个环形缓冲。Bootloader还是从缓冲取字节。

变的只是"取出来之后干什么"。整包时,收到的字节直接写Flash。差分时,收到的字节先攒成补丁。等收齐了,跑一遍apply_patch,把结果写Flash。

触发也没变。APP里那句打印区分自己是APP1还是APP2,照旧。

所以前面几篇打下的底子,差分升级直接复用。你甚至可以把两种模式做成可切换。小改动走差分,大版本走整包。

五、几个坑,提前说

版本要对上。补丁是"旧版本A到新版本B"算出来的。设备手上是A,才能用。要是设备停在更早的版本,补丁套不上,必须先用整包升到A。所以KEY里最好记下当前版本号。

校验不能省。补丁应用完,一定要对new算CRC,跟补丁里带的目标CRC比对。对不上就别跳,老老实实回退到旧区。

公网要加签。补丁在公网传,被人中间替换就麻烦了。前面说过,示例工程是教学版,没做这层。真上公网,得给补丁加个签名再验。

慢,但只在服务器。设备上apply是线性扫描,跟固件大小成正比。1MB也就扫一遍,毫秒级能跑完。重活全在服务器生成补丁那一步。

小结

下次有人吹"我们的OTA一次只传几十KB",你能不能一眼看出来,他到底是在传差分补丁,还是只是把整包压缩了一下?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
美国向全世界宣告,从下个星期开始,禁止任何一艘船进入伊朗?

美国向全世界宣告,从下个星期开始,禁止任何一艘船进入伊朗?

共工之锚
2026-08-15 00:15:35
詹姆斯为何离开湖人?隆多的话一针见血,76人最可怕的或许是布朗

詹姆斯为何离开湖人?隆多的话一针见血,76人最可怕的或许是布朗

小路看球
2026-08-16 15:50:51
发现中国一个奇怪的现象:只要有公婆帮扶的家庭,儿媳都忙着回公婆家;而公婆不帮的家庭,儿媳早已断联!

发现中国一个奇怪的现象:只要有公婆帮扶的家庭,儿媳都忙着回公婆家;而公婆不帮的家庭,儿媳早已断联!

心理观察局
2026-08-01 07:10:30
台风又有新消息,未来10天或将生成!今天浙江降水区域已锁定,局部仍有暴雨到大暴雨!

台风又有新消息,未来10天或将生成!今天浙江降水区域已锁定,局部仍有暴雨到大暴雨!

台州交通广播
2026-08-16 14:55:50
广东省中医院提醒:立秋多喝这碗老汤,驱散暑热抵御初秋燥气

广东省中医院提醒:立秋多喝这碗老汤,驱散暑热抵御初秋燥气

王二哥老搞笑
2026-08-16 01:22:38
太心酸了!42岁著名女歌手江苏走穴,宾客只顾吃席没人搭理

太心酸了!42岁著名女歌手江苏走穴,宾客只顾吃席没人搭理

小徐讲八卦
2026-02-12 12:13:20
湖南女子宣布永久停更,幼子溺亡,婆婆当时在放羊

湖南女子宣布永久停更,幼子溺亡,婆婆当时在放羊

九方鱼论
2026-08-14 04:49:44
导演条子哥卷入郭德纲风波!网友指责是他的举报,其表示被冤枉,但他称绝不后悔自己所做的一切

导演条子哥卷入郭德纲风波!网友指责是他的举报,其表示被冤枉,但他称绝不后悔自己所做的一切

火山詩话
2026-08-16 16:16:12
苹果官网突然上架大量新品,这价格太猛了!

苹果官网突然上架大量新品,这价格太猛了!

XCiOS俱乐部
2026-08-15 10:43:10
央视曝光:近150人组团夜爬封禁山峰,为规避检查绕行野路,路面遍布碎石,多名10岁左右儿童随行;领队:手电筒尽量少开,被逮着全得回去

央视曝光:近150人组团夜爬封禁山峰,为规避检查绕行野路,路面遍布碎石,多名10岁左右儿童随行;领队:手电筒尽量少开,被逮着全得回去

极目新闻
2026-08-16 13:34:35
地级市市委书记,履新河北师范大学书记,升了还是降了?

地级市市委书记,履新河北师范大学书记,升了还是降了?

东东趣谈
2026-08-16 14:13:49
深度分析:詹姆斯和乔丹的实力差距有多大?

深度分析:詹姆斯和乔丹的实力差距有多大?

篮球大视野
2026-08-16 18:43:22
曝勇士非常欢迎克莱回归!三大因素或成阻碍 湖人热火将参与竞争

曝勇士非常欢迎克莱回归!三大因素或成阻碍 湖人热火将参与竞争

罗说NBA
2026-08-16 06:59:05
小米汽车(北京)招普工了!25元/小时,每天上班11个小时,一天275元,2班倒,上13天休1天,劳务外包,你愿意干吗?

小米汽车(北京)招普工了!25元/小时,每天上班11个小时,一天275元,2班倒,上13天休1天,劳务外包,你愿意干吗?

谭谈社会
2026-08-16 12:21:26
5年来首次负增长!知名老牌子卖不动了?下半年拟多砸7.8亿打广告

5年来首次负增长!知名老牌子卖不动了?下半年拟多砸7.8亿打广告

财经八卦
2026-08-16 17:55:31
路易吉认罪了!律师接连替他扳回两局,甚至躲过死刑。这次认罪,却是一招险棋...

路易吉认罪了!律师接连替他扳回两局,甚至躲过死刑。这次认罪,却是一招险棋...

英国那些事儿
2026-08-15 23:25:03
“这身材若是生在穷人家,嫁人都困难”,附中校服女孩火了,众说纷纭

“这身材若是生在穷人家,嫁人都困难”,附中校服女孩火了,众说纷纭

泽泽先生
2026-08-15 13:47:42
WTT大满贯!张本美和出局,王艺迪强势爆发,中国包揽女单冠亚军

WTT大满贯!张本美和出局,王艺迪强势爆发,中国包揽女单冠亚军

南海浪花
2026-08-16 19:32:36
又打到莫斯科了?乌克兰重创俄罗斯萨瓦斯列伊卡空军基地!

又打到莫斯科了?乌克兰重创俄罗斯萨瓦斯列伊卡空军基地!

项鹏飞
2026-08-15 21:15:35
中超无罚分积分榜:成都继续9分领跑,“鲁京花”分列2-4位

中超无罚分积分榜:成都继续9分领跑,“鲁京花”分列2-4位

懂球帝
2026-08-15 22:05:51
2026-08-16 20:32:49
呼呼历史论
呼呼历史论
分享有趣的历史
714文章数 17901关注度
往期回顾 全部

科技要闻

210亿美元,黄仁勋投了马斯克

头条要闻

美国明说了:不希望苹果公司采购中国存储芯片

头条要闻

美国明说了:不希望苹果公司采购中国存储芯片

体育要闻

1-4!39岁梅西双手抱头:点球不进+2中柱

娱乐要闻

李小冉疑承认离婚 多次强调“一个人”

财经要闻

事关8万亿养老金!长周期考核落地中

汽车要闻

杨洋成001号车主 岚图追光S正式上市

态度原创

时尚
旅游
本地
健康
手机

看来看去还是穿裙子最显气质,不花哨、不扮嫩,大方又舒适

旅游要闻

初秋趵突泉,游人如织景色宜人

本地新闻

黄景藏用半刀泥刻瓷都魂

专家解答青少年脊柱侧弯七大问题

手机要闻

还得是雷军!小米18标准版是非iOS端唯一搭载2nm芯片的标准版旗舰

无障碍浏览 进入关怀版