2398374_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2398374_zh-CN

2398374_zh-CN

启用 XIP FLASH 重映射后,在镜像交换后对 MCUBoot 镜像进行调试/刷写。

各位亲爱的朋友们,

我想请教一下,为什么我们的U盘会在某种特定情况下出现故障?

我们使用定制的电路板,搭载 IMXRT1176,我们的电路板基于 Embedded Artists 的该 MCU 载板。我们的项目中,闪存中有两个分区,分别为 0x30100000 和 0x30200000。我们使用 MCU-Link 和 Linkserver 来烧录二进制文件。在这种情况下,二进制文件会使用 --confirmed 进行签名。我们启用了 FLASH 重映射功能,因此不会执行交换操作。

我们观察到两种情况:
1.如果闪存中有引导加载程序,并且分区 1 中有镜像,则一切都按预期工作。

2. OTA 升级完成后,MCUboot 从第二个分区启动新镜像,此时我们将无法再写入 FLASH 分区 1,因为链路服务器会报错:

=================================================
Nc:正在打开闪存驱动程序 MIMXRT1170_SFDP_QSPI.cfx(已驻留)
Nc:发送 VECTRESET 以运行闪存驱动程序
Nc:检测到 Flash 变体“iMXRT1170_SFDP_FlexSPI1_A_QSPI 2026 年 5 月 15 日 18:32:39”(16MB = 256*64K,地址为 0x30000000)
Pb:1/1 (0) 正在写入地址 0x30100000 的扇区 16-31,共 1048576 字节
PS:(0)位于 30100000:0 字节 - 0/1048576
Ec: op ProgramPage (0x30100000, 0x20002830, 0x4000) 状态 0x1 - 驱动程序报告驱动程序错误 - EXTSPIJ 驱动程序返回码 1 - 操作失败

Ec: op ProgramPage (0x30100000, 0x20002830, 0x4000) 状态 0x1 - 驱动程序报告驱动程序错误 - EXTSPIJ 驱动程序返回码 1 - 操作失败


请注意,我已经使用 erase-range 命令擦除了第一个分区。我还可以确认,当我们的固件通过闪存驱动程序执行此操作时,它能按预期工作。只有当我尝试手动使用链接服务器时才会失败。


===================================================

问题一:这样做有什么明显的原因吗?我们应该总是擦除分区 2 还是两个分区都擦除?

Q2. 如果我们为 slot1 构建了一个二进制文件,那么当我们将其连接到运行在分区 2 中的镜像的核心时,该二进制文件是否能正常工作?Flash 重映射能否使其正常工作?


提前感谢您的帮助!
此致!
雅库布

Re: Debug/Flash MCUBoot image after after image swap with XIP FLASH remap enabled

你好 Gavin,非常感谢你的回复!你真的帮我理解了这些概念。

如果可以的话,能否请您再帮我解决一件事?

这是我通过OTA更新获取到的分区信息:
===========

图片 0;名称 APP;状态 永久:

插槽 0 APP_PRIMARY;偏移量 0x100000;大小 0x100000 (1048576):
< size="" 821444="">
图像有效载荷的 SHA256 值:C825709456C098E38090...
log_addr 0x30100000 重映射为 0x30200000

插槽 1 APP_SECONDARY;偏移量 0x200000;大小 0x100000 (1048576):
< size="" 821444="">
图像有效载荷的 SHA256 值:EBFCCC0D3E970230E404...
log_addr 0x30200000 重映射为 0x30200000
*积极的*
===============

然后我运行这个脚本来清除 slot0。
LinkServer.exe flash MIMXRT1176xxxxx:MIMXRT1170-EVKB erase-range 0x30100000 0x100000

根据你所说,我原本以为会删除 slot1,因为重新映射叠加层已启用。然而,事实并非如此。断电重启后出现的情况是:

=========

Flash REMAP_OVERLAY 已激活。

图片 0;名称 APP;状态 无:

插槽 0 APP_PRIMARY;偏移量 0x100000;大小 0x100000 (1048576):

插槽 1 APP_SECONDARY;偏移量 0x200000;大小 0x100000 (1048576):
< size="" 821444="">
图像有效载荷的 SHA256 值:EBFCCC0D3E970230E404...
log_addr 0x30200000 重映射为 0x30200000
*活跃*=========

