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/TM4C1294NCPDT:FaultISR 调试

Guru**** 2601915 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/743834/ccs-tm4c1294ncpdt-faultisr-debugging

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

您好!

我的应用程序卡在 FaultISR 函数中。  我按照 spma043.pdf 中的说明操作、但数据表中未列出故障地址。

NVIC_FAULT_STAT 0x00020000 可配置故障状态[存储器映射]  

NVIC_FAULT_ADDR 0xE000EDF8 总线故障地址[存储器映射]  

我的 MSP 寄存器似乎没有指向有效的异常堆栈帧。

MSP 0x20017E40 MSP 寄存器[内核]  

我怀疑堆栈溢出。

堆栈溢出的原因/修复是什么?

Robert

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

    通过修改两个方面来更改堆栈大小。 首先、右键点击工程并选择"Show Build Settings"。  展开 ARM 连接器选项、在基本选项下增加堆栈大小、如图所示。

    其次、更改链接器命令文件末尾的相同值:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的原始堆栈大小为2048、我将其增加到4096。

    故障状态已更改、但 MSP 寄存器仍指向.bss 段
    MSP0x20017E30MSP 寄存器[内核]
    NVIC_FAULT_STAT0x00000400可配置故障状态[存储器映射]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Robert、

    您可以使用以下方法测试堆栈溢出: e2e.ti.com/.../2731229
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    故障代码是不精确的中止。 这意味着无法捕获地址。 (发生这种情况的原因是写入被缓冲、并且在 CPU 完成写入之前不会检测到故障。) 在中止例程中设置断点。 查看由链接寄存器指向的代码。 弄清楚前两条或三条指令在执行什么操作。 查看寄存器的内容。 您通常可以从该信息推断导致中止的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    链接寄存器看起来已损坏。

    LR 0xFFFFFFE9 通用寄存器14 -链接寄存器[内核]  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、这说明了您出现故障的原因。 CPU 试图从地址0xFFFFFFE8执行、该地址是非执行存储器空间的一部分。 现在、问题是原因。 这通常来自损坏的堆栈、并从堆栈中弹出一个返回地址以外的内容。 另一个选项是不正确的函数指针。 您可以在存储器窗口中查看堆栈。 栈会向下增长(朝向较小的地址)、因此请查看地址减去当前堆栈指针位置(在存储器窗口的上方)、看看您是否可以确定在错误发生之前调用了哪些例程、 并查看更大的地址(在存储器窗口的下方)、以帮助识别调用发生错误的例程。 我的另一个建议是使用断点和步进来查看错误在代码中发生的位置。 一旦您知道错误发生在代码中的哪个位置、错误本身就会变得显而易见。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为我已经解决了堆栈溢出错误、但我仍然遇到 FaultISR 错误。

    我的故障状态指示"不精确数据总线故障"

    NVIC_FAULT_STAT 0x00000400 可配置故障状态[存储器映射]  

    故障地址没有相应的存储器型号地址。

    NVIC_FAULT_ADDR 0xE000EDF8 总线故障地址[存储器映射]  

    我的链接寄存器看起来无效。

    LR 0xFFFFFFF1 通用寄存器14 -链接寄存器[内核]  

    我的堆栈指针有效、最后两个返回地址位于函数"plug_holes"和"mem_ffree"中。

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

    有关 FaultISR 的新数据。

    我的应用程序使用 LWIP 实现与相同静态 IP 但不同端口的 TCP 和 UDP 连接。  TCP 连接用于向硬件发送命令字符串、UDP 连接每10ms 发出一个数据包、其中包含 I/O 通道的输入状态。

    应用程序不使用 RTOS。

    导致 FaultISR 的测试执行以下操作:

    1. 打开 TCP 连接
    2. 发送配置命令和查询。
    3. 启用 UDP 广播。
    4. 关闭 TCP 连接。

    如果我循环此测试、我最终将获得 FaultISR。

    如果我不启用 UDP 广播、应用程序将无误地运行。

    查看 Wireshark、可以看到、FaultISR 之前似乎是在客户端发送 TCP 数据包之后的 UDP 广播。  

      为了使 UDP 和 TCP 共存、我是否需要向应用添加一些内容?

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、这听起来像是软件内存泄漏。 它听起来不像是硬件问题。 您可以尝试搜索: savannah.nongnu.org/.../
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我只是查看我的映射文件、我注意到我的堆栈大小与我的设置不匹配。  我将堆栈大小设置为4096、然后设置为8192、在构建后、长度始终为800。  我修改了 cmd 文件和构建选项。

    运行 origin load origin length init length atts members

    ------ ------ ------ ------ ---- ----

    00000000 00000000 0000e550 0000e550 r-x

    00000000 00000000 00000200 00000200 r--.intvecs

    00000200 00000200 0000d83e 0000d83e r-x .text

    0000da40 0000da40 00000978 00000978 r-.const

    0000e3b8 0000e3b8 00000198 00000198 r-.cinit

    20000000 20000000 00018cbc 00000000 rw-

    20000000 20000000 0000026c 00000000 rw-.vtable

    2000026c 2000026c 00017f2a 00000000 rw-.bss

    20018198 20018198 00000800 00000000 rw-.stack

    20018998 20018998 00000324 00000000 rw-.data

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

    请看一下 lwipopts.h UDP 配置、数据包缓冲器等... 还启用 lwip #debug、输出到虚拟 COM 端口控制台。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否正在处理从其他人继承的项目? 它的作用就像它们具有一些定制功能、可以覆盖您在配置中设置的大小。 检查调用链接器的命令行中是否有多个字符串"--stack_size="。

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

    与 Bob 的堆栈检查类似;

    [报价用户="Robert Applebee's "]如果我不启用 UDP 广播,则应用程序将毫无错误地运行。

    您是否 启用了 DNS 客户端、或者您的应用 程序是否执行任何 IOT 名称查询或启用 防火墙后的代理等?

    一种查找方法,例如通过 lwipopts.h 内的 debug=1启用 TCP/UDP 统计数据输出...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看到阻止我更改堆栈大小的问题、但我不知道导致它的原因是什么。

    我的项目链接设置似乎不同步。

    这是从"Show Build Settings...(显示构建设置...)"中设置的标志的汇总。 面板。
    -mv7M4 --code_state=16 --float_support=FPv4SPD16 --abi=eabi -me -off --advice:pow="1、2、3、4、5.2、5.4、7、9、10、12"-g --gercc --define=part_TM4s=clus_exclus-exclus_exclus_clus-exclus_clus-map=cm=cm=cm=cm_exclus_exclus_exclus-at_clus-at_clus_clus-map_clus-display_clus-map_clus_clus-map_clus_clus-map_clus-display_clus_clus-map_clus-target_clus_clus_clus_clus-inat_clus-map_clus-target=dag-rand_da=cms=cms=cm=cm=dag-rulinat_clus-inat_clus-rand_de=-rack_clus_clus /ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.2.LTS/include /ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.2.LTS/lib

    这是一个构建后的"Console"窗口。
    构建目标:"PoE.OUT"
    调用:ARM 链接器
    "c:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.2.LTS/bin/armcl -mv7M4 --code_state=16 --float_support=FPv4SPD16 --abi=eabi -me -off --advice:pow="1、2、3、4、5.2、5.4、7、9、10、12"-g --define=ccs"--define tat_remote_display-subsections=ctrack_clus-clus-clus_clus-rate-dag-ram_clus-ram_zh-out_subs=cep-remote_remote_display-clus-rate-s=ctrag-clus-clus-clus-clus-clus-clus-rate-dag-rate-dag-rate-dag-rate-dag_b-ram_en_en_en_en_s=ctrab-core-se-se-s=ctrab-clus-clus-clus-clus-clus-clus_clus-clus-rate-se-s=cep-rat /ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.2.LTS/include /ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.2.LTS/lib xml_link_info="poe_linkInfo.xml"--rom_model -o "poe.out"./adcUtil.obj "./commands.obj "./platform.obj "./poe.obj "./pwmUtil.obj ""./spi.obj ""./startup_ccs.obj ""/common/commands.obj "./common/dispatch.obj /drivers/pinout.obj /utils/lwiplib.obj /utils/ustdlib.obj /ti/TivaWare_C_Series-2.1.4.178/driverlib/ccs/Debug/driverlib.lib ".ipc.obj "/common/protocol.obj /utils/uartstdio.obj。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将 TFVC 用于此项目。  这是否会导致链路设置问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不认为 TFVC 本身就是导致问题的原因、但是如果您从使用不同方式初始化堆栈和堆的其他人那里开始了一个项目、这可能是您无法以标准方式进行更改的原因。 您是否愿意将项目导出到.zip 文件中供我查看? 您可以提出朋友请求、然后您可以直接通过电子邮件将其发送给我、而不是在有此帮助的情况下发布项目。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../poe_5F00_v036.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在构建(编译和链接)工程时、是否使用 Code Composer 来运行编译(Project -> Build Project 或"锤 子"图标)、或者是否运行外部 makefile? 我收到的.zip 文件在调试目录中没有"test.map"文件。 相反、它有一个"enet_lwip_ccs.map"文件。 当我使用 Code Composer 编译工程时、堆栈大小为1024、堆大小为2048、正如预期的那样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我确实使用 CCS 来构建项目。  事件尽管我将映射文件名设置为"test.map"、但它始终将其命名为"enet_lwip_ccs.map"、并且我将堆栈大小设置为800的大小不会与映射文件报告的大小相同。

    段分配映射

    运行 origin load origin length init length atts members

    ------  ------ ------ ------ ---- ----

    00000000  00000000  0000e550 0000e550  r-x

     00000000  00000000  00000200 00000200  r--.intvecs

     00000200  00000200  0000d83a 0000d83a  r-x .text

     0000da3c  0000da3c  00000978 00000978  r-.const

     0000e3b8  0000e3b8  00000198 00000198  r-.cinit

    20000000  20000000  00018cbc 00000000  rw-

     20000000  20000000  0000026c 00000000  rw-.vtable

     2000026c  2000026c  00017f2a 00000000  rw-.bss

     20018198  20018198  00000800 00000000  rw-.stack

     20018998  20018998  00000324 00000000  rw-.data

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

    让我们尝试一下。 我将项目重命名为 PoE2并将其导出到随附的.zip 文件中。 导入并编译此新工程。 看看它是否提供了正确的堆栈和堆大小。

    /cfs-file/__key/communityserver-discussions-components-files/908/PoE2.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    导入的工程会编译正确的栈大小以及正确的映射文件名。 我想我的 TFVC 项目有问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何设置/显示虚拟 COM 端口控制台?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    然而、您没有提到在调整堆栈大小后启用 RDP 会使 MCU 发生故障? 您是否只是假设堆栈大小是导致 RDP 故障问题的原因?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    论坛中的许多人使用 PuTTY 终端仿真器。 或者、如果 CCS 调试虚拟 COM 的内置终端、ICDI 会将 MCU UART0移植到 CCS 中。 您可以在 Tivaware windows drivers 文件夹下找到 CDC 虚拟串行驱动程序 INS 文件。