NXP MCU 技术论坛
直播中

蒲泛粟

8年用户 1011经验值
私信 关注
[问答]

在i.MX RT 1176上正常运行代码时与使用IAR调试代码时存在一些奇怪的差异,为什么?

我在 i.MX RT 1176 上正常运行代码时的行为与使用 IAR 调试代码时的行为之间存在一些奇怪的差异,并注意到这是由于堆栈指针的初始化方式造成的。

我的重置向量表将其指向 DTC 的顶部,并且在调试时一切都按预期工作,但我发现当处理器正常启动时,它根本不使用重置向量中的 SP 值,而是将其设置为(大约)0x20241d80。

我的理解是,i.MX RT 1176 中的 BOOT ROM 因此与 i.MX RT 10xx 部分中的 BOOT ROM 不兼容,其中 SP 是从重置向量中的值设置的,这意味着 SP 值must改为在 startup code 中设置。

IAR 调试器在重置处理器时似乎将其在重置向量中找到的值插入堆栈指针,这确认了一般的 ARM 架构,但在这种情况下会导致行为差异,因为它不在预期的位置 - 它与调试器一起正常工作,但在单独运行时可能会有细微的差异,这需要相当长的时间来识别。

您能否确认这已被正确识别

回帖(1)

李鸿

2025-3-24 18:14:11

在 i.MX RT1176 上,调试与正常运行时代码行为差异的根源确实与 BOOT ROM 的行为调试器的初始化流程有关。以下是关键原因分析和解决方案:




关键原因分析:




  1. BOOT ROM 的差异



    • i.MX RT1176 的 BOOT ROM 与 RT10xx 系列不同,不会直接使用用户代码的向量表中的 SP 值。在正常启动时,BOOT ROM 可能会根据启动设备(如 FlexSPI、SEMC)动态初始化 SP,导致 SP 被设置为某个默认地址(如 0x20241d80,位于 OCRAM 或 DTCM)。

    • 调试时,调试器(如 IAR)通常会绕过 BOOT ROM,直接加载用户代码到内存并手动设置 SP 为向量表中的值,因此行为与正常启动不同。




  2. 内存映射的配置



    • RT1176 的内存控制器(如 FlexSPI 映射、DTC/OCRAM 配置)可能在 BOOT ROM 阶段被初始化,导致用户代码的 SP 初始值被覆盖。




  3. 启动代码的依赖



    • 如果用户代码的启动文件(如 Reset_Handler)未显式重置 SP,则可能继承 BOOT ROM 设置的 SP 值,而非向量表中的值。






解决方案:


1. 在启动代码中显式初始化 SP


修改启动文件(如 Reset_Handler),在进入 main() 前强制设置 SP:


   Reset_Handler:
       ldr sp, =_estack     ; _estack 需在链接脚本中定义为堆栈顶部地址
       bl SystemInit        ; 其他硬件初始化
       bl main


  • 链接脚本中需正确定义堆栈区域(如 DTCM 或 OCRAM):
     _estack = ORIGIN(DTCM) + LENGTH(DTCM); /* 假设堆栈位于 DTCM 顶部 */


2. 检查 BOOT ROM 配置



  • 确认 BOOT 模式引脚(如 BOOT_CFG1/2)的设置是否与启动设备匹配。例如:

    • 从 FlexSPI NOR 启动时,BOOT ROM 可能默认将 SP 初始化为 OCRAM。


  • 参考 AN13283 (i.MX RT1170 Bootflow) 文档,了解 BOOT ROM 的详细行为。


3. 验证调试器配置



  • 在 IAR 中,检查调试配置是否跳过了 BOOT ROM(如直接加载代码到 RAM)。

  • 确保调试器未手动初始化 SP(在调试脚本中可能有隐式设置)。


4. 使用 DCD 配置内存控制器(可选)



  • 如果使用外部存储器(如 SDRAM),需在 DCD (Device Configuration Data) 中正确初始化内存控制器,确保 BOOT ROM 不会干扰 SP。

  • DCD 文件需包含 FlexSPI/SEMC 的初始化配置,并在链接脚本中指定正确的加载地址。




示例代码(启动文件片段):


extern uint32_t _estack; /* 定义在链接脚本中 */

void Reset_Handler(void) {
    // 显式设置 SP
    __asm volatile ("ldr sp, =_estack");

    // 初始化关键硬件(如时钟、内存接口)
    SystemInit();

    // 跳转到 main
    main();
}



参考资料:



  1. i.MX RT1170 Reference Manual - 查看 Chapter 9 (Boot) 和 Chapter 12 (Memory Map)。

  2. AN13283: i.MX RT1170 Bootflow - 详细说明 BOOT ROM 的行为和配置。

  3. IAR 编译器用户指南 - 检查调试器初始化脚本和内存映射配置。


通过显式初始化 SP 并验证 BOOT ROM 行为,可以消除调试与正常运行时的差异。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分