单片机OTA升级中Bootloader怎么判断APP有没有问题?

没开发过OTA的工程师,职业生涯是不完整的。因为它能让设备远程更新功能,太方便了,产品有了这个功能,再也不会跟硬件工程师一起背锅了。

不过,新手玩OTA,搞不好,也会翻车,比如下载过程中网络掉了,新固件不完整,设备可能直接"变砖"了。

今天就教你,怎么在Bootloader加靠谱的验证机制,这样哪怕网络断了,数据错了,都不会显得这么狼狈。

在单片机OTA(空中升级)中,Bootloader是个很重要的角色,它得确保新下载的固件(也就是APP)没问题,才能放心加载运行。

如果APP有毛病,比如下载不全、数据坏了或者被篡改,设备可能会罢工甚至出大乱子。

所以,Bootloader得有一套办法来检查APP到底靠不靠谱。

下面我就用尽量通俗的语言,讲讲Bootloader常见的判断方法,顺便加点代码示例帮你更好理解。

一、为什么要检查APP有没有问题?

简单来说,Bootloader检查APP是为了避免这些麻烦:

  • 数据坏了:下载时信号不好或者存储器出问题,APP内容可能出错。

  • 没下全:网络断了一会儿,APP可能只下了一半。

  • 被人动了手脚:固件被恶意改过,可能会恶意破坏/控制设备。

  • 版本不对:新APP跟硬件或者Bootloader不搭,跑不起来。

  • 放错地方了:APP没存到该存的地方,Bootloader找不到。

所以,Bootloader相当于是个"质检员",把APP好好检查一遍。

二、Bootloader怎么检查APP?

下面是Bootloader常用的几种方法,咱一个一个来看。

1. 用校验和或者CRC查数据的"身份证"
  • 啥意思:算个"校验值"跟APP自带的值比对,看数据有没有丢包或者坏掉。

  • 咋做:APP里带个校验值,Bootloader收到后自己再算一遍,比对一下。

  • 代码示例

这是无际单片机项目6的CRC16算法例子。

我们在服务器下载APP固件数据的时候,会把数据分包,比如一帧数据是200-255个字节,每帧数据都会进行CRC16校验。

  • CRC16好处:简单,算得快,单片机也能轻松搞定。

  • 缺点:只能查数据坏没坏,挡不住故意篡改。

2. 用数字签名验"出身"
  • 啥意思:就像查身份证真假,得确认APP是正宗的,没被改过。

  • 咋做:发送方用私钥给APP"盖章",Bootloader用公钥验这个章。

  • 代码示例(简单模拟一下):

cpp 复制代码
#define SIGN_ADDR (APP_START + APP_SIZE + 4)  // 签名放的位置

uint8_t signature[64];
memcpy(signature, (uint8_t *)SIGN_ADDR, 64);  // 取出签名

if (!verify_signature(app_data, APP_SIZE, signature)) {  // 假设有验证函数
    // 签名不对,可能是假货!
    printf("签名挂了,APP不靠谱!\n");
}
  • 好处:安全性高,篡改不了。

  • 缺点:算起来费劲,单片机可能有点吃力。

3. 看版本号对不对
  • 啥意思:检查APP的版本,确保跟硬件和Bootloader能搭上。

  • 咋做:从APP里读出版本号,比对一下。

  • 代码示例

cpp 复制代码
#define MIN_VERSION 0x0200  // 最低版本要求

uint16_t app_version = *(uint16_t *)(APP_START + 8);  // 版本号位置
if (app_version < MIN_VERSION) {
    // 版本太老,不行!
    printf("APP版本太低,跑不了!\n");
}
  • 好处:简单,能避免版本不匹配。

  • 缺点:只管版本,数据坏不坏它不管。

4. 检查APP放的位置对不对
  • 啥意思:确保APP在正确的存储区里。

  • 咋做:看看地址和大小有没有跑偏。

  • 代码示例

cpp 复制代码
#define FLASH_BASE 0x08000000
#define FLASH_END  0x08080000

if (APP_START < FLASH_BASE || (APP_START + APP_SIZE) > FLASH_END) {
    // 位置不对,APP有问题!
    printf("APP放错地方了!\n");
}
  • 好处:快,能马上发现存错了。

  • 缺点:只管位置,不管内容。

5. 用个"通关密码"
  • 啥意思:APP里有个特定标记,证明它没问题。

  • 咋做:Bootloader下载完后写个标记,启动时检查。

  • 代码示例

cpp 复制代码
#define FLAG_ADDR 0x08007FFC
#define FLAG_VALUE 0xA5A5

uint32_t flag = *(uint32_t *)FLAG_ADDR;
if (flag != FLAG_VALUE) {
    // 没通关密码,APP不靠谱!
    printf("标记不对,APP有问题!\n");
}
  • 好处:简单,检查快。

  • 缺点:容易被仿造,安全性不高。

三、完整的检查流程

一般来说,Bootloader不会只用一种方法,而是把几种组合起来,比如:

  1. 先看看位置对不对。

  2. 再算算CRC,确认数据没坏。

  3. 用签名验一下真假。

  4. 检查版本能不能用。

  5. 最后看标记对不对。

每一步都得过关,APP才能算"合格",不然Bootloader就得用老固件或者停下来。

四、单片机资源少咋办?

单片机不像电脑那么强,资源有限,所以得有点小聪明:

  • 用硬件帮忙:有的单片机有CRC模块,能省不少力。

  • 分块检查:别一次算太多,分成小块慢慢验。

  • 留条后路:可以划分2个内存区域,分别存老版本和新版本的APP,万一新APP有问题,能退回老版本。

五、总结一下

Bootloader要判断APP靠不靠谱,常用的招数有校验和/CRC、数字签名、版本检查、位置检查和标记验证。这些方法各有各的强项,搭配起来用,能确保APP没毛病,既安全又好用。希望这些例子和解释能让你明白咋回事儿。


最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单

片机最佳学习路径+单片机入门到高级教程+工具包」全部无偿分享给铁粉!!!

除此以外,再含泪分享我压箱底的22个热门开源项目 ,包含源码+原理图+PCB+说明文档 ,让你迅速进阶成高手

教程资料包和详细的学习路径可以看我下面这篇文章的开头

单片机入门到高级开挂学习路径(附教程+工具)

单片机入门到高级开挂学习路径(附教程+工具)

单片机入门到高级开挂学习路径(附教程+工具)

相关推荐
腻害兔10 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社11 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
潘潘的嵌入式日记12 小时前
嵌入式安全重构——新老两套同时跑
嵌入式·架构设计·验证·代码重构
萧瑟余晖12 小时前
JDK 26 新特性详解
java·开发语言
马优晨13 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
sramdram15 小时前
MCU微控制器OA打印机方案
单片机·嵌入式硬件·mcu·mcu微控制器
维天说15 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
天天爱吃肉821816 小时前
【电源拆解:跟着问答逐一认识开关适配器PCB元器件】
大数据·人工智能·python·功能测试·嵌入式硬件·汽车
Zane199416 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了17 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel