关于Microchip SAMD51处理器Bootloader开发的技术问询
针对SAMD51 Bootloader开发的问题解答
一、OTA传输缩减数据量的可行方案
- 提取Data Record生成BIN文件完全可行:HEX文件里的Data Record是实际程序数据,其余如扩展地址记录、结束记录都是辅助信息,提取后转BIN能大幅压缩体积,你生成200kB的结果是合理的。附加地址长度表头的方式没问题,Bootloader可通过表头确定写入起始地址和数据长度,无需解析HEX格式。
- 更优替代方案:
- 增量更新:仅传输新旧版本的差异数据(比如用bsdiff这类差分算法),若新版本仅修改部分代码,数据量会远小于完整BIN。但需在Bootloader中实现差分补丁还原逻辑,适合频繁小更新场景。
- 轻量压缩:用zlib对BIN文件压缩,Bootloader端解压后写入Flash。SAMD51的硬件性能足以支撑解压操作,能进一步降低传输体积。
- 过滤空数据:HEX中常存在全0填充的Data Record(未使用的Flash区域),生成BIN时可跳过这些块,只传输有效数据,Bootloader写入时跳过对应空区域即可。
二、SAMD51应用代码重定位与双分区更新最优方案
- SAMD51应用代码默认无重定位性:编译时已将代码链接到固定起始地址(比如假设Bootloader占0x00000000-0x0001FFFF,初始应用链接到Sector1的0x00020000)。若新应用是基于Sector1地址编译的,直接放到Sector2运行会出错——所有绝对地址引用(函数指针、全局变量等)都会指向Sector1的旧地址,而非Sector2的实际位置。
- 双分区更新最优方案(改进版Option A):
不要直接复用旧应用的镜像,编译新应用时指定链接到Sector2的起始地址。这样新应用的所有地址引用都基于Sector2,写入后只需切换向量表即可直接运行:- 在MPLAB X等编译器的链接脚本中,为两个应用分区配置不同的起始地址和长度,生成对应分区的应用镜像。
- Bootloader收到链接到Sector2地址的BIN镜像后,写入Sector2。
- 修改SAMD51的
VTOR(向量表偏移寄存器),设置为Sector2的起始地址。 - 跳转到Sector2的复位向量地址,启动新应用。
这种方案无需复制数据,速度快、可靠性高,是双分区OTA的标准实现方式。
- Option B仅适用于特殊场景:若应用必须固定链接到同一起始地址(比如遗留代码无法修改链接配置),才需要复制到Sector1运行,但会增加更新时间和出错风险,不推荐。
内容的提问来源于stack exchange,提问作者garrettb
相关产品推荐
相关产品推荐

