This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 如何在引导加载程序中设置断点

Guru**** 2478765 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/691665/how-to-set-breakpoints-in-bootloaders

 TI 基于闪存的引导加载程序内的断点最初会被覆盖。 这使得调试引导加载程序初始化代码变得困难。

此问题是 由 BL_STARTUP_CSS.s 中的函数 ProcessorInit 引起的  ProcessorInit 具有一个复制循环、可将引导加载程序代码从闪存放入 SRAM。 这使得引导加载程序能够自动擦除和写入闪存。 硬件 FPB 单元仅在代码存储器中放置断点。 SRAM 代码中的断点通过修改操作码来实现。 复制循环会覆盖 SRAM 断点。 您可能会注意到调试会话会以 SRAM 地址启动 PC。 复制循环本身并运行时、这不能解决问题。 SRAM 中的所有内容都被写入两次。

作为一种权变措施、您可以在复制循环后不久在地址处设置一个硬件观察点。  反汇编窗口显示汇编代码在内存中的位置。 在此示例中、复制循环之后是 地址为0x2000032C 的 MOV。


 在这个特定的 MOV 被第二次复制到 SRAM 后、一个位于0x2000032E 上的硬件观察点将中断。 在第二次复制之后、您可以在  0x2000032C 放置一个 SRAM 断点。 达到此断点表示复制循环已结束、您可以自由地将 SRAM 断点放置在引导加载程序中的其他位置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Peter:

    很棒的员工!

    其中一些内容可能已经过时、新的 CCS 版本已过期、但几年前、此详细文章也涵盖了许多要点、可能适合您阅读(如果您尚未无意中发现): https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/295119/1033395#1033395

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这很有趣。 复制循环实际上不需要在运行时发生两次、但调试器希望从_c_init00开始、从而使事情复杂化。 我看到这种情况发生了;调试器在0x200003A2处启动 PC。 但是、由于复制循环尚未发生、SRAM 不应初始化、因此不应成功运行。 我的权变措施不起作用。

    Miles 先生承认这一点、"因此从_c_int00 ()单步执行不起作用"。 但是、我可以单步执行_c_int00()。 我不明白这是为什么这么做的、我也不希望这样做。 我假设 CCS 让芯片运行一秒钟、在调试器将芯片重新启动到_c_int00 ()之前、执行该操作的代码就会运行。

    Stellaris 是否以他的名字命名?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Peter:

    有趣的是、_c_int00 ()问题现在不会发生... 我想知道 CCS 是否进行了一些更改、以防止它影响引导加载程序操作。 老实说、我还不需要在该级别调试引导加载程序、因此我没有从最后开始的经验 为了弄清楚这可能需要询问 CCS 人员、他们可能能够了解调试器正在进行的操作、现在调试器允许在无需额外用户步骤的情况下解决问题。 可能是 QOL 改进。

    关于:Miles,从来没有见过他,但对他非常怀疑:)。 论坛上有几个"Stellaris"名称、这些名称来自过去的几年(我认为 Paul 是另一个)。 也许在那时还没有专门的论坛、他们使用它来支持器件?