4. TRAVEO存储架构与网关固件布局

TRAVEO系列(以CYT4BF等典型车规MCU为例)内部集成了多种物理特性差异明显的存储资源:用于存放代码与常量的Flash、用于存放运行时变量与栈的SRAM,以及部分型号配备的RRAM(阻变存储器)。网关固件布局的核心任务,就是把这些物理资源划分成职责清晰、边界明确、可被Bootloader与OTA流程安全操作的分区,并保证每个分区在ECC保护下具备可验证的数据完整性。

一、三类存储介质的定位差异

Flash是网关固件的主体,容量通常在数MB量级,按扇区(Sector)擦除、按字编程,擦写寿命有限(典型约10万次),因此不适合高频写入。SRAM容量较小(数百KB),读写无擦除限制,但掉电即失,用于栈、堆、运行时缓冲和DMA描述符。RRAM是TRAVEO较有特色的非易失存储,支持按字节写入、写入延迟低、耐久性远高于Flash,适合承载需要频繁更新的标定数据、配置参数和OTA状态标志。

理解这三者的差异,是分区规划的前提:代码和只读常量放Flash;频繁变更的小块数据放RRAM;临时计算与通信缓冲放SRAM。把高频写入的数据误放在Flash,会迅速耗尽扇区寿命;把需要掉电保持的数据放在SRAM,则会在断电后丢失。

二、Flash分区与Bootloader/OTA区规划

一个可落地的网关Flash布局通常包含以下区域:Bootloader区、Bootloader备份区、应用区A、应用区B(或应用区+升级暂存区)、标定/配置区、以及可选的共享数据区。双应用区(A/B)方案支持A/B面切换,OTA时把新固件写入非活动区,校验通过后更新启动标志,实现失败可回滚。

以示例参数说明:假设Flash总容量4MB,可规划为Bootloader 128KB、Bootloader备份128KB、应用区A 1.5MB、应用区B 1.5MB、标定与配置区256KB、共享数据区64KB,剩余作为预留。这些数值属于教学示例,实际应以芯片手册的扇区边界和链接脚本为准。分区边界必须与Flash扇区对齐,否则擦除一个分区会误伤相邻分区。

Bootloader的职责是:上电后读取启动标志,决定跳转到A区还是B区;在OTA过程中接收新固件、写入非活动区、计算校验值、更新标志。Bootloader自身应尽量小且稳定,并保留一份备份,防止升级过程中断电导致Bootloader损坏而无法启动。

TRAVEO网关存储分区与OTA数据流 Flash 4MB(示例) Bootloader 128KB 启动决策 / OTA接收 Bootloader备份 128KB 应用区A 1.5MB(活动) 当前运行固件 应用区B 1.5MB(非活动) OTA写入目标 标定/配置区 256KB ECC保护 · 版本号 共享数据区 64KB RRAM(非易失·字节写) 标定参数表 高频更新 · 掉电保持 OTA状态标志 活动区 / 校验结果 配置参数 网络/网关路由配置 SRAM(易失·运行时) 栈 / 堆 函数调用与动态分配 通信缓冲 CAN/Ethernet报文 DMA描述符 传输控制结构 OTA 读标志 加载 ECC与数据完整性校验链 写入时生成ECC 读取时校验 单比特纠正/双比特报错 CRC32 + 版本号 + 长度字段 共同判定固件/参数有效性 校验失败 → 回滚到原活动区,不切换启动标志

三、标定数据与配置参数的存储策略

标定数据和配置参数的特点是:体积小、更新频繁、必须掉电保持、且更新时不能影响正在运行的固件。把它们放在Flash的标定区会带来两个问题:一是擦除粒度大,改一个参数要擦整个扇区;二是擦写寿命消耗快。因此更合理的做法是放入RRAM,或采用“Flash主副本+RRAM增量记录”的方式。

一个实用的做法是双副本加版本号:在RRAM中保存两份参数块,每份包含参数内容、CRC32校验值和递增版本号。写入时先写非活动副本,校验通过后更新活动指针。这样即使写入过程中断电,也总有一份完整副本可用。读取时比较两份的版本号,取版本高且CRC正确的一份。

typedef struct {
    uint32_t version;      // 递增版本号
    uint32_t length;       // 参数长度
    uint8_t  payload[252]; // 参数内容
    uint32_t crc32;        // 覆盖version/length/payload
} param_block_t;

// 读取:选版本高且CRC正确的副本
// 写入:写非活动副本 → 校验 → 更新活动指针

四、ECC与数据完整性

TRAVEO的Flash和RRAM通常带有硬件ECC。ECC在写入时根据数据生成校验位,读取时重新计算并比对:单比特错误可自动纠正(SEC),双比特错误会触发不可纠正错误(DED)中断或总线错误。对网关而言,这意味着代码区和参数区在正常读取时已获得透明保护,但软件仍需处理DED事件——例如记录故障码、切换到备份区、或触发安全状态。

除硬件ECC外,固件层面还应叠加软件校验:对应用区整体计算CRC32,与存储在头部的期望值比对;对参数块计算CRC32;对OTA下载的固件分块校验后再整体校验。硬件ECC防的是存储位翻转,软件CRC防的是传输错误、写入不完整和版本错配,两者互补而非替代。

分区规划时先确认芯片手册中的扇区大小和ECC粒度,再让链接脚本、Bootloader跳转地址、OTA写入地址三者严格一致。任何一处地址偏差都会导致跳转失败或擦除越界。

五、布局落地时的检查要点

  • 分区边界是否与Flash扇区对齐,擦除操作是否只作用于目标分区。
  • Bootloader是否有备份,升级中断电后是否仍能启动。
  • 启动标志是否存放在RRAM或独立小扇区,是否带CRC保护。
  • 应用区头部是否包含长度、版本、CRC32,Bootloader跳转前是否校验。
  • 参数双副本的活动指针更新是否具有原子性,断电后是否可恢复。
  • DED错误是否有中断处理路径,是否记录并可上报。

把上述分区、介质选择、双副本参数管理和ECC/CRC双层校验组合起来,网关固件就具备了可升级、可回滚、可校验的存储基础。后续的OTA流程、故障恢复和安全启动,都建立在这套布局之上。