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.
工具/软件: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
此问题发生在资源浏览器中可用的项目 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"。 因此、我通过单击反汇编窗口中的裕量来设置断点。
我是否可以为 Ki-Soo-Lee 辩护? 人们早就注意 到,他有效地为"成千上万的客户用户"提供服务,他的知识非常广泛、深入和关心。
也就是说、供应商代理、甚至是在这里有共同成立的外部人员、都不能期望他们知道"一切"、尤其是在"寒冷"的时候、以及在其他情况下、"忙于协助!"
因此,我认为彼得选择"漫画"一词是非常不恰当的,甚至令人遗憾。 "不幸"(但可以理解-正如李先生详细描述的那样)等词语选择将证明更合适、明显优于... "攻击"一个努力协助的人-绝不能证明" 深思熟虑、善良或明智!"
您好、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 断点、则它将会中断。
我看到你已经确认了我刚才所写的内容。 我最初没这么做。 抱歉!
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+次、在循环之后中断、之后所有断点都正常工作。