在嵌入式系统开发中,bootloader的配置一直是关键环节。FSP(Flexible Software Package)6.0.0版本对MCUboot的配置方式进行了重大调整,这直接影响了开发者对bootloader和应用程序内存布局的管理方式。
与FSP 5.9.0及更早版本相比,最显著的变化是移除了通过MCUboot堆栈"闪存布局"属性配置扇区地址分配的功能。这意味着开发者不能再像以前那样简单地通过图形化界面设置MCUboot、主区域、Scratch区域等的地址分配。取而代之的是,现在必须通过创建解决方案项目来明确完成链接器配置。
这种变化背后的技术考量是:
重要提示:FSP 6.0.0中,所有内存布局配置都必须通过解决方案项目完成,不再支持早期版本中的图形化配置方式。
首先需要搭建一个基于MCUboot的项目。以RA6M5为例(其他RA MCU系列流程类似),具体步骤如下:
这个初始项目将作为后续配置的基础。值得注意的是,RA6M5是Cortex-M33内核的MCU,其内存映射和安全性考虑与非TrustZone配置有所不同,需要特别注意。
完成基础项目创建后,需要将其设置为主应用程序:
构建过程会自动生成引导加载程序SmartBundle(.sbd文件)并附加到主应用程序上。这个.sbd文件包含了bootloader所需的元数据,是后续升级过程的关键。
这是FSP6.0中最重要的变化点。创建FSP解决方案项目(高级版)的步骤如下:
这里需要特别注意:"FSP解决方案项目(高级版)"与普通"FSP解决方案项目"不同。前者专门用于引导加载程序、主区和次级区域的内存设置,而后者主要用于多核应用项目创建。
在解决方案项目的FSP配置中,内存布局是关键。以下是典型的MCUboot交换模式配置示例:
code复制引导加载区域大小:0x18000 @ Flash_CM33_B
主区域头部大小:0x200 @ __BL_0_P_H
主区域图像尺寸:0x1DE00 @ FLASH_CM33_S
次要区域头部大小:0x200 @ __BL_0_S_H
次要区域图像尺寸:0x1DE00 @ __BL_0_S_I
刮痕区域大小:0x8000 @ __BL_S
这些配置项的含义如下:
如果需要将次级区域分配到外部存储器(如QSPI或OSPI),需要特别注意:
配置示例:
code复制__BL_0_S_H = 0x60000000; /* QSPI Flash起始地址 */
__BL_0_S_I = 0x60000200; /* 图像起始地址 */
完成主应用和内存布局配置后,还需要设置次级应用程序:
构建过程同样会生成SmartBundle并附加到次级应用上。这个次级应用就是用于系统升级的镜像文件。
在FSP6.0中,链接器脚本的修改是必须的。常见问题包括:
解决方案:
当使用MCUboot进行升级时可能遇到的问题:
排查步骤:
对于读者提到的FSP6.4.0版本中bootloader工程配置MCUboot模块的问题,特别是升级模式为swap时的设置位置:
在FSP6.4.0中,配置方式与6.0.0类似但有一些改进:
升级模式的设置位置:
新增功能:
注意事项:
在实际项目中,我发现最稳妥的做法是:
这种渐进式的开发方式可以避免很多后期难以排查的问题。特别是在处理安全启动和加密镜像时,早期的验证可以节省大量调试时间。