BootLoader 通用设计:固件怎么分区、怎么跳转、怎么防变砖

发布时间:2026/11/4 10:04:32

BootLoader 通用设计:固件怎么分区、怎么跳转、怎么防变砖 第一次做在线升级BootLoader 写好了APP 烧进去一跳转板子直接飞了进 HardFault。查半天才知道APP 的中断向量表还在默认地址MCU 发生中断时去 0 地址取向量取到的是 BootLoader 的向量跳转早把栈搬走了取到的栈顶是错的当场崩。BootLoader 的套路其实和芯片关系不大核心就四件事把 Flash 分区、上电决定跳不跳、跳的时候把向量表和栈摆正、升级过程断电能恢复。这篇把这套通用设计讲清楚。Flash 怎么分最基础的划分最前面一小块给 BootLoader 自己后面大块给 APP再留一小块参数区存升级标志、版本号、当前激活分区。想要升级不掉线最好搞双 APP 分区A、B 各一份。当前跑 A新固件写到 B写完整校验过再切到 B 激活万一 B 跑不起来还能回 A。这就是 A/B 双分区抗变砖的关键。上电先问一句跳还是不跳BootLoader 启动后先看参数区的「升级请求」标志。这个标志可能来自通信口收到升级指令、特定按键按住、或者某个引脚电平。有请求就进升级流程收数据、写 Flash、校验、切分区没有就直接跳 APP。voidboot_main(void){if(param_upgrade_requested())// 通信/按键/引脚置位{do_firmware_update();// 收包、写另一分区、校验}if(slot_is_valid(active_slot))// 当前激活分区完整{jump_to_app(app_addr(active_slot));}// 都不行停在 BootLoader等重新升级wait_for_update();}跳转向量表和栈必须摆正这是最容易翻车的地方。APP 不在 0 地址所以它的向量表也不在默认位置。跳转前要两件事把中断向量表偏移指到 APP 的起始地址Cortex-M 上写SCB-VTOR。否则所有中断还去 0 地址取向量取到 BootLoader 的栈早搬了必崩。把主栈指针 MSP 设成 APP 向量表第一项栈顶再跳到 APP 复位向量向量表第二项。typedefvoid(*app_entry_t)(void);voidjump_to_app(uint32_tapp_addr){uint32_tsp*(volatileuint32_t*)app_addr;// 栈顶uint32_tpc*(volatileuint32_t*)(app_addr4);// 复位向量// 关所有中断避免跳转过程被中断打断__disable_irq();// 向量表偏移到 APP 起始SCB-VTORapp_addr;// 设主栈指针__set_MSP(sp);// 跳过去((app_entry_t)pc)();}注意顺序先关中断再改 VTOR、设 MSP、跳。APP 起来后会重新初始化自己的中断和栈。BootLoader 里开过的定时器、DMA 等外设最好在跳转前关掉或复位别把状态留给 APP。升级过程断电能恢复才叫可靠双分区升级的标准流程收到新固件写到非当前的分区比如正跑 A写到 B。整包收完算校验CRC 或哈希不对就丢弃重来。校验通过更新参数区把「激活分区」指向 B并记录版本号。复位BootLoader 跳到 B。B 启动后自检确认能跑再清掉「升级中」标志。关键在第 3 步校验通过才切换激活标志。如果写到一半断电参数区还是指向旧的 A重启继续跑 A设备不砖。新固件哪怕残缺也没被激活。防刷非法固件验签如果设备会通过网络升级光校验不够得验签。思路发布时用私钥对固件哈希做签名BootLoader 里存公钥升级时验签名对得上才允许激活。这样别人没法刷篡改过的固件。非对称验签如 ECDSA在资源紧的 MCU 上要算一会儿但只在升级时跑一次能接受。回滚启动失败要能退加一个「启动失败计数」。APP 起来后在规定时间内比如喂一个「我还活着」的标志清计数如果连续几次启动都失败BootLoader 判定当前分区坏了回退到上一版本分区。这和用户层看门狗配合防止一个坏固件把设备锁死在重启循环里。10 个容易踩的坑跳转前没改 VTORAPP 中断全进 BootLoader 向量栈错直接 HardFault。跳转没先关中断跳转途中被中断打断上下文乱套。MSP 没设成 APP 的栈顶函数调用用到错栈立刻崩。APP 编译时 ROM 起始地址没改烧到 0 地址和 BootLoader 重叠。升级写完没校验就切激活残缺固件被激活变砖。写到一半断电参数区已切到新分区新固件不全起不来又没回退。跳转前没关外设定时器/DMAAPP 没预期这些在跑状态冲突。看门狗在升级擦写期间没喂长擦除触发复位升级中断变砖。验签只做哈希不做签名固件被篡改也照刷不误。忘了防回滚版本号旧固件能刷回去修好的漏洞又被打开。配套骨架一个抗变砖的 BootLoader1. Flash 分区BootLoader APP A APP B 参数区 2. 上电有升级请求 - 写非当前分区 - 整包校验 - 改激活标志 - 复位 3. 无请求校验当前分区有效 - 关中断 - 改 VTOR - 设 MSP - 跳 APP 4. 升级中掉电激活标志仍指向旧分区重启继续跑旧的 5. 验签防非法固件版本号防回滚 6. 启动失败计数 看门狗连续失败回退上一分区BootLoader 的价值不是「能升级」是「升级坏了还能回来」。分区隔开、校验门后再激活、断电能回到旧的这三道关少一道OTA 就是给现场埋雷。下一篇回到语言层C 的字节序、对齐和结构体 padding。你以为sizeof(struct)等于各成员之和编译器笑而不语。
延伸阅读

更多相关文章

2026/10/25 0:15:57

SparDA:把KV选择提前一层,长上下文推理显存带宽双优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 20:36:34

组合数学与应用:从计数原理到工程实践的进阶学习指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 23:05:43

SQL Server索引优化实战:从原理到避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 9:59:48

性能测试实战:从压测准备到结果分析全流程

1. 性能测试实战经验分享 干了十几年测试的老兵来聊聊性能压测那些事儿。第一次接触性能测试还是在2008年,当时为了测试一个电商系统,硬是用LoadRunner折腾了三天三夜。现在回想起来,当时踩过的坑、犯过的错,都是今天能在这里分享…

2026/11/4 9:59:48

运维不归路:从告警值班到SRE转型的破局指南

凌晨两点四十,手机在枕头边上震。不是闹钟,是告警。我摸黑看了三秒屏幕——某核心服务的健康检查连续失败,曲线正在往下掉。那一刻的清醒程度,比我早上九点坐在工位上要高得多。这种日子过了几年之后,我开始认真思考一…

2026/11/4 9:59:48

软件交付移交清单模版:结构化字段与自动校验闭环

简介:软件交付系统移交清单模版是一份面向项目经理、实施顾问与验收人员的文档模板,用于软件项目交付阶段梳理并确认软件、硬件、项目文档及培训支持等移交内容,减少遗漏与交接争议。压缩包内共1个docx文件,约14KB,采用…

2026/11/4 9:59:48

AI CLI Token用量监控:本地化零侵入式Hook追踪系统

1. 这不是监控软件,而是一套AI工程师的“油表”系统你有没有过这样的经历:深夜调试一个LangChain流水线,突然发现OpenAI API返回429——Rate limit exceeded。翻遍日志,却找不到是哪个脚本、哪次请求、在什么时间点把额度耗光的&a…

2026/11/4 9:59:48

KIS专业版10.0到12.2升级:账套备份、科目转换与验证要点

简介:面向金蝶KIS 10.0至12.2升级场景的参考文档,适合正在做版本迁移、功能对照或实施培训的财务与信息化人员使用,重点解决新旧版本能力差异梳理和升级要点查阅问题。压缩包内共1个doc文件,约17KB,以文字条目汇总的形…

2026/11/4 9:54:47

跨境电商多账号风控:设备隔离与支付物流合规指南

1. 跨境卖家面临的多账号管理挑战最近两年,跨境电商行业出现了一个明显的趋势:平台规则日趋严格,多账号运营的合规风险显著增加。我接触过不少卖家,从最初轻松管理几十个账号到现在维护5-6个账号都如履薄冰。这种变化主要源于三个…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