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.

[参考译文] CCS/TM4C129XNCZAD:调试 ASM 引导加载程序

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/675222/ccs-tm4c129xnczad-debugging-an-asm-bootloader

器件型号:TM4C129XNCZAD

工具/软件:Code Composer Studio

调试 TivaWare 工程 BOOT_EMAC_FLASH 时遇到问题。 该项目应通过以太网下载新的固件映像。

断点最初不起作用、我无法单步执行汇编代码。 这两个问题加在一起、我无法看到任何初始设置代码。 优化关闭时代码无法正常运行。 我认为问题是由从 SRAM 运行代码的芯片引起的。

首次加载代码时、无法设置 C 文件的断点。  禁用和启用断点将使其在代码允许运行后生效。 我还看到、如果芯片被暂停和恢复、断点会发生变化、但结果是间歇性的。  我知道处理器将在 BL_EMAC.c 的第1776行达到 while (1)循环 我在此环路中设置了一个断点。 暂停芯片显示它在这个环路内。 我可以单步执行断点。 在我恢复运行后,芯片可能会开始到达断点。 如果我暂停、禁用并重新启用断点、它将中断。 为此、我取消选中"Breakpoints"窗口中的复选框。  注意要重新创建此问题,需要将开发套件插入交换机。 之前的等待会查找网络连接。 在达到 BL_EMAC.c 的第1776行之前

  BL_STARTUP_CCS.s 的第257行不适用于单步执行或单步执行命令。 这些命令中的任何一个看起来都类似于命令"resume running (恢复运行)"。 ProcessorInit 位于 BL_STARTUP_CCS.s 的第190行 我可以在标签"ProcessorInit "之后设置一个断点、它将停止、但如果未设置断点、该进程的运行方式将与单击"RESUME Running"的运行方式类似。

