MCUboot 镜像压缩
Nordic nRF54L 系列中的三个无线 SoC 提供多种内存大小选项,最高可达 1.5 MB NVM 和 256 KB RAM,使其适用于广泛的蓝牙低功耗应用
1:MCUboot 镜像压缩是 nRF Connect SDK v2.8.0 中引入的一项功能,它为使用 MCUboot 进行 DFU/FOTA 的应用程序提供了额外的非易失性存储空间(non-volatile memory)。此功能允许secondary slot的大小约为application slot的 70%,从而为应用程序释放额外的内存。如果您想了解更多关于 MCUboot 和 DFU/FOTA 的信息,可以查看 nRF Connect SDK 中级课程中的第 8 课
https://academy.nordicsemi.com/courses/nrf-connect-sdk-intermediate/lessons/lesson-9-bootloaders-and-dfu-fota/

2:在使用 MCUboot 进行 DFU/FOTA 时,需要一个 DFU 分区(slot 1 or the secondary partition)来存储新接收到的图像。在图像压缩功能引入之前,DFU 分区的大小必须与应用程序分区( slot 0 or the primary partition))相同

下面的插图展示了使用 MCUboot 的传统 DFU/FOTA 过程,DFU 分区用红色突出显示,而应用程序分区用绿色表示。在某些情况下,如果您对非易失性存储器有大小要求,并希望为应用程序(用于新功能、内部存储等)拥有更多内部非易失性存储器,这可能会成为一个问题,所以引入新的MCUboot镜像压缩功能,DFU 分区和应用分区的大小不再需要对称,可以设置为应用分区大小的70%,从而提供额外的30%的非易失性内存提升用它来满足应用需求

3: nRF Compression library 用于在构建过程中压缩应用程序映像。该库支持 LZMA( NRF_COMPRESS_LZMA )版本 1 和 2,带有 ARM thumb 过滤器( NRF_COMPRESS_ARM_THUMB )。压缩率取决于应用程序的大小;通常,较大的应用程序会实现更高的压缩率,然后构建系统生成压缩映像。
在固件方面,当接收到压缩镜像时,MCUboot 在复位后在 RAM 中解压缩镜像。它确保解压缩后的大小与预期大小匹配,检查哈希值,验证镜像签名(如果启用),并确保解压缩的数据有效,所有这些操作都在将新镜像复制到主槽之前完成。
https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/libraries/others/nrf_compression.html
该功能目前支持以下 SoC:nRF54L15、nRF5340 和 nRF52840.
4:如何添加MCUboot scompressed到应用程序peripheral_lbs
1.打开 nRF Connect for VS Code,从欢迎视图选择Create a new application -> Copy a sample - > nRF Connect SDK v2.8.0 -> Bluetooth LE LED Button Service.
将新创建的示例存储在根目录附近
2. 启用 MCUboot 及其压缩镜像支持功能,这是通过在应用程序根目录中添加一个 Sysbuild 配置文件( sysbuild.conf )来完成的,在 VS Code 中切换到资源管理器视图,创建一个名为 sysbuild.conf 的新文件,并将以下行添加到其中
SB_CONFIG_BOOTLOADER_MCUBOOT=y
SB_CONFIG_MCUBOOT_MODE_OVERWRITE_ONLY=y
SB_CONFIG_MCUBOOT_COMPRESSED_IMAGE_SUPPORT=y

请记住使用自己的密钥对用于生产的镜像进行签名,上述代码配置使用 SDK 文件夹中存储的默认密钥,对所有用户可访问
3. 启用通过蓝牙低功耗进行 FOTA/DFU,要通过蓝牙低功耗将固件更新加载到设备,必须修改应用程序的 prj.conf 文件以包含以下选项。将以下 Kconfig 符号添加到文件末尾
CONFIG_BT_BUF_ACL_TX_SIZE=251
CONFIG_BT_BUF_ACL_RX_SIZE=502
CONFIG_BT_L2CAP_TX_MTU=498
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
CONFIG_MCUMGR=y
CONFIG_MCUMGR_TRANSPORT_BT=y
CONFIG_MCUMGR_TRANSPORT_BT_REASSEMBLY=y
CONFIG_MCUMGR_TRANSPORT_BT_CONN_PARAM_CONTROL=y
CONFIG_MCUMGR_GRP_OS_MCUMGR_PARAMS=y
CONFIG_MCUMGR_GRP_OS_BOOTLOADER_INFO=y
CONFIG_MCUMGR_GRP_OS=y
CONFIG_MCUMGR_GRP_IMG=y
CONFIG_NET_BUF=y
CONFIG_ZCBOR=y
CONFIG_STREAM_FLASH=y
CONFIG_STREAM_FLASH_ERASE=y
CONFIG_IMG_MANAGER=y
CONFIG_IMG_ERASE_PROGRESSIVELY=y
4.添加静态分区管理器文件
静态分区管理器文件需要创建,其中定义了应用程序的各种分区,包括非对称分区。以下静态分区管理器分区方案取自 nRF Connect SDK MCUboot 压缩更新示例https://docs.nordicsemi.com/bundle/ncs-2.8.0/page/nrf/samples/nrf_compress/mcuboot_update/README.html#nrf-compression-mcuboot-compressed-update,
用于 nRF54L15,仅使用内部 RRAM,primary slot为 764KiB,secondary slot为 536KiB(允许更新大小为primary slot大小的 70%)。此文件可命名为 pm_static_nrf54l15dk_nrf54l15_cpuapp.yml,并放置在应用程序的根目录中
将文件从这里复制到您的应用程序根目录。此文件适用于 nRF54L15 DK。如果您使用的是 nRF52840 DK 或 nRF5340 DK,请确保从示例文件夹中复制正确的文件( SDK Path\nrf\samples\nrf_compress\mcuboot_update )
5.构建应用程序
切换到 nRF Connect 扩展;在应用程序视图中,单击添加构建配置并构建 nrf54l15dk/nrf54l15/cpuapp 。保留默认选项不变,这将启用 Sysbuild,这是实现此功能所需的
检查构建日志,这里要关注的关键信息是截图下所示的压缩镜像大小:

上述输出显示,构建系统对应用固件进行了很好的压缩,压缩率约为 42%
6.创建一个新的测试镜像
可以修改现有的应用程序来演示测试压缩 MCUboot 镜像的更新功能,例如通过修改 src/main.c 文件,在应用程序开始广播时打印一条额外的消息。在广播消息上方添加 printk("(Compressed image update running)\n"); 这些更改帮助我们轻松识别正在运行的全新固件。
7.构建新镜像
此应用程序可以像之前的版本一样构建。构建系统将在生成时自动压缩固件更新,并将此文件包含在 build/dfu_application.zip 文件中,该文件可以与非压缩的固件更新 zip 文件一样使用。请勿使用调试器进行闪存;相反,将 dfu_application.zip 文件发送到您的移动设备
8.使用压缩镜像通过蓝牙低功耗进行 FOTA/DFU
在您的移动设备上打开 nRF Connect for Mobile 应用程序;从“SCANNER ”标签页连接到设备“Nordic_LBS”,连接建立后,点击右上角的三个点并选择绑定

密钥将以 6 位数字的形式打印在串行终端上,这有助于验证和加密连接

一旦配对过程完成,点击右上角的三个点,选择 DFU。然后选择 dfu_application.zip. ,最后选择测试和确认,并按确定,传输过程将开始,并需要几秒钟来完成。


新image 将首先上传到 DFU slot;一旦传输完成,将触发自动重置,MCUboot 将开始解压缩和验证新映像。验证成功完成后,MCUboot 将把新解压缩的映像移动到primary slot (不可逆),新映像将启动。现在你应该注意到新映像正在运行。注意,LED4(nRF54L15 DK 上 PCB 标记为 LED3)表示运行状态,而不是 LED1(nRF54L15 DK 上 PCB 标记为 LED0),新的日志消息 " (Compressed image update running)" 将在终端上打印
I: Image index: 0, Swap type: none
I: Image index: 0, Swap type: none
I: Image index: 0, Swap type: none
I: Image index: 0, Swap type: none
I: Image index: 0, Swap type: test
*** Booting MCUboot v2.1.0-dev-4594a8693738 ***
*** Using nRF Connect SDK v2.8.0-a2386bfc8401 ***
*** Using Zephyr OS v3.7.99-0bc3393fb112 ***
I: Starting bootloader
I: Image index: 0, Swap type: test
I: Image 0 upgrade secondary slot -> primary slot
I: Erasing the primary slot
I: Image 0 copying the secondary slot to the primary slot: 0x37370 bytes
I: Bootloader chainload address offset: 0x10000
*** Booting My Application v2.9.0-ba791918d3c1 ***
*** Using nRF Connect SDK v2.8.0-a2386bfc8401 ***
*** Using Zephyr OS v3.7.99-0bc3393fb112 ***
Starting Bluetooth Peripheral LBS example
I: 8 Sectors of 4096 bytes
I: alloc wra: 0, ef0
I: data wra: 0, c0
I: SoftDevice Controller build revision:
I: fe 2c f9 6a 7f 36 22 2e |.,.j.6".
I: a0 79 c0 40 be 2c 03 20 |.y.@.,.
I: 40 c2 f3 32 |@..2
I: HW Platform: Nordic Semiconductor (0x0002)
I: HW Variant: nRF54Lx (0x0005)
I: Firmware: Standard Bluetooth controller (0x00) Version 254.63788 Build 573996906
I: No ID address. App must call settings_load()
Bluetooth initialized
I: Identity: D5:DE:56:9A:D9:88 (random)
I: HCI: version 6.0 (0x0e) revision 0x304e, manufacturer 0x0059
I: LMP: version 6.0 (0x0e) subver 0x304e
(Compressed image update running)
Advertising successfully started
Connected
Security changed: 64:5D:F4:DB:C6:9C (public) level 4
注意使用 MCUboot 压缩固件更新时目前存在一些限制:
1:仅支持一个镜像(这意味着不支持 nRF5340 的网络核心更新或 MCUboot 更新)
2:不支持加密固件更新:
3:MCUboot 必须处于升级模式,这意味着不支持固件版本回滚
4:Sysbuild and the Partition Manager系统构建和分区管理器是此功能必需的。
浙公网安备 33010602011771号