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.

[参考译文] F29H850TU:目标 CPU 可能卡在持续故障状态

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1480790/f29h850tu-target-cpu-may-be-stuck-in-a-persistent-fault-state

部件号:F29H850TU

工具与软件:

您好!
使用 CCS 20.0.2、我用示例项目:led_ex1_blinky
它在实际器件上运行、因为 JTAG 我使用了 XDS110。 我可以编译、刷写和单步执行代码、而不会出现任何问题。 我使用 TI Clang v1.0.0.LTS 作为编译器。
我想稍微修改项目以获得 CPU 节拍、因此只包含了 C 标准函数 clock ()来获取节拍数、并使用 C 标准宏 CLOCKS_PER_SEC 来获取秒数。
调用 clock ()时、MCU 会 在读取 cycle_counter 寄存器时在 clock_t clock (void)函数中的 TI C 运行时库中崩溃。
我可以看到发生了一些中断、但遗憾的是、我缺少 interrupt.c 等文件、因此我无法直接看到发生了什么情况。
JTAG 会丢失控制、我必须对 MCU 进行下电上电才能使 JTAG 重新工作。
我个人猜测 SSU 是默认配置、它有一些限制、代码可以读取内存、并将 MCU 拉至持续故障状态。
问题1) 所以是否有另一个示例配置 SSU、以便读取示例 CYCLE_COUNTER? 或者、您有其他关于如何调试 MCU 进入持久性故障状态的见解吗
问题2) 我无法从 F29技术参考手册中验证此地址0x200 0000是否正确。 我找不到其中的地址、也找不到用于查找周期计数器说明的存储器映射。 您能指出我更正文档吗?
问题3) 我更熟悉 ARM Cortex-M 和-R 系列。 在该 指南中、我会实现故障处理程序中断并放置断点、因此我能够查看 MCU 的确切状态。 F29是否有类似的东西? TI 是否有一些培训材料可供我学习 F29的基本概念?
此致、
TONI
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    更新:我发现 interrupt.c 实际上是 SDK 的一部分、并在那里找到源代码。 但这没有什么帮助、因为我可以从内核寄存器中看到程序计数器正在执行永久循环、但我看不到链接的 C 代码、因此它来自我的代码外部(我没有找到为其他代码启用调试信息的设置)。 因此、我猜这是一些具有无限循环的中断处理程序、我缺少将反汇编代码链接到代码的调试信息。 此外、JTAG 随后也会停止工作、因此我无法调试会发生什么。

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

    尊敬的 Toni:

    Unknown 说:
    我可以看到发生了一些中断、但遗憾的是我缺少 interrupt.c 等文件、因此我无法直接看到发生了什么。

    interrupt.c 随附 C29_SDK。 您只需浏览至 interrupt.c 并在 CCS 中打开文件以查看其当前指针所在的位置。 请这么做

    Unknown 说:
    根据 F29技术参考手册、我无法验证此地址0x200 0000是否正确。 我找不到其中的地址、也找不到用于查找周期计数器说明的存储器映射。 您能告诉我正确的文档吗?

    您在这里指的是什么周期计数器?  您能更具体一点吗?

    我发现 interrupt.c 实际上是 SDK 的一部分、并在其中找到了源代码。 但这没有什么帮助、因为我可以从内核寄存器中看到程序计数器正在执行永久循环、但我看不到链接的 C 代码、因此它来自我的代码外部(我没有找到为其他代码启用调试信息的设置)。 因此我猜这是某个具有无限循环的中断处理程序、我缺少将反汇编代码链接到代码的调试信息[/QUOT]

    可以轻松地从 CCS 窗口手动浏览到.c 文件、并在 CCS 中将其打开以进行调试。

    此外、JTAG 在这之后裸机、因此我无法调试到底发生了什么。
    [/quote]

    不应该这样、因为 NMI 处理程序包含循环、之后应该一直保留在那里。 不确定是什么让您认为 JTAG 已失效?

    谢谢

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

    "interrupt.c 随附 C29_SDK。 您只需浏览至 interrupt.c 并在 CCS 中打开文件以查看其当前指针所在的位置。 请执行此操作"

    "我建议您加载 interrupt.c 并检查 CPU 是否进入 NMI 处理程序。 如果它位于 NMI 处理程序中、则检查导致 CPU 从错误聚合器和 ESM 寄存器进入 NMI 状态的错误。

    NMI 处理程序中有一个无限循环、它在这里清除错误并将其存储到结构中、请检查结构并从那里调试错误源。"

    "从 CCS 窗口手动浏览到.c 文件并在 CCS 中将其打开以进行调试非常容易。"

    我能够找到该文件并在 CCS 窗口中将其打开、但似乎该文件不是调试会话的一部分、并且调试器在步进时不能跟随源代码行、调试器只能在反汇编时跟随它。 此外、我还可以对我的代码和 C 标准库代码设置断点。 但我无法将制动点设置为 SDK 代码。 所有 SDK 文件似乎都是如此。 是的、我已经打开了与我的项目配置所使用的相同 SDK。

    通常、IDE 具有用户项目之外的代码设置、该代码不属于调试编译。 因此、当暂停到该外部项目代码时、您只能看到汇编而不能看到 C 代码步进。 我想是关于这个设置。

    "是什么告诉您 JTAG 失去了控制权?"

    "这不应该因为 NMI 处理程序包含循环,它应该永远留在那里。 不确定是什么让您认为 JTAG 已失效?"

    CCS 不允许我对调试会话执行任何操作(暂停、浏览寄存器、单步执行等)。 CCS 说"目标 CPU 可能卡在持久性故障状态"。 我不知道它的去向、因为反汇编未与 SDK 源代码连接。 手动读取 SDK 代码时、NMI 中断恰好具有您注释的无限循环和结构。 但是、反汇编未连接到 SDK 源代码、所以很难读取结构体、因为代码明显已优化、并且存储器大小也已优化。 我将尝试禁用优化、然后查看我是否可以读取结构体。

    "默认情况下、SSU 处于模式1、除非您更改。 除非启用 SSU 模式、否则我认为 SSU 不是问题"

    我会检查这一点、并报告它在示例项目闪烁中的情况。 可能是在 clock ()函数中使用了错误的地址实现了 TI C 标准库。

    "您指的是什么循环计数器?  "你怎么可以这样说?"

    当我从代码中调用 clock ()时、它会单步执行该函数、然后问题就会出现、仅在某些步骤之后 CCS 就无法通过 JTAG 控制 MCU、并显示消息"Target CPU 可能一直处于持续故障状态"。 这个问题发生在我的代码之外,正好在 C 标准库函数 clock ()的内部。 TI 通过读取地址"0x200 0000"实现了 clock ()函数、该地址是在同一文件"clock.c"中本地定义的宏"cycle_counter"。 我无法从技术参考手册中找到地址 "0x200 0000"中的内容来验证 TI 是否正确实现了 C 标准库函数 clock ()。

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

    我在处理此问题时发现 CCS 中存在其他错误:

    我注意到、自动更新的 launch.json 具有 SDK 的编译目录、并且编译器源文件夹设置为 E:\cvs\jenkins\... 这似乎就是 TI 持续集成 Jenkins 构建职位目录的内容。 我手动修改这些箭头以指向项目文件夹。

    我还注意到、SDK driverlib.lib 构建的源代码似乎与 SDK 文件夹中包含的源代码不同。 例如、当我将断点设置为调用  Interrupt_initModule ()时;当单步执行到它时、CCS 调试器指向 interrupt.c、但在任何函数之外 的注释中间、因此 driverlib.lib 调试信息中的行号与 SDK 中包含的 interrupt.c 不匹配。

    更多 CCS 会自动包含 SDK 和编译器路径到 launch.json 的源代码路径、但从这些路径中搜索源代码似乎不是递归的、因此无法自动找到 clock.c 或 interrupt.c 我手动添加了正确的路径、然后 CCS 可以自动查找文件。

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

    我可以确认、使用 clock()获得一些中断的最初问题不是关于 SSU 的问题、因为在读取 SSU 工作模式时、寄存器值为0x30、这意味着 SSUMODE1是对所有内容的完全调试访问。

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

    TONI:

    建议现在只关注 NMI 触发器的源。

    NMI ISR 调用 Interrupt_clearEsmEaFlags ()、它将错误聚合器寄存器标志存储在  gNmiStatus 中、并清除标志、以便 NMIWD 不会超时并触发器件复位。

    查看观察窗口中的结构 gNmiStatus 并检查已设置哪些标志。 请参阅手册中的错误聚合器寄存器、以确定哪些错误是 NMI 的源。

    NMI 处理程序中有一个无限循环、它在该循环中清除错误并将其存储到结构中、请检查结构并从那里调试错误的来源。

    谢谢

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

    Bhatt

    我们有相同的目标、我想重点关注 NMI 中断原因的调试。 但是、为了实现该目标、您需要帮助修复调试问题:

    我的 interrupt.c 源代码显然与用于构建 driverlib.lib 的源代码版本不同、因此我不能在 JTAG 裸片之前单步执行。 我需要读取未链接至源代码的反汇编代码、并且从寄存器/RAM 地址中猜测代码的功能。

    请同时验证您认为 clock.c 中的 clock()是否正确实现。 很明显、TI 代码使用的计数器没有记录在 TRM 中、硬编码的内存地址可能不正确。

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

    TONI:

    您能与我分享这个项目吗? 如果您与 TI FAE 联系、可以将其转交给他并联系我。

    我在任何示例项目中都看不到 clock.c、因此我需要查看此文件/函数的作用

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

    它就是标准  led_ex1_blinky。  就像我在上面写的那样、 添加了对 clock()的标准库调用。 它来自 time.h

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

    标准示例 led_ex1_blinky 不使用 clock.c 甚至 time.h、可能我在这里缺失了什么。

    请联系您的 FAE、以便我们可以就此展开调试会话、但不确定我们是否可以在聊天框中解决。

    此外、您还可以发布具有文件名的函数调用的快照、以便我可以引用回

    谢谢

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

    Prarthan、您好!
    这些工具可能会以某种方式包括 clock.h?
    https://dev.ti.com/tirex/explore/node?node=A__AESNM2ECE5uI-fZbdQOeCg__f29h85x-sdk__aZ9BqlN__LATEST
    您可以检查一下吗?

    您是否能够构建 TI led_ex1_blinky 示例工程并重现 CCS 20.0.2 和 TI C29x Clang v1.0.LTS的问题?

    提前感谢、

    Anthony

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

    您好!

    我将使用 CCS 20.0.2和 TI Clang v1.0.LTS。 所以我用了 led_ex1_blinky ,我添加了一个线路调用 clock()函数(也包括标题 time.h )。 然后编译并调试它。 当步进调用 clock()时、系统将崩溃。 我认为这是因为来自 TI C 标准库的 clock ()实现不正确。 此外、当尝试调试时、我会收到"目标 CPU 可能卡在持续故障状态"、我无法再使用 JTAG 进行调试。

    为避免不必要的延迟、请阅读上面已包含此信息的消息。

    谢谢!

    TONI

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

    尊敬的 Toni:

    是的、在向示例中添加 clock()函数调用后、我能够重现此问题。 不知何故、我错过了这条声明、并认为您正在运行默认示例。

    我进入了 NMI 默认处理程序、初始化时 NMI ISR 分配给 CPU1。

    我还查看了  gNmiStatus 结构并发现 NMI 由位置0x200000处的访问 ACK 错误触发、该位置由 clock ()进行读取操作。 我同意您的看法、即该函数的实现是不正确的、即保留位置、编译器函数不应使用这些位置。

    我正在和编译器团队核实以了解更多信息、一旦我收到他们的反馈、我将马上回来。

    谢谢。

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

    尊敬的 Toni:

    我从编译器团队那里得到回复、他们确认这是实现中的错误、将在即将推出的 CCS 版本中修复。

    尽管您可以按照以下解决方法进行操作以取得进展:  

    使用 F29 SDK 中的硬件计时器、例如:
    * CPU 时钟粗略估算:IPC_getCounter (https://software-dl.ti.com/C2000/docs/f29h85x-sdk/latest/docs/html/group__ipc__api.html#ga520abfc0bfbed65d30d6ef890bf63634)或从地址0x301B0000中读取一个64位整数值
    *用于性能分析的 CPU 计时器: https://software-dl.ti.com/C2000/docs/f29h85x-sdk/latest/docs/html/group__cputimer__api.html

    谢谢

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

    您好!

    感谢您的更新! 我之前已经使用 SYSCFG 工具定制了计时器、并使用了它。 感谢您提供额外提示、即 IPC 模块也有在 PLLSYSCLK 上运行的通用计时器。 这对我来说已经足够了。

    您似乎可以检查和调试 NMI 默认处理程序并读取  gNmiStatus。 我也需要此功能。 目前、我认为我的 SDK 库是根据 SDK 中包含的不同源代码构建的。 能否分享您已启用的 CCS 调试设置?

    我认为能够单步执行和调试任何与 SDK 相关的代码非常重要、因为现在我只能通过汇编语言完成这些操作。 请注意、我可以正确地调试和分步使用 C 语言的编译器端代码。

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

    TONI:

    我没有做任何特别的事情。 刚刚将  gNmiStatus 添加到监视窗口、当执行转到 NMI 处理程序时、您可以看到在监视窗口中设置的值。

    谢谢。

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

    好的。 请共享您的 CCS、SDK 和编译器版本。 很明显、我们有一些不同的东西、因为我不能将断点/调试/等设置到 SDK 代码文件中(但我可以将断点/调试/等设置为拥有代码和编译器代码)。  

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

     是否有任何更新?

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

    TONI:

    很抱歉、之前没有获得此主题的更新。

    我还看到诸如 interrupt.c 的某些文件存在同样的问题、其他文件不会在调试视图中自动填充、并且无法将代码与调试指针对齐

    尽管当它转到 for 循环中的 NMI 处理程序、并且我 手动打开 interrupt.c 并在观察窗口中添加变量时、我可以看到正确填充的值、即使 debug wrt 代码不匹配也是如此。

    在内部将其分配给软件团队以在 driverlib/CCS 问题上为您提供帮助

    谢谢