在优化关闭的情况下、芯片不会转到复位矢量指定的函数。 我可以在存储器浏览器中看到复位矢量被设置为0x16D5、反汇编代码在 0x2000016D4处显示 ResetISR()、但这一点不会被第一步击中。 我认为 PC 通过错误(

在上进行优化后, ResetISR() 会被第一步执行,并对复位矢量为0x0DC9时和 ResetISR()在0x20000DC8时进行优化

反汇编窗口始终显示某些0x2000XXXX 地址处的处理器、这就是我认为安装代码使芯片从 SRAM 运行的原因。

我从 TivaWare_C_Series 2.1.4.178导入工程。 我按照 CCS 警告将编译器从 TI v5.2.6更改为 TI v18.1.LTS。 CCS 为 AT 版本   8.0.0.00016。目标硬件是 EK-TM1294XL。 连接是 ICDI。

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

    尊敬的 Peter:

    [引用 user="Peter Borenstein">我从 TivaWare_C_Series 2.1.4.178导入项目。 我按照 CCS 警告将编译器从 TI v5.2.6更改为 TI v18.1.LTS。 CCS 为 AT 版本   8.0.0.00016。目标硬件是 EK-TM1294XL。 连接是 ICDI。[/quot]

    我在这里有完全相同的设置。

    但是、

    [引用 user="Peter Borenstein">断点最初不起作用、我无法单步执行汇编代码。 [/报价]

    我无法重现这些问题。 我导入了工程并使用默认选项(-o2)进行编译

    首次加载代码时、在 C 文件中设置断点没有问题。 我能够在 BL_EMAC.c 的第1783行设置一个(我双击编辑器 marge、在1776、但调试器将其移动到1783、其中有相关代码)。 我在 BL_STARTUP_CCS.s 中设置断点时没有问题、我可以单步执行该 asm 文件。 我可以在第257行设置断点、运行到断点、然后 ASM 进入 ProcessorInit。

    [引用 user="Peter Borenstein"]优化关闭后,代码无法正常运行。 我认为问题是由从 SRAM 运行代码的芯片引起的。

    我无法评论上述两个问题、因为我缺乏器件和示例代码的专业知识。 我会将此主题转发给能够提供更多见解的器件专家。

    谢谢

    Ki

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

    我似乎能够看到同样的问题。 我使用的是 CCS7.3。 我可以单步执行、但如果我放置断点、它不会停止。 我认为我同意您的看法、即它可能具有映射到 SRAM 区域的复位矢量。 加载引导加载程序后、调试器将首先在复位矢量处停止。 如果您查看 PC 地址。 它位于0x2000xxxx 地址、是"运行"地址、而不是"加载"地址。 当您放置断点时、我想知道断点是否放置在闪存中、闪存将位于0x0000xxxx、因此调试器不会点击断点。 我不得不说、我不确定理论是否适用。

    您是否让 BOOT_EMAC_FLASH 在运行模式下工作、可让您通过以太网更新固件映像?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ki、

    我在另一台 PC 上全新安装了 TIvAware v2.1.4.178。 问题发生。 我必须执行一些暂停和禁用/重新启用的奇数组合、以使断点中断。

    我在设置中看到到第1783行的相同断点移动。 Pbreakpointt 位于 SRAM 地址0x20000B3C。 但它在地址0x20000B44处中断(在 HACK 步骤之后)

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

    下面是开始时断点属性的屏幕截图。 在这一点和强制 CCS 尊重断点之间、属性不会改变。

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

    我对最初设置到闪存位置的断点有相同的理论、但我的断点属性屏幕截图证明这不是这样。

    该项目正常工作。 我可以让 LM 闪存编程器使用一些.bin 文件来升级我的器件。

    我希望编辑此引导加载程序、以将新映像保存到某些存储器区域、验证 CRC、然后将新的验证映像复制到当前映像上。 僵尸更新应恢复运行当前映像。 您回复了我关于该主题的其他帖子。

    这个调试问题使得目标变得困难。 单步执行代码有助于我了解正在发生的情况

    您是否了解此项目的任何文档? 我在评论中看到"Doxyon"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Peter:
    BOOT_EMAC_FLASH 工程没有单独的文档。 您可能已经查看过 TivaWare 引导加载程序用户指南。 它是 docs 文件夹下 TivaWare 库中的 SW-TM4C-BOOTLDR-UG-2.1.4.178.pdf。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此问题发生在资源浏览器中可用的项目 boot_serial 中。 BOOT_EMAC_FLASH 必须从 TivaWare 安装目录中导入。 也许使用这个项目可以消除一些变量?

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

    [引用 user="Peter Borenstein"]但负责 CCS 的 TI 员工看不到调试错误、而负责器件的 TI 员工却看到了这种错误、这是很可笑的。[/引用]

    有时会发生这种情况。 其常见原因是工具人员(在本例中为 ME)缺乏器件的基本专业知识(以及 example/sdk)来正确理解问题并重现问题-器件专家和有经验的客户都认为这种知识微不足道。 我将与 Charles 合作、以便他能帮助我重现问题。

    谢谢

    Ki

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

    提供内核复位或重新启动命令后、断点将再次"被忽略"。

    始终尊重置于闪存地址中的断点、包括内核复位后。 我必须提供内核复位以返回到闪存中。 "Restart"按钮可让您在 CCS 启动的位置(_c_int00位于 SRAM 地址)。

    置于闪存中的断点有一个标签"H/W BP"。 此标签是否意味着硬件断点? 被忽略的断点被标记为"S/W BP"。 是否可以在 SRAM 代码中设置 H/W BP 而不是设置 S/W BP?

    内核复位后、我可以看到与 BL_STARTUP_CCS.s 中的源代码相匹配的汇编代码 我必须在令人失望的窗口中看到这一点。 CCS 不显示源代码、并显示"break at address "0xdc8"、no debug information available、or outside of program code"。 因此、我通过单击反汇编窗口中的裕量来设置断点。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试在 SRAM 中设置硬件断点、但 CCS 显示"启用此函数时出错。 地址超出允许的范围"。

    如果在非引导加载程序工程中忽略软件断点、则需要进行测试。 我不知道如何在闪存中显式设置软件断点。 右键单击上的反汇编裕度可让我指定硬件断点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Peter:

    您不能在闪存上设置软件断点。 软件断点要求调试器修改指令(当存储在 SRAM 中时)以使指令可拆分。 您只能对闪存执行硬件断点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我相信这个项目的初始汇编代码将内存复制到 SRAM 中。 这可以覆盖软件断点吗?

    这不能解释为什么 Ki 成功点击了他们...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我是否可以为 Ki-Soo-Lee 辩护?   人们早就注意 到,他有效地为"成千上万的客户用户"提供服务,他的知识非常广泛、深入和关心。

    也就是说、供应商代理、甚至是在这里有共同成立的外部人员、都不能期望他们知道"一切"、尤其是在"寒冷"的时候、以及在其他情况下、"忙于协助!"

    因此,我认为彼得选择"漫画"一词是非常不恰当的,甚至令人遗憾。   "不幸"(但可以理解-正如李先生详细描述的那样)等词语选择将证明更合适、明显优于...    "攻击"一个努力协助的人-绝不能证明" 深思熟虑、善良或明智!"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Peter:
    我认为这是一个很好的理论。 在 l 首次加载程序后、CPU 首先在复位矢量处暂停。 它尚未将代码复制到 SRAM。 我不知道调试器目前是如何放置软件断点的。 最终、当运行代码被复制到 SRAM 时、之前 SRAM 中的内容将被覆盖。

    现在、我尝试让代码首先运行。 在等待魔术包时,它将停留在 UpdateBOOTP 函数的 while (1)循环中。 如果我在 while (1)循环内的某些行上放置 s/w 断点、则它将会中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Peter、

    我一直与查尔斯进行私下讨论,但让我分享我发现的情况。

    我能够再现一些问题。 具体而言:

    [引用 user="Peter Borenstein">首次加载代码时无法设置 C 文件的断点。  禁用和启用断点将使其在代码允许运行后生效。 我还看到、如果芯片被暂停和恢复、断点会发生变化、但结果是间歇性的。  我知道处理器将在 BL_EMAC.c 的第1776行达到 while (1)循环 我在此环路中设置了一个断点。 暂停芯片显示它在这个环路内。 我可以单步执行断点。 在我恢复运行后,芯片可能会开始到达断点。 如果我暂停、禁用并重新启用断点、它将中断。 为此、我取消选中"Breakpoints"窗口中的复选框。  注意要重新创建此问题,需要将开发套件插入交换机。 之前的等待会查找网络连接。 在到达 BL_EMAC.c[/QUERP]的第1776行之前

    我现在肯定能一直重复这一过程。 基本上、一旦调试器暂停或单步执行断点所在的地址、它现在似乎"识别"了该断点。 我在 C 代码中的第1783、1865、1909行设置了一些断点。 我手动停止了、它位于第1783行。 当我再次运行时、它只会在1783停止。 1783年停止后、I SOURCE 跃升至1865。 我跑了。 它将在1783年停止。 当我再次运行时、现在我将在1865年暂停。 最后、当我执行类似的步骤时、1909年的断点被识别。

    BL_STARTUP_CCS.s 的第 257行 不能处理单步执行或单步执行命令。 这些命令中的任何一个看起来都类似于命令"resume running (恢复运行)"。 ProcessorInit 位于 BL_STARTUP_CCS.s 的第190行 我可以在标签"ProcessorInit "之后设置一个断点、它将停止、但该进程的运行方式与未设置断点时单击"RESUME Running"的运行方式相同。

    现在、我没有始终如一地重现该部件。 在显式程序加载后、我始终可以在我在 asm 文件中设置的断点上停止。 我还可以单步执行/越过257行。 但是、如果我重新启动程序、我会遇到忽略 asm 文件中断点的问题。

    这仍在调查中...

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

    [引用 user="Charles Tsaa"]在首次加载程序后,CPU 首先在复位矢量处停止。 它尚未将代码复制到 SRAM。 我不知道调试器目前是如何放置软件断点的。 最终、当运行代码被复制到 SRAM 时、之前 SRAM 中的内容将被覆盖。
    [/报价]

    调试器将知道运行地址、并尝试在运行地址设置断点、即使在代码复制到该地址之前也是如此

    可能是在代码被复制到 SRAM 中时、SRAM 中设置的断点运算代码被覆盖。 但问题是,一旦达到该地址,为什么它最终会"起作用"? 调试器可能会识别到那里没有断点操作码并重新应用它。  

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

    [引用 USER="Ki-Soo Lee"]可能是,当代码被复制到 SRAM 中设置的断点运算代码时,它会被覆盖。

    情况似乎就是这样。 如果您加载程序并运行它、以便将代码复制到 SRAM、然后停止程序并在 C 文件中设置断点、则一切都正常。  

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

    [报价用户="Charles Tsaaaa">现在我尝试先运行代码。 在等待魔术包时,它将停留在 UpdateBOOTP 函数的 while (1)循环中。 如果我在 while (1)循环中的某些行上放置 s/w 断点、则它将会中断。

    我看到你已经确认了我刚才所写的内容。 我最初没这么做。 抱歉!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    与调试器专家讨论后、我对断点行为进行了一些澄清

    -调试器将在运行地址上设置任何断点。 对于 SW 断点、调试器将原始指令保存在其他位置、并在该目标地址编写断点操作码。 如果您在代码被复制到 RAM 之前设置了 SW 断点、则断点操作码将在复制过程中被覆盖。 这就是调试器未在这些有问题的地址处停止的原因(断点操作码被覆盖)。

    -当您使用断点单步执行地址时、断点突然"启用"的原因是调试器处理断点的方式。 调试器仍然认为断点操作码位于该地址、并将复制它存储在其他位置的原始指令以执行它。 指令执行后、它会再次将断点操作码放置在该位置。 因此、断点操作码现已真正出现、下次运行时、它将命中操作码并停止。

    在本示例等情况下、如果希望在程序加载后在 C 文件中设置断点、则可以选择使用 HW 断点(不执行任何操作码替换)或在复制代码后设置断点。 但是、您的器件(我认为所有 Cortex M 器件)似乎存在一些硬件限制、其中不支持闪存存储器范围之外的地址。 因此、在将代码复制到 RAM 后设置断点的后一个选项似乎是最佳选择。

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

    Ki、

    [引用 user="Ki-Soo Lee"]因此,在将代码复制到 RAM 后设置断点的后一个选项似乎是最佳选择。

    这似乎很难实现、因为执行复制本身的代码在 SRAM 中执行。 当 CCS 启动时、处理器(PC)已经位于 SRAM 地址0x20000E1A。 断点从 SRAM 被覆盖。

    第6个运算代码分支到执行复制的函数、因此会覆盖我们的所有断点。

    此复制循环之后的代码位于地址0x20000DA2。 循环一次复制4个字节。 因此、我需要单步执行此循环873次、然后在此循环之后设置一个循环后断点、然后继续运行、最后、当循环后断点中断时、我可以设置其他断点。

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

    [引用用户="Ki-Soo Lee "]

    现在、我没有始终如一地重现该部件。 在显式程序加载后、我始终可以在我在 asm 文件中设置的断点上停止。 我还可以单步执行/越过257行。 但是、如果我重新启动程序、我会遇到忽略 asm 文件中断点的问题。

    这仍在调查中...

    [/报价]

    为什么可以设置到257行仍然是一个谜、但我不希望您能够在208行上中断。 208行恰好位于复制循环之后。 我希望该循环会覆盖断点。

    这似乎不是一个大问题、因为我可以在第195行设置断点、但这可能是一个线索...

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

    [引用 user="Ki-Soo Lee"]因此,在将代码复制到 RAM 后设置断点的后一个选项似乎是最佳选择。

    这起作用了。 我单步执行 copy_loop 874+次、在循环之后中断、之后所有断点都正常工作。