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.

[参考译文] TM4C1294NCPDT:FaultISR 未通过复位修复?

Guru**** 2480155 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/699102/tm4c1294ncpdt-faultisr-not-fixed-by-reset

器件型号:TM4C1294NCPDT

奇怪的是、我测试了 FaultISR 的工作方式、尝试在启用前将端口 C 上的引脚设置为高电平。  代码:

GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_4、GPIO_PIN_4);

正如预期的那样、这使得程序进入缺省 FaultISR、该程序中只有一个 while (1)循环无限循环。  

我发现有趣的是、在故障发生后按 TM4C1294板上的复位按钮不会复位软件。  有人知道原因吗?

使其再次运行的唯一方法是通过 Code Composer Studio 运行软件。

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

    您如何确认软件未复位? 如果您每次都进入故障 ISR、 我看不到如何确认复位按钮不会复位软件、因为一旦您按下电路板上的复位按钮、您将断开与 CCS 调试的通信、并且在重新下载时重新连接调试器之前、不应能够访问任何调试功能 软件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ralph -感谢您的快速回复。 在我的软件的主循环中、我每隔一秒左右切换 PN0 LED。 当在故障 ISR 之后按 RESET 时、我无法看到 LED 闪烁。 在软件的任何其他状态下、按下复位按钮可重新启动软件、但一切正常、LED 会按预期无限期闪烁。

    更深入地解释:我将 LWIP 与 Tiva 板上的以太网控制器结合使用、通过我编写的在 PC 上运行的测试应用程序与电路板通信。 我在测试应用中添加了一项功能、允许用户(ME)按下测试应用上的按钮、向电路板发送消息以测试故障处理。 当电路板收到此消息时、它只运行我在上一条消息中发布的单行代码。 此时、代码进入 FaultISR。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Terence:

    感谢您添加的所有这些详细信息、我现在对问题有了更清晰的了解!

    如果您不触发 FaultISR、那么每次将 RESET 置为有效时代码是否正确运行?

    我提出的原因是、当使用调试器代码时、执行速度会变慢、因此很少执行、但偶尔一次、程序将在调试模式下执行、但不会在自由运行模式下执行。

    如果代码在按下"Reset"后不调用 FaultISR、但在 FaultISR 中断言"Reset (复位)"时停止运行、那么我认为我们需要做什么来了解这种情况下发生的情况。

    可以在不下载代码的情况下连接调试器、以便将输出文件作为符号文件加载、以查看代码在何处卡住、这应该是下一步。

    此处介绍了有关如何执行此操作的详细信息(我认为最新 CCS 中存在所述的所有步骤): e2e.ti.com/.../1465314

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

    [引用用户="Ralph Jacobi"]

    如果您不触发 FaultISR、那么每次将 RESET 置为有效时代码是否正确运行?
     [/报价]

    正确

    [引用用户="Ralph Jacobi"]

    可以在不下载代码的情况下连接调试器、以便将输出文件作为符号文件加载、以查看代码在何处卡住、这应该是下一步。

    此处介绍了有关如何执行此操作的详细信息(我认为最新 CCS 中存在所述的所有步骤): e2e.ti.com/.../1465314

    [/报价]

    好的。  我已按照您提供的链接中的说明进行操作。  我创建了一个新的目标配置。  当我启动它时、除了显示"Console"窗口外、什么都不会发生:

    Cortex_M4_0:GEL 输出:
    内存映射初始化完成

    指令的下一步状态:"完成后、右键单击内核并选择连接目标"。  

    我不确定这意味着什么。  是否有内核转储文件???  我已经浏览过文件系统、但没有找到。

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

    尊敬的 Terence:

    当您启动目标配置时、您应该会看到如下所示的调试窗口:

    如果像我一样使用 LaunchPad、那么您可以右键单击 Stellaris ICDI、这将提供"Connect Target"选项。

    您可以在此处使用保存存储器功能来保存闪存和 RAM 内容(您需要参考.cmd 文件以获取起始地址和字长)。

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

    谢谢、Ralph。  这是有道理的、启动后我可以单击"Connect Target"。  不过、我仍然需要加载符号。  我知道我可以转到"Run"下拉菜单并选择"Load Symbols"、然后为正在运行的编译选择.out 文件、但是、我不确定要为代码偏移和数据偏移值输入什么、如下图所示。  有什么想法可以在哪里找到这些信息?

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

    在进一步了解这一点的同时、我还了解了通过目标配置访问器件时我不知道的一些内容、因此我们实际上有了一种更有用的初始调试方法...

    Registers 视图将显示器件的所有当前寄存器设置、这很有用、因为现在我们可以按照故障检测文档 www.ti.com/.../spma043.pdf 中的内容实际工作

    您能否通读该文档并查看是否可以识别是否发生了任何故障? 我甚至会尝试查看您是否可以在 CCS 调试中观察到您的强制故障、查看寄存器、然后将这些寄存器与发生复位问题时的情况进行比较、如果您遇到相同的故障、这意味着代码会在没有的情况下触发它 正在发送您的消息! 此外、当您浏览可能的故障源时、请记住、任何提及使用反汇编器的步骤都将不可用、因为我们在出错时无法使用调试器、因此无法访问该功能。

    我不想完全放弃我的其他想法、因此让我谈谈之前的想法、除非 Fault 应用手册不够、否则我们现在可以使用该想法。

    首先、当重新阅读之前的 E2E 帖子中发布的所有内容时、 现在、我不确定 Amit 关于'load symbols'的评论是否恰当地描述了我们想要做的事情-我们真正要寻找的是比任何东西都更多的内存转储、'load'是下载到的上下文中通常使用的术语 器件、而不是来自。

    让我更详细地阐述我的目标:

    使用 Save Memory 功能、您可以将代码内容下载为 TI 数据。 这将是没有任何调试器信息的原始数据、因此只需要地址和数据、但这仍然有用。

    我们要对这些数据执行的操作是、尝试找出当 FaultISR 条件出现时、在点击"Reset"按钮后执行的代码是否最终将程序计数器放置在"no man's land"或其他一些关键缺陷中。

    为此、下一步是在调试模式下运行代码并根据需要点击 FaultISR。 然后、我们也会将其转储。

    此时、我们可以对这两个文件进行比较、看看复位问题发生时发生了什么变化、 虽然其中一些是手动工作、例如跟踪特定地址等。方法是使用 CCS 调试视图了解其中存在错误行为的第一个原始数据文件。 这不是一种很好的方法、但当调试器无法跟踪问题时、我们突然被过时的方法所遗留。

    不过、故障调试方法比我想象的要简单得多、请先尝试该方法、然后再尝试保存完整的存储器转储作为最后的手段。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ralph -感谢您提供的上述信息。  当通常的步进方法不可用时、它无疑进一步加深了我对调试问题的了解。  在进一步检查我的代码时、我发现我在 ResetISR 中执行了一些愚蠢的操作、这导致了它自己的错误(不同于我故意触发的原始错误)。  很抱歉,我给了我们一些野鹅的追逐。  我的软件工程技能通常比这更好!

    不过、我从本次练习中确实获得了大量有关如何在这种条件下进行调试的知识、并且很可能在将来使用这些方法。

    非常感谢、

    Terence

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

    很高兴你发现了这个问题! 我也学到了很多东西、因此对双方都有利、哈哈。 实际上、我想再分享一种我昨天晚些时候学到的调试技术、该技术涉及在您需要在点击"Reset"按钮后查看寄存器更改时如何处理问题。

    您可以在复位前断开与内核的连接、这样您就不会触发调试器、然后在复位后重新连接、以查看寄存器更改。 换言之:连接到目标、加载固件、运行、点击 FAULT、然后您将与目标断开连接、按下按钮进行复位、最后重新连接到目标。 现在、您将能够看到哪些寄存器设置发生了更改。 希望这也是一种有用的技术!

    我将把你之前的帖子标记为线程分辨率的帖子。