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.

[参考译文] DK-TM4C129X:确定导致 FaultISR 的原因时出现问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/596950/dk-tm4c129x-problem-determining-what-causes-faultisr

器件型号:DK-TM4C129X

大家好。

我使用的是 IAR 和 FreeRTOS。

正如标题所说、我将进入 FaultISR 无限循环。 为了确定此问题的原因,我按照 spma043文档中的说明进行操作,发现了以下几点:

我检查故障状态、它的值为0x00008200、根据寄存器描述、这意味着存在错误、FAULTADDR 寄存器中包含有效的故障地址。

因此、我选中了 FAULTADDR、它具有下一个值:

正如您看到的、该值是0x1FFFFFF4、但通过调查、我发现该值对应于保留存储器、我可以找出导致问题的原因。

因此、我遵循了下一个建议、转到了堆栈指针、看到它的值为0x2001E020、然后我转向反汇编指令、我找到了下一个:

但这并不能告诉我什么。

因此、我仍然感到困惑、如何知道导致问题的原因?

此致、Juan。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Juan:
    您可以尝试增大堆栈大小吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    假设您的 FaultISR 只是一个简单的循环、那么从位置0x2001E020开始的数据就是堆栈上保存的数据。 您需要显示剩余位置:
    0x2001E020包含 r0
    0x2001E024包含 R1
    0x2001E028包含 R2
    0x2001E02C 包含 R3
    0x2001E030包含 R12
    0x2001E034包含 LR
    0x2001E038包含 PC (这是你想要反汇编的值、以查看发生故障时发生的情况。)
    0x2001E03C 包含 xPSR
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的上一篇文章介绍了如何解读 ISR 堆栈上的值。 如果您的线程堆栈链接到起始地址0x20000000、则 Charles 会为您提供快速答案。 您很可能超过了线程堆栈大小、并且当堆栈指针递减到0x20000000以下时、会生成总线故障。 请注意、0x1FFFFFF4的故障地址仅比 RAM 起始值低12个字节。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,查尔斯

    我增加了任务的堆栈大小、错误发生的时间要长得多、这让我意识到、可能我的某个指针出错、并且写入的方向无效。 遗憾的是、现在我不能解决这个问题、但一旦我再次尝试、如果发生任何情况、我会对您进行评论。
    谢谢你。

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

    您的帖子在进一步调试中将非常有用。
    谢谢。

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

    您知道如何增加堆栈大小吗? 我正在使用 IAR 7.4、但我找不到怎么做。
    我在“项目->选项->链接器->配置”选项卡和“编辑”中找到了该选项,但它不起作用。 然后我使用文本编辑器打开.ICF 文件、但文件中没有栈大小、只有堆大小。
    然后、在 startup_ewarm 文件上、我发现:

    //
    //
    //为系统堆栈保留空间。
    //
    //
    静态 uint32_t pui32stack[1024]@".noinit";

    如果我只增加1024就够了? 如果是这样、我必须如何增加该值

    此致、Juan。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您是否已将 pui32Stack 大小更改为1024? 默认值为64、等于256字节。 如果等于4KB 的1024数组大小仍然溢出、则需要尝试使用堆栈分析工具并在 IAR 中调用图表来了解您的程序流。 但是、我自己从未使用过这些工具。

    您可能还会发现以下文章对您有所帮助。
    www.iar.com/.../
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好
    它的大小为1024、这是默认值、
    只是更改该值、它会修改堆栈大小?

    这篇文章非常有用、我只需了解如何更改堆栈大小以及如何使用 IAR 工具对其进行监控
    谢谢

    此致、Juan