我仍然无法向 slot0 写入任何内容,这出乎我的意料。是否有可能擦除操作绕过了重映射的逻辑映射,而加载操作则没有?

Re: Debug/Flash MCUBoot image after after image swap with XIP FLASH remap enabled

你好@jslota13245 ,

感谢您对 NXP MIMXRT 系列产品的关注!

根据您提供的信息,我认为应该考虑以下原因。故障是由以下原因造成的: FlexSPI 重映射仍然启用 OTA 之后。当 MCUboot 通过重映射启动 slot1(分区 2)时,它会将重映射保留到应用程序中。LinkServer 的 .cfx 闪存驱动程序通过 AHB 逻辑地址进行编程,因此重映射会静默地将您的写入操作重定向到 0x30100000 (分区1)到物理 0x30200000 (分区 2)——其中已包含已确认的图像,并且不为空。NOR闪存无法覆盖它。

你之前的 erase-range 0x30100000 实际上,出于同样的原因,我也删除了分区2。你自己的固件之所以能工作,是因为它通过以下方式进行编程: FlexSPI IP 命令模式,具有明确的物理偏移量,绕过重映射。注意:VECTRESET / 调试器附加 重映射并不明确——只有 POR 或显式寄存器写入才能实现。

问题1:要删除哪个分区?

关键在于先禁用分区重映射,而不仅仅是删除分区。受到推崇的:

  1. 使用 LinkServer 进行编程之前,请清除重映射寄存器;
  2. 然后擦除两个分区(slot0 和 slot1)。由于 direct-XIP 会选择最高版本,因此插槽 1 中遗留的过时映像会导致 MCUboot 再次选择它并重新启用重映射,从而导致问题再次出现;

Q2:当把 slot1 二进制文件附加到运行 partition2 镜像的核心上时,它能正常工作吗?

图片应该链接 一次用于主槽( 0x30100000 );同一个二进制文件通过重映射从任一槽运行——无需单独构建槽1的**版本**。当您附加到调试位置时,重映射会保持逻辑地址一致,因此代码读取/断点可以正常工作。然而,同样的重映射操作在写入闪存时会改变物理目标,所以你 在用 LinkServer 对 slot0 进行编程之前,必须先禁用重映射。

此致,
加文

Re: Debug/Flash MCUBoot image after after image swap with XIP FLASH remap enabled

@Gavin_Jia

亲爱的加文:

请您看一下我对您回复的评论,看看我们是否遗漏了什么?

非常感谢你的帮助!

此致,
雅库布

Re: Debug/Flash MCUBoot image after after image swap with XIP FLASH remap enabled

你好@jslota13245 ,

很抱歉错过了您之前的消息。

遗憾的是,一旦答案被标记为已接受,系统就会自动认为问题已解决,我将不再收到有关此案件的更新信息。对于我的疏忽,我深表歉意。

我将尝试在我这边重现这个问题。请给我一些时间进行调查,如有任何调查结果或进展,我会及时向您汇报。
感谢您的耐心和理解。

此致,
加文

Re: Debug/Flash MCUBoot image after after image swap with XIP FLASH remap enabled

你好@jslota13245 ,

希望你一切都好!

我继续深入调查此事,以下文章提供了一些初步结论: https://www.cnblogs.com/henjay724/p/13538105.html

擦除和编程功能不受重新映射的影响。两者都通过物理地址上的 FlexSPI IP 命令进行擦除,因此您的擦除范围 0x30100000 确实擦除了物理插槽 0——这就是为什么插槽 0 显示“未找到映像”而插槽 1 完好无损的原因。我之前关于擦除操作会命中插槽1的说法不准确,对此我深表歉意。写入操作仍然失败的原因是读取验证,而不是写入操作本身。

我认为最简单的解决方法仍然是在刷写镜像之前禁用重映射功能。或者,在刷写固件后,使用 IP 命令从内存中读取数据;如果读取的数据与写入的数据匹配,则证明故障仅仅是由于 AHB 校验和被欺骗所致。

此外,官方声明也支持了之前的猜测: https://mcuxpresso.nxp.com/mcuxsdk/latest/html/examples/ota_examples/_doc/flash_remap_readme.html#mc...


Tags (1)
No ratings
Version history
Last update:
‎08-13-2026 05:31 PM
Updated by: