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.

[参考译文] TM4C129XNCZAD:无效的执行序列

Guru**** 2322270 points
Other Parts Discussed in Thread: SEGGER, TM4C129XNCZAD, EK-TM4C1294XL, EK-TM4C129EXL, MSP-EXP432E401Y, MSP432E401Y
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/955745/tm4c129xnczad-invalid-execution-sequence

器件型号:TM4C129XNCZAD
主题中讨论的其他器件:SEGGERDK-TM4C129XEK-TM4C1294XLEK-TM4C129EXLMSP-EXP432E401YMSP432E401Y

您好!

我们一直在努力解决一个非常奇怪的硬故障、这种故障要么在相同条件下的一段时间后发生、要么从未发生(取决于编译输出)。

我们投资了一款用于 Cortex M 的 J-Trace Pro 并执行了指令跟踪、我们观察到了最奇怪的行为。 在某个指针处、在中断处理程序中、PC 不仅在一条简单的寄存器加载指令后递增、而且会跳转到代码的完全不同部分。

您是否经历过这样的行为? 勘误表中是否有我可能遗漏的内容?

请在下面找到进入硬故障处理程序时指令跟踪的屏幕截图:

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

    您好、Matthieu、

    您是否考虑了堆栈溢出的可能性? 您是否尝试过增大堆栈大小?

    根据您是否执行 malloc、您可能还会发生内存泄漏。

    按照我看到调度程序.c 文件的方式、这是 TI-RTOS 文件还是不同的 RTOS 文件?

    不确定本文档是否也能为您提供帮助: https://www.ti.com/lit/pdf/spma043

    第4.4节使用指针介绍了另一种可能的 PC 不良情况。

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

    您好!

    我们已经在寻找堆栈溢出、并尝试在没有成功的情况下增加堆栈。 我们以前在堆栈顶部有一个堆栈保护(魔术值)、从未改变过。 我们现在还通过 MPU 实现了存储器保护、并且没有获得任何相关的中断。

    我们正在开发医疗级器件、因此禁止 malloc。

    我们实施了自己的调度程序。

    您可能没有在迹线上看到任何内容、但触发故障的指令位于地址0x4D84: LDR       R0、[R0、#12]。 从前面的表达式中、我可以看到 R0等于1、并且从寄存器故障相关标志中可以看到尝试了无效地址访问(到0xD)、从而触发了故障。

    无论如何、硬故障严格条件并不重要、重要的是要了解间接导致此硬故障的原因以及从指令跟踪中得到的结果、从地址0x7932到0x4D76的转换毫无意义、并且不能与我们的软件或您的编译器相关、 它必须与硬件相关。

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

    您好、Matthieu、

    我同意它与硬件相关、感谢您回答有关堆栈溢出的问题-这在您的设置中是完全排除的。 最好了解一下 malloc &以及您自己的调度程序。

    我一直在浏览您提供的屏幕截图和我们的故障诊断应用手册、尝试更好地处理此问题。 现在、我一定要了解 FAULTSTAT 寄存器的值是多少、以便我可以更好地参考我们的配套资料。 现在、我看不到该信息、尽管听起来好像您已经了解过该信息吗? 如果您可以分享有关这方面的详细信息、这将对我有所帮助。

    其他几件事...

    它跳到0x4D76/0x4D84区域中的函数看起来像是"MasterFailureTask::DetectNewMasterFailures ()",这是您实现的吗? 我不熟悉它、所以我想是这样。 它是用于 FaultISR 还是用于 TM4C 的任何其他 ISR 处理程序?

    您还提到了 LDR       R0、[R0、#12]指令会触发它、如果是、那么它仍然无法解释跳转发生的原因、因为故障似乎仅与原因不明的跳转相关(我们可能在该页面上)。 您是否看到 PC 加载新值的任何指示? 或者、如果 故障 ISR 中添加了"DetectNewMasterFailures API"、则故障 ISR 是否在跳转到"DetectNewMasterFailures API"之前执行此操作?

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

    您好!

    FAULTSTAT 不会提供更多信息、因为它与执行序列(无效的存储器访问)一致。 您可以浏览附加图片中的不同位。

    是的 ,MasterFailureTask:DetectNewMasterFailures ()是我们实现的,但它从未在任何中断上下文中使用。 与此类似、我的同事观察到了相同的行为、但执行从 USBIRQHandler 跳转到主函数开头仅实例化一次的变量的构造函数、而不是 SysTickIRQHandler。

    我没有任何指示 PC 加载了另一个值、但常量似乎是无效执行跳转总是在中断上下文中发生。

    我们还监视了 RAM 中的中断矢量、但它没有从最后一个中断寄存器更改为错误发生。

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

    [引用 user="Matthieu TardiVON">我们一直在努力解决一个非常奇怪的硬故障、该故障要么在一段时间后在相同的条件下发生、要么从未发生(取决于编译输出)。当错误发生时、程序是否执行任何闪存擦除或程序操作?

    提出要求的原因是、如果启用了闪存预取缓冲器、当代码从不同闪存组运行时擦除/编程一个闪存组会导致错误执行。 请参阅 TM4C1294NCPDT:闪存写入或擦除问题

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

    您好、Matthieu、

    [引用 USER="Matthieu TardiVON] FAULTSTAT 不会提供更多信息、因为它与执行序列(无效存储器访问)一致。 您可以浏览随附图片中的不同位。

    抱歉、我不明白您上次对地址访问是0x0D 处的存储器故障的评论。 我没有看到这块东西、堆栈迹线使它看起来像一个一般硬故障、这一点不太清楚。 了解这是一个存储器访问故障是我试图获取的重要信息、非常感谢。

    故障状态实际上告诉我们很多-至少从芯片/硬件方面。 可以触发特定故障的东西很少、比如这个。

    在这种情况下、如果存储器访问冲突的0x82故障几乎总是与 MPU 相关。 当 MCU 执行违反受保护存储器区域的代码时、通常会发生此故障。

    您之前提到过:

    [引用 user="Matthieu Tardivon"]我们现在还通过 MPU 实现了存储器保护、没有获得任何相关中断。

    您能详细说明一下这是如何设置的吗?

    到目前为止、您已经诊断出触发故障的原因是以下指令、MMADR 值0x0D 证实了这一点。 因此、尝试在0x0D 处读取存储器是 导致存储器访问冲突的原因。  

    LDR       R0、[R0、#12]。

    那么、现在的问题是为什么不允许访问该存储器? 该区域是否受 MPU 保护? 是否设置为仅执行?

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

    切斯特、您好!

    根据未发生的堆栈跟踪、它们在发生存储器访问故障时在 SysTick IRQ 处理程序中进行数学比较。

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

    [引用 USER="Ralph Jacobi]]从未发生的堆栈跟踪中、他们正在 SysTick IRQ 处理程序中进行数学比较、此时发生存储器访问故障。我同意当程序位于 IRQ 处理程序中时会发生崩溃。 但是、在 TM4C1294NCPDT:TM4C1294NCPDT 闪存写入问题 是、当主线程正在编程闪存时启用了中断、那么中断处理程序中可能会发生崩溃。

    因此、认为仍然值得尝试消除导致崩溃的任何闪存擦除/操作。

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

    [引用 USER="Ralph Jacobi]]到目前为止、您已经诊断出触发故障的原因是以下指令、MMADR 值0x0D 确认了这一点。 因此、尝试在0x0D 处读取存储器是 导致存储器访问冲突的原因。  

    LDR       R0、[R0、#12].[/quot]

    查看第一个帖子中的指令跟踪,跟踪在调度程序中显示以下内容::SysTickIRQHandler()函数:

    00007932 LDR R0、[SP]

    跟踪中的下一条指令是 MasterFailureTask 中的以下指令:DetectNewMasterFailures ()函数:

    00004D76 B 0x00004D82.

    正是这种指令跟踪中的意外跳转才是问题所在;因为程序计数器从不同函数中间的 IRQ 处理程序中变化。

     地址0x4D84上的 LDR R0、[R0、#12]指令产生地址故障这一事实只是前一个程序计数器跳转的副作用。

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

    切斯特、您好!

    为了回答您的第一个问题、我们不会在软件中的任何位置执行任何闪存擦除或写入、至少据我所知、因此我将对此进行仔细检查。

    您完全理解了问题、意外跳转就是问题、地址故障是副作用。 您是否知道这种情况发生的原因? 我从未在 Cortex M4中看到过这种行为。

    要更详细地描述拉尔夫的故障:
    LDR R0、[SP]-> R0加载值0x1
    LDR R0、[R0、#12]->尝试将地址 R0 + 12 = 0xD 处的值加载到 R0中、这是一个未对齐的存储器访问、但正如切斯特所述、这是意外跳转的副作用。

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

    Matthieu 和 Chester 您好、

    对不起,这对我来说应该更明显。

    您能否在0x7932放置断点、然后转储 VTABLE 寄存器(0xD08)的内容以及该表指向的1024字节? 在该区域中搜索值0x4D77。 如果找到这样的值、则表明 存在一些意外的嵌套中断、这会导致问题。

    另外,在 执行 LDR R0、[SP]-> R0命令时 SP 的值是多少?

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

    您好 Ralph、

    我们已经在矢量表中检查了此值、并且还检查了矢量表地址是否不变。 SCB->VTOR = 0x20000000、不幸的是、表中没有找到这样的值。

    根据我的分析、SP 为0x20001B38、在有效范围内。

    @Chester I double check for flash operation and did not see、I also materiary the Compiled" to the flash memory after the fault and h两者 match.

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

    您好、Matthieu、

    想知道您是否尝试设置 CCS 编译器寄存器优化0并降低应用程序速度/大小设置? 当使用 Tm4C1294 MCU 启用内部过程优化时、我们有随机奇数跳转到各种无效不精确地址。 我记得、全局优化也会导致奇怪的问题、而局部优化似乎不会导致任何问题。  

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

    尊敬的 

    在本例中、编译器优化处于关闭状态(默认)

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

    在尝试测试软件的其他功能时,我们现在观察到一种新的故障,NOCP! 这是否相关?
    我们的编译器具有-float_support=FPv4SPD16选项

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

    您好、Matthieu、

    它可能会。   如果在禁用浮点单元的情况下执行浮点指令、并且之前存在问题的代码也可能涉及浮点计算、则可以生成 NOCP 使用故障。 您能否检查是否为该项目启用了 FPU? 这通常是编译器设置。 查看 Build -> Arm Compiler -> Processor Options 下的内容、然后查看启用了哪些浮点支持。

    话虽如此、看到它被禁用、我会感到有点惊讶。  

    您能否显示地址0x00007932之后的指令? 它看起来不像跟踪能够捕获所执行的所有指令。 我们的另一位专家怀疑链路寄存器被修改(损坏)、并且一个 ret (POP{R3、PC})导致执行故障例程、从而导致硬件故障。

    此外、 0x200001B3C 的值看起来非常奇怪。 我应该怎么做? 假设 SP 位于 0x200001B38处、该值会进一步超出限制。 它看起来可能是一个损坏的值。 您能否显示完整的寄存器集而不仅仅是 R1-R8?

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

    您好、Ralph、

    甚至可以尽可能设置宽松浮点、以排除因奇数小数点放置错误而可能导致 FPU 崩溃的情况。  

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

    您好 Ralph、

    正如我说过的、选项是 -float_support=FPv4SPD16

    以下是地址0x7932之后的指令:

    我给您的 SP 地址是我自己的分析、也许是错误的、在 SysTick 中断是周期性的时、不可能在这个精确的时刻放置一个断点。
    下面是一个包含更多信息的新屏幕截图、您在 SP 周围有所有 RAM、在我们的自定义硬故障处理程序中、我们存储堆栈式帧(右上角)、您可以看到 LR=0x4D77、您还可以看到所有寄存器 R0-R15。 不管怎样、如果您看一下跟踪指令时序、我怀疑它错过了任何指令。

    我自己需要注意的是:这是软件版本3563、其中跟踪引脚配置为 GPIO_Strength _12mA。

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

    您好、Matthieu、

    从我们看到的内容来看、似乎有一个未对齐的32位写入地址0x200063AD (R3 +#172)、STR.W 指令位于地址0x792E。 这是正常允许的、但如果配置和控制寄存器(地址0xE000ED14的位3)的"未对齐"位被置位、则不允许这样做。

    您能否检查故障发生时配置和控制寄存器的值是多少?

    另一个快速的检查只是为了健全的目的…… FPU 选项在编译器中设置、因此在代码中也应该很好、但您能否交叉检查 CPAC 寄存器的值以查看 FPU 是否由于某种原因被禁用?

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

    您好 Ralph、

    在发生故障时、未对齐的位不会置位、FPU 仍然启用以实现完全访问。

    如果我们考虑硬件、您是否碰巧需要内部硬件、而内部硬件的故障会导致这种行为?

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

    您好、Matthieu、

    此故障是否在多个单元中发生?

    如果故障发生在多个设备上、则根据所提供的信息、它不会与硬件缺陷相关。 仍然不清楚程序流是如何被破坏以跳转地址的、但我们可以看到、没有硬件缺陷导致了这个问题。 硬件行为是根据软件的执行方式预期 的、因此似乎与软件相关、尽管根本原因尚不清楚。

    如果只有一个单元出现错误、所有其他单元正常工作、那么该特定器件可能存在一次性问题。

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

    您好、Matthieu、

    另一位专家回顾了这里分享的所有细节、并提出了一些其他想法、因为我们仍在努力了解根本原因。

    SysTickIRQHandler()的完全反汇编是什么?

    有两个连续 POP–间隔26ns。 这是不同寻常的。 这两个 POP 对应于 SysTickIRQHandler 的什么位置?

    此外、查看时间戳、有两个推送指令间隔4490ns、但只有四个指令间隔、如跟踪中所示(0xC87C 至0x7914)。 这使我们感到有些指示没有得到充分追踪。

    检查 是否有方法可以增加 J-Trace 上的跟踪缓冲区、这可能会提供更好的图像。

    最后、您是否还可以尝试禁用嵌套中断、作为一个实验来查看发生了什么行为?

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

    [引用用户="Ralph Jacobi">这让我们感觉有些指令没有完全跟踪。臭氧屏幕截图显示了一条跟踪的 WFI 指令、该指令在轨迹显示可疑跳转之前约为1300ns。

    在查看 cortex-M ETM 跟踪时、我发现 QTRACE -用户手册 包含以下建议:

    [引用]避免使用执行 WFE/WFI 睡眠指令的函数、因为这将导致跟踪输出暂停并导致跟踪行为不稳定。 建议注释掉用于跟踪的构建的 WFE/WFI 指令。 QTrace Analyzer 将检测是否正在使用这些指令、并突出显示它们的位置。

    如果 WFE/WFI 指令没有相关源、例如它位于库文件中、则需要使用 NOP 指令修补 WFE/WFI 指令。 请参阅附录 C NoSleep 实用程序、了解可为 WFE/WFI 指令添加补丁的 NoSleep 实用程序的详细信息。虽然此建议不是 来自用于 Cortex M 的 Segger J-Trace Pro 文档、 可能值得尝试删除 WFI 以查看跟踪捕获是否包含有关故障的更多指令。

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

    您好!

    首先、感谢您的支持和所有评论、我将尝试全部回答。

    是的、错误发生在多个单元上。 但是、尽管我们遵循了所有系统设计指南、但我们不能排除硬件设计中的任何错误。 很难确定根本原因是否仅与硬件/软件相关、或两者之间是否有一点点关系。

    关于您的推送/弹出备注、它对应于以下代码。 两个函数已关联、因此两个推/弹出对。 为了使用 TivaWare 中的 IntRegister 函数、我们必须实现包装程序、因为您需要传递函数指针、但要在 C++中执行非静态方法、您还需要该对象。 虽然 J-Trace 的时序看起来很奇怪、但我不确定它意味着我们丢失了布线中的任何指令、它可能会链接到 Chester 所述的 WFI 指令。

    我可以删除 WFI 指令和中断嵌套。 但是、正如我在开始时提到的、仍然会有一个硬故障、但如果没有与故障相同的跳转、甚至没有与给定二进制故障相同的源、则始终是相同的、但取决于二进制。

    此致、

    Matthieu

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

    您好、Matthieu、

    [引用 user="Matthieu Tardivon">我可以删除 WFI 指令和中断嵌套。 但是、正如我在开始时提到的、仍然会有一个硬故障、但如果没有与故障相同的跳转、甚至没有与故障相同的源、那么对于一个给定的二进制文件来说、故障总是相同的、但取决于二进制文件。

    此处的目的是、与故障相关的堆栈跟踪的结果信息将更易于使用、以帮助找出根本原因。 现在、随着所有这些情况的发生、很难测量按预期工作的行为与可疑行为。

    此外 、对于 SysTickIRQHandler、我们正在寻找针对它的完全反汇编、而不是 C 代码。 如果您需要有关获取该信息的帮助、我可以提供指导。

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

    您好、Matthieu、

    这里有一个其他的想法...

    您提到过使用 IntRegister、并且您有一个调度程序设置。 您基本上是在运行自定义 RTOS 吗? 如果是这样,如何管理 NVIC 和矢量表的重定位?

    提出这一要求的原因是、至少对于 TI-RTOS、IntRegister API 会导致问题、从而使 RTOS 的 Hwi 变得混乱: https://e2e.ti.com/support/microcontrollers/other/f/908/t/849627?tisearch=e2e-sitesearch&keymatch=faq%3Atrue

    可能不适用于您的案例、但可能需要调查的另一个领域。

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

    您好 Ralph、

    下面是 SysTick 函数的完全反汇编(不带包装程序):

    我还向您提供.out 的完整符号、以便您还可以根据需要浏览反汇编。 (必须以.7z 格式)e2e.ti.com/.../Blood.7z

    我们使用 IntRegister 是因为它更容易实现通用驱动程序、但我们的调度程序非常简单、与 RTOS 不同、因此该线程不适用于我们。

    此致、

    Matthieu

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

    我还测试了 Chester Idea 并删除了 WFI 指令、我们的程序运行一整晚、没有任何故障。 所以、我在数据表中做了一些挖掘、我看到了这个部分、尤其是"注意"一段。

    我认为这可能与观察到的问题有关。 你怎么看?

    我还检查了时钟门控、并使用 SysCtlPeripheralEnable 函数设置 RCGC 寄存器、我们从未启用自动时钟门控、因此即使在 WFI 指令期间外设也应计时。 因此、我不明白为什么这会触发硬故障。 但是、当我们实施了更多与硬件相关的功能并在中断中添加了一些浮点计算时、我们确实开始观察到了这个问题、因此这似乎与我们的问题完全相关。

    我还执行了一个测试、在这个测试中、我放置了 WFI 指令、但是也使用 SysCtlPeripheralSlepEnable 函 数设置 SCGC 寄存器、并且使用 SysCtlPeripheralClockGating 函数启用了自动时钟门控。 该软件也已运行数小时、没有任何故障。

    如果您认为这与我们的问题相关、您能否向我们提供有关微控制器在这些不同情况下实际发生的情况的详细信息、以帮助我们更好地了解问题?

    此致、

    Matthieu

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

    您好、 Matthieu、

    我认为这可能会让我们走正确的道路、但我很奇怪、如果 您设置了 RCGC 寄存器、您会遇到这个问题。

    老实说、我们不确定为什么设置和条件的组合会导致故障。

    我们曾想到、DMA 是否被使用? 在这种情况下、DMA 会在器件处于睡眠模式时尝试访问存储器子系统。

    您是否认为您可以确定这两者中的哪一个导致了浮点功能和硬件功能之间的更多问题?

    对于 FPU、NOCP 错误会使我无法看到... 但是、FPU 在 WFI 工作后需要延迟的原因不应太大。 至少我们对 Cortex-M4F 架构的理解不够。

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

    [引用 user="Matthieu Tardivon">我认为这可能与发现的问题有关。 您对此有何看法?[/引述]数据表中的注意事项表明、在唤醒后尝试访问外设寄存器时会发生硬故障。 但是、在您的情况下、硬件故障似乎不是访问外设、而是由于虚假程序分支。  MSP432E401Y:WFI ()导致硬件故障运行 lwIP 是一个示例、说明 WFI 在唤醒后访问外设寄存 器时导致硬件故障(该参考线程用于 MSP432E 器件、而 MSP432E 使用的外设与 TM4C129相同)。

    此外、数据表中的注意事项指出、只有在启用 DAP 时唤醒才会出现此问题、通常只有在连接调试器时才会出现此问题。 我假设您的程序未启用 DAP。 您是否在未连接调试器时观察到故障?

    在论坛中搜索"WFI"发现了从 WFI 指令唤醒时的旧随机硬故障(LM3S6918以50MHz 运行)、而对于过时的 Stellaris 器件、而非 TM4C129、故障模式似乎匹配。 在该参考线程中、某些 Stellaris 器件中存在勘误表、其中闪存控制器有时会在唤醒后向处理器馈送垃圾指令。 将尝试为 TM4C129创建一个程序、该程序大部分时间处于睡眠状态(使用 WFI)、只是以高速率使用计时器中断唤醒、以查看是否会导致故障。

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

    您好!

    感谢您的反馈。

    为了回答 Ralph 的问题、我们确实使用 DMA 进行 UART 发送、但我怀疑这可能与我们的问题有关、因为它更可能导致传输中的数据损坏、这与深度睡眠模式下的勘误表案例类似、而不是硬故障。 很遗憾、我不能确定 这两者中哪一个导致了浮点功能和硬件功能之间的问题、这很难说。 但是、FPU 和 WFI 实际上只是与 ARM 相关的、并且没有已知的有关此类问题的错误、因此这很奇怪。

    为了回答 Chester 的问题、我们几乎总是连接一个调试器、并且我们的软件不明确启用 DAP (除非隐藏在 TivaWare 中、但我怀疑它)。 我的一位同事说、他在未连接调试器的情况下以及在下电上电后观察到冻结、认为冻结与同一个问题相关、但很难知道、因为此时我们无法找到跟踪。

    尽管如此、我确实认为我们已经接近某种解决方案、因为以下两种解决方案似乎都可以解决该问题:
    -删除 WFI 指令
    -保留 WFI 指令并使用 SCGC 时钟门控和自动时钟门控

    因此、该问题看起来确实与 MCU 睡眠模式相关。 我们需要了解问题的根源、以确保其中一种解决方案是正确的解决方法、而不仅仅是暂时隐藏问题。

    再次感谢您的支持!

    此致、

    Matthieu Tsardivon

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

    [引用 USER="Chester Gillon">将尝试为 TM4C129创建一个程序、该程序大部分时间处于睡眠状态(使用 WFI)、只是使用计时器中断以高速率唤醒、 查看是否会导致故障。所附工程用于 TM4C129XNCZAD、在中断处理程序中发现该工程会生成硬故障。 测试概述如下:

    *@详细说明测试组织为裸机程序、其中:
    * a:主线程使用 wfi 指令旋转循环、将处理器置于睡眠状态
    、* 并且只增加全局变量、甚至是由中断唤醒的时间。
    * b. SysTick 计时器处理程序、用于切换某些 LED、其中 SysTick 计时器以固定速率运行。
    * c.切换某些 LED 的 timer0处理程序。 计时器周期经过一个范围、尝试"拍频
    "* 与 SysTick 计时器配合使用。
    * d.每次调用 LED 时、中断处理程序都会向其 GPIO 写入数据
    、并更改 LED 状态* 以较低的速率提供可见的闪存。
    *
    * 目标板是"用于 Tiva C 系列的 mikromedia 5" 

    只有在连接调试器(XDS200)并在 CCS 10.1.1下运行时、才会出现硬故障。

    如果在 CCS 下启动调试会话、则在运行后的12秒内会进入硬故障。 硬故障发生位置的示例(使用 CCS/TM4C1294KCPDT 中的 GEL 脚本:如何在异常处理程序中使堆栈解除缠绕? 要在发生硬故障后松开堆栈、请执行以下操作):

    当发生硬故障时、违规指令始终位于地址 0x2AC。 当该指令被执行时、R8的常量值应为0x20000200、但是寄存器 R8在发生硬故障时的值为0x0。 NVIC_FAULT_STAT 寄存器为0x00008200、其中 NVIC_FAULT_STAT_BFARV (总线故障地址寄存器有效)和 NVIC_FAULT_STAT_PRECISE (精确数据总线错误)位置位。 NVIC_FAULT_ADDR 寄存器为0x0138EEA5、但是从反汇编和寄存器转储中、似乎没有正在访问地址 0x0138EEA5的指令。

    此外、这些测试通过一系列值扫描 timer0的周期、当发生硬故障时 、timer_period 通常为5925、但当 发生硬故障时、可以看到5923的值。

    2、如果目标上电后重启、保持 XDS200连接、但未运行调试会话、则测试继续运行。 在两次跑步中离开1小时或4小时。 目标运行时、连接调试器、然后恢复运行。 在几秒钟内发生了硬故障。

    这表明由于调试会话被连接而启用 DAP 时、使用 wfi 将处理器置于睡眠状态的某些交互。

    我还没有尝试更改内容、以查看启用 DAP 后问题会如何解决。

     使用的 TM4C129XNCZAD 的 DID0值为0x100A0002、这意味 着器件版本3。

    e2e.ti.com/.../TM4C129XNCZAD_5F00_systick_5F00_wfi.zip

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

    [引用用户="Chester Gillon">只有在连接调试器(XDS200)并在 CCS 10.1.1下运行时才会出现硬故障。我尝试使用 Segger J-Link 而不是 XDS200、并且在调试会话处于活动状态时发生相同的硬故障。 此外、XDS200的测试是 Linux 下的 CCS 10.1.1、而 Segger J-Link 的测试是 Windows 10下的 CCS 10.1.1。

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

    [引用 user="Chester Gillon">我尚未尝试更改内容,以查看启用 DAP 后问题会消失的原因。发现以下序列是可重复的:

    1.启动调试会话。 当程序在 main 暂停时、在"Registers"视图中设置 FLASH_CONF 寄存器中的 FLASH_CONF_FPFOFF 位。 这会强制关闭闪存预取缓冲区。

    2.在启用 DAP 的情况下运行程序,该程序运行时不会出现错误。

    3.暂停程序,并在"Register"视图中清除 FLASH_CONF_FPFOFF 位。 恢复程序后、SYS_TICK 处理程序中的硬故障与在不更改 FLASH_CONF_FFOFF 位的情况下运行程序时的硬件故障相同。

    不确定是否:

    • 强制关闭闪存预取缓冲区、这将减慢在使用的120 MHz CPU 时钟上从闪存执行代码的速度、从而更改屏蔽硬故障原因的时序。
    • 它启用了闪存预取缓冲器、当处理器在 wfi 后从睡眠状态唤醒时、这会导致硬故障。 闪存预取缓冲器可能提供不正确的指令。

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

    切斯特、您好!

    非常感谢您的反馈。 我还在我的一侧执行了测试、并执行了您提供的项目。 我只需稍微修改一下、就可以使用其他 GPIO、但它也会触发目标的硬故障。

    然后,我配置并启用了跟踪引脚,程序将不再崩溃....

    之后,我在其中一个中断的开头添加了一个浮点乘法,在另一个中断的开头添加了一个浮点除法,然后添加了.... 滚筒滚筒.... 我遇到了 NOCP 位设置的硬故障! 因此、这似乎与我们的问题以及我们观察到的问题绝对相关。 硬故障上下文中的堆栈帧确实对应于浮点操作。

    此致、

    Matthieu

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

    Matthieu 和 Chester 您好、

    感谢在这个问题上取得的巨大进展。 我已经下载了 Chester 的项目、但我还没有机会使用它运行测试。 我明天应该能够这样做。 我将主要使用 Stellaris ICDI 和 XDS200进行测试。 如果还需要 J-Link、但现在看来 XDS 足以解决问题。

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

    Matthieu 和 Chester 您好、

    感谢您的耐心等待。

    我对 DK-TM4C129X 板和 XDS200运行了一组测试、以重新创建切斯特观察到的结果。

    WFI、DAP 和闪存预取之间似乎存在奇怪的关系、但我仍然不清楚到底发生了什么。 但是、现在我倾向于关闭预取、通过使代码执行速度变慢来"解决"问题。

    由于数据表提到 WFI 之后的短暂延迟可以避免出现问题、因此我继续在两个 ISR 开始时以及 WFI 命令之后添加了10个 NOP 命令。 目前、此代码已运行了一个多小时、我打算隔夜运行。 以前、它需要几秒钟的时间才能发生故障。

    我在这些上测试了位置、在 ISR 中以及在执行 WFI 命令之后、我发现我需要它们。 我没有测试两个 ISR 是否都需要它们、也没有测试一个 ISR、但我预计这两个 ISR 都需要。

    我还没有测试需要多少。 我选择了10作为任意数字、它起作用了、现在我最感兴趣的是扩展测试结果、因为剩余的测试明天能够以多快的速度进行微调。

    因此、根据这些结果、我认为关闭的闪存预取功能与这些 NOP 命令一样有效、能够为 MCU 提供足够的时间从 WFI 中完全恢复。

    我不确定问题本身是否真正属于数据表描述的范围、FPU 操作是否触发了这种情况、或者闪存预取是否能够解决这种情况、 然后、我认为"外设访问"并不是一个足够广泛的声明、它涵盖了似乎触发故障的所有事件。

    我正在等待队友的反馈、明天我将继续做更多测试、但现在我预计我们的建议是在 WFI 命令之后以及任何可从 WFI 唤醒器件的 ISR 开始时插入一些 NOP 语句。 如数据表所述、可以将其删除以用于生产。

    此外、Stellaris ICDI 根本没有任何问题、因为它的调试接口实际上不访问 DAP、 这进一步表明问题与 DAP 和 WFI 如何协同工作直接相关、因为在这种情况下复制 CCS 调试环境而不是让电路板在调试环境之外自由运行。

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

    您好、Matthieu、

    很抱歉沉默了几天,有很多测试要运行,有很多不寻常的结果要筛选。 您可能想在开始阅读之前补充饮料、哈哈。 希望我们已经发现并能够提供的内容足以满足您的情况。

    首先、下面是我测试过的硬件:

    DK-TM4C129X 开发套件、我将其通篇称为"DK 电路板"

    EK-TM4C1294XL LaunchPad、我将其通篇称为"LaunchPad"

    XDS200调试器

    软件、我主要使用 Chester 提供的示例、我也将该示例移植到 EK-TM4C1294XL。

    从我看到的结果来看、这里总共有四个方面在发挥作用。 DAP、WFI、预取以及在最低程度上优化编译器。

    当我刚开始时、我主要关注 DAP 和 WFI 部分、即使在我发布的最后一篇文章中、我也没有真正发现深入到足以真正理解与现在相比发生了什么情况。 因此、我在这里要说的很多内容都与我最后的发现不一致、因为它们不完整。

    首先、在每个 ISR 开始时以及 WFI 之后、避免此问题所需的 NOP 数量至少为9。 远高于预期。 但是、在进行测试时、我注意到了一些奇怪的情况:

    1) 1) ICDI 没有任何故障

    2) 2)在未使用 NOP 时完全断开 XDS200探针会导致器件复位时仍出现问题

    此外、我的一名团队成员对预取持怀疑态度、这是基于他们过去在其他支持的 MCU 上的工作方式。 因此、我进行了一些进一步的测试、以尝试验证问题是否完全是由于预取执行速度较慢、或者预取本身是否导致了问题。

    为此、我尝试将代码与 DK 电路板连接器命令文件中的32字节段对齐、然后还观察了从 RAM 执行时发生的情况。 对齐所有代码没有帮助、但从 RAM 执行可以解决问题、这表明 DAP 和 WFI 不是唯一的问题、但有关它们如何与闪存配合使用的问题是其中的一部分。

    这将导致另一个测试、即对齐将 WFI 命令放置在专用文件中函数中的代码、并且仅对齐链接器命令文件中的32个字节。 在这种设置下、无论 DAP 和预取缓冲器如何、DK 电路板都能再次正常工作。

    然而,这仍然令人好奇,为什么 ICDI 没有任何失败。 因此、使用 XDS200、我转到了 LaunchPad、并尝试查看 LaunchPad 是否仅在 XDS200的情况下发生故障。 而不是。 这是意料之中的、因为我所做的唯一更改是调整 LED 的一个 GPIO 端口。

    深入了解项目属性后、我看到切斯特的优化已启动到最大速度。 在我对 LaunchPad 项目应用相同级别的优化后、它立即开始失败、现在 XDS200和 ICDI 都失败了。

    但这是一个令人陌生的地方。 我们已经看到、如果断开或移除 XDS200、则会发生该问题、并且在 LaunchPad 上重复出现该问题。 但是、当 ICDI 断开连接时、代码再次完美运行。 在这两种情况下、我都使用板上的"Reset"按钮来复位板。 然后、在再次使用 XDS200进行编程后使用 LaunchPad、断开连接、重置并获取故障... 我通过拉动 USB 电缆对电路板进行了下电上电、代码在下电上电时工作正常。

    所以... 现在、开始总结要点。

    1) 1)将 WFI 调整为32字节可以解决该问题

    2) 2)关闭预取可解决此问题

    3) 3)从 WFI 唤醒后使用足够数量的 NOP 可以解决该问题

    4) 4)降低优化可以消除或屏蔽问题

    5) 5) DAP 留下了某种残余调试逻辑、需要完全电源复位才能清除

    基于这些、当启用 DAP 时唤醒 WFI 时、器件中的预取逻辑会发生错误、进而触发器件发生硬故障。 通过使用 NOP 延迟、预取错误会在存储器访问完成之前被给予足够的周期来清除。 但是、通过强制将 WFI 命令与32字节段对齐、将其作为32字节预取缓冲区的前两个字节、预取就可以正常工作、而不会出现任何错误。

    遗憾的是、由于我们实际上无法了解在器件中持续存在的 ICDI 所做的 DAP 是什么、从而导致了该问题、 我不想说、在这里、我们真正了解了 DAP 影响预取的原因、以及它需要重启电源来清除产生此问题的设置的原因。 但至少这些信息为我们提供了一种我们高度信任的解决方案、即 WFI 对齐。

    通过使用 WFI 对齐解决方案、您无需关闭预取、无需对 NOP 进行微调或将其添加到 ISR 中(这意味着您不必担心忘记它们)、您可以安全地在代码中保持高优化。

    我将 CCS 项目连接到 WFI 已完成对齐的位置。 我要注意的一点是、根据我们的一位专家的建议、我们确实在 WFI 命令之后添加了两个 NOP、他说这是基于我们 Hercules 器件的良好做法。 解决这一问题并不需要这种办法,但这是一种良好做法。

    您将在.cmd 中看到如何实现对齐、因此希望您可以在程序中复制对齐。

    CCS 项目: e2e.ti.com/.../TM4C129XNCZAD_5F00_systick_5F00_wfi-_2800_2_2900_.zip

    如果您认为 WFI 对齐解决方案有效、那么请告诉我、如果您认为这是足够的信息来解决您的问题。

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

    附加的工程是我移植到 EK-TM4C129EXL 上运行的示例、显示了与 ICDI 一起使用时的故障(对于附加的工程未强制对齐地址为0x00000574的 wfi)。

    将 wfi 与32字节边界对齐可在调试器下运行时停止硬故障。

    我找到了另一种方法来阻止硬故障、即:

    1. 启动调试会话
    2. 程序在 main 暂停时、使用调试器寄存器视图将 SYSCTL_SLPPWRCFG FLASHPM 域从0x0 (工作模式)更改为0x2 (低功耗模式)。
    3. 恢复该程序、该程序不再出现硬故障

    改变可停止硬故障的闪存功率模式的行为是否提供了有关根本原因的线索?

    是否值得为此问题添加器件勘误表?

    e2e.ti.com/.../TM4C129ENCPDT_5F00_systick_5F00_wfi.zip

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

    切斯特、您好!

    [引用 USER="Chester Gillon"]更改停止硬故障的闪存功率模式是否能提供有关根本原因的线索?

    我不确定... 我的第一个想法是当闪存处于低功耗模式时,执行速度较慢的部分原因是它不会尝试优化访问闪存,因为指令最终会被拆分,因此无意中导致内存与 align (32)对齐,因此不会出现问题。

    [引用 user="Chester Gillon"]是否值得为此问题添加器件勘误表?

    这是我们正在考虑的问题、问题是我们不能真正理解根本原因。 此外、它依赖于优化也是一个问题、因为这些问题会因 IDE 而异。 我认为这是有资格的,但我们需要确切地弄清楚如何以有意义的方式提出这个问题。

    老实说、此时我想知道 WFI 的器件数据表警告是否只是对问题的误解、而不是关于外设访问、但它似乎与外设访问相关、因为 ISR 通常从外设调用开始。

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

    您好 Ralph 和 Chester、

    首先,非常感谢您的所有工作,这对您非常有帮助,我对延迟的答复感到抱歉。

    我一直在我这边运行一些测试、这些测试是您在我们的目标上提供的项目、我可以通过这个特定项目来确认两个方面:

    -将对齐32用于 WFI 指令似乎可以防止 硬件故障

    -使用 SCGC 和自动时钟门控并不能防止硬件故障

    但是、我一直在尝试在我们的目标上应用"align 32"、不幸的是、我遇到了严重的错误、我需要一些时间来确定它们是否相关或来自完全不同的问题。

    同时、您能否确认我在附加的修补程序(在.txt 重命名以进行附件授权)上正确实施了修复?e2e.ti.com/.../WFIAlign32.txt

    我相信、一旦完全了解根本原因 、就最好将其放在勘误表上。 我还想知道"align 32"是否是可直接应用于函数 的链接器指令/属性、如果是这种情况、最好将其应用于 TivaWare 中的 CPUwfi 函数并同时添加两条 NOP 指令。  我还对跟踪引脚进行了驱动强度更改、因为我还建议更新 TivaWare 中的值。

    此致、

    Matthieu Tsardivon

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

    Matthieu TardiVON 说:
    我还想知道"align 32"是否是可直接应用于函数的链接器指令/属性

    我发现 TI ARM 编译器用户指南中提到了可在源文件中指定的 CODE_ALIGN pramga、 但发现该 pragma 不起作用-请参阅 Compiler/TM4C129XNCZAD:TI ARM v20.2.3.LTS 编译器似乎不支持代码对齐

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

    您好、Matthieu、

    切斯特的说明是否有助于您了解如何更好地使用 align (32)来实现代码?

    [引用 user="Matthieu Tardivon">我认为、一旦充分了解根本原因 、最好将其放在勘误表中。 我还想知道"align 32"是否是可直接应用于函数的链接器指令/属性、如果是这种情况、最好将其应用于 TivaWare 中的 CPUwfi 函数并同时添加两条 NOP 指令。

    准确理解根本原因的问题正是我们所面临的问题、因为这种行为很难精确跟踪。

    关于链接器指令、请参阅我在其底部附近对 Chester 的注释。

    [引用 user="Matthieu Tardivon"]我还对跟踪引脚的驱动强度进行了更改、因为我还建议更新 TivaWare 中的值。

    很抱歉、这个线程已经很长了、可能我错过了这个。 您能否进一步解释此请求? 如果在我们的结尾处发现它是一个良好的通用更改、我可以评估并提交以供将来更新。

    [引用 user="Matthieu Tardivon"]-使用 SCGC 和自动时钟门控并不能防止硬故障[/quot]

    感谢您对此提供的意见、这对我们非常有帮助、因为我们将继续评估造成此问题的确切原因。

    切斯特、您好!

    [引用 USER="Chester Gillon"]我发现 TI ARM 编译器用户指南中提到了一个可在源文件中指定的 CODE_ALIGN pragma、但发现该 pragma 不起作用-请参阅 Compiler/TM4C129XNCZAD:TI ARM v20.2.LTS 编译器似乎不支持代码对齐[/QUERE]

    感谢您打开此 E2E 主题。 Bob 也做了同样的观察、尽管我们没有回到编译器的相关内容。 可能对问题的控制太大了! 希望他们将来能有一个解决方案、这样就能更轻松地做到这一点... 我将跟踪该错误报告的内部系统、如果我看到解决问题的解决方案、那么我将反映我们应该更新 TivaWare 以使用该解决方案。

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

    您好 Ralph 和 Chester、

    切斯特的解释确实帮助我理解如何解决问题。 固定软件已运行24小时以上、没有任何故障。

    我与我们的软件团队进行了讨论、我们决定将此修复添加到中继中、并将此问题标记为已解决。 对于此修复程序、将执行更多测试、如果我们看到任何相关的硬故障、我们将在此主题或另一主题上向您提供有关此主题的参考。

    关于走线引脚驱动强度、这是我使走线正常工作的唯一方法、因为中间有很长的带状电缆和一个隔离器。 这也是 Segger 的建议:"pattern test successful but still correct trace data? 检查引脚初始化中的 SET 引脚驱动强度、并将其设置为可能的最高/最快速度、并检查较低的跟踪时钟(降低 PLL 初始化中的 CPU 时钟速度)是否解决了该问题"
    https://www.segger.com/products/debug-probes/j-trace/technology/setting-up-trace/

    再次感谢你们两人的支持、我们希望你们能够找到背后的根本原因、我们期待听到这一消息!

    此致、

    Matthieu Tsardivon

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

    [引用 user="Ralph Jacobi">我将 CCS 项目连接到 WFI 已完成对齐的位置。 我要注意的一点是、根据我们的一位专家的建议、我们确实在 WFI 命令之后添加了两个 NOP、他说这是基于我们 Hercules 器件的良好做法。 解决方案不需要这种情况、 但这是一个很好的做法。搜索找到 TI 应用手册,了解 在 SimpleLinkTmMSP432TmARMRegisteredCortexRegistered-M4微控制器上正确睡眠和中断使用的 Cortex-M MSP432 ,该应用手册介绍了使用 数据同步边界(DSB)指令刷新数据存储器的必要性 传输管线以避免 意外行为。

    和 ARM 应用手册321存储器边界指令的 ARM Cortex-M 编程指南  第3.3节架构要求包含以下内容:

    [报价]睡眠

    在暂停执行以进入睡眠模式之前、处理器硬件不需要消耗任何挂起的存储器活动。 因此、如果使用的睡眠模式可能影响数据传输、软件必须通过添加隔离指令来处理这一问题。 应使用 DSB 来确保在执行 WFI 或 WFE 指令之前没有未完成的存储器事务。[/QUESP]根据该循环 、我更改了 EK-TM4C129EXL 的示例、以便在 wfi 指令之前添加 DSB:

    对于(;)
    {
    ASM (" DSB");
    ASM (" wfi");
    num_wakeups++;
    } 

    从反汇编中、wfi 不是32字节对齐的:

    $C$L9:
    00000574:F3BF8F4F DSB SY
    00000578:BF30 WFI
    153. num_wakeups++;
    0000057a:6808 LDR R0、[R1]
    0000057c:1C40 添加了 R0、r0、#1
    0000057e:6008 结构 R0、[R1]
    154 }
    00000580:E7F8 B $C$L9 

    仅插入 DSB 指令、即不添加 wfi 指令的显式对齐、也不添加任何尾随 NOP、硬故障就不再发生。  

    不确定添加 DSB 是否已修复根本原因、或只是更改了时序来屏蔽问题。

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

    切斯特、您好!

    这是一个有趣的消息。 我即将在这篇文章中写下这篇文章、因为我将修复分发给了我们的软件团队、不幸的是、我的两位同事发生了硬故障、我们的分析表明它们与同一个问题相关。 因此、WFI 指令32位对齐似乎不足以解决问题。

    我还看到了以下帖子:
    https://stackoverflow.com/questions/47022456/why-is-an-isb-needed-after-wfi-in-cortex-m-freertos

    我还发现以下建议:
    "在执行 WFI 或 WFE 指令之前、应使用 DSB 来确保没有未完成的存储器事务。 "
    和许多解释、请参阅《存储器边界指令的应用手册321 ARM Cortex-M 编程指南》

    我们的大多数团队今天都在休假、但我们将在明年年初尽快执行新测试。

    祝你圣诞节快乐!

    Matthieu Tsardivon

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

    [引用 user="Chester Gillon">不确定添加 DSB 是否已修复根本原因、或只是更改了时序来屏蔽问题。 ARM 应用手册321显示 DSB 的架构要求是确保在停止时钟之前已完成缓冲写入:

    要尝试并了解 DSB 是否解决了根本原因:

    a.下载 EK-TM4C129EXL 的原始程序失败。

    b.当程序在 main()的开头停止时,使用调试器将 NVIC_ACTLR 寄存器中的 NVIC_ACTLR_DISWBUF 位置位,从而禁用写入缓冲器。

    仍然出现硬故障。 也就是说、不要相信添加 DSB 可以解决根本原因、而只是更改了时序。

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

    切斯特、您好!

    感谢您提供这些新信息。

    [引用 user="Chester Gillon">只插入 DSB 指令、即不添加 wfi 指令的显式对齐、也不添加任何尾随 NOP、硬故障就不再发生。  

    不确定添加 DSB 是否已修复根本原因、或只是更改了计时以掩盖问题。

    我尝试了同样的操作、但没有得到您的结果。

    我不确定写入缓冲器部分是 DSB 在这里真正影响的部分。 相反、它会影响预取缓冲器的行为、而预取缓冲器与 DAP 和 WFI 是导致此问题的根本原因之一。

    我在应用手册中更感兴趣的还有 SCB_SCR_SLEEPONEXIT_MSK 和 SCB_SCR_SLEEPDEEP_MSK 的使用。

    对于 TM4C、等效项包括:

    //
    //
    //对于 NVIC_SYS_CTRL 寄存器中的位字段定义如下。
    ////
    *****************
    #define NVIC_SYS_CTRL_SEVONPEND 0x00000010 //挂起时唤醒
    #define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 //深度睡眠启用
    #define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // ISR 退出时睡眠 

     数据表的寄存器59:系统控制寄存器(SYSCTRL)、偏移量0xD10也对此进行了详细说明。

    但是、当我尝试使用这些时、性能更差... 因此、我不知道为什么建议对 MSP432更有效。 尤其是在编写应用手册时考虑到 MSP432E4。

    Matthieu、

    假期休息没有问题、下周我也在外面工作、一周后的工作能力更有限。 我认为在年初挑选这项工作对所有人都是最好的。

    我很想知道 DSB 如何影响您的系统、并严格遵循 MSP432指南。 可能该应用手册也是在编写时考虑到 MSP432E4、MSP432E4使用与 TM4C 相同的架构、因此我会按照顺序复制 TM4C 的命令、看看会发生什么情况。 也就是说、根据我自己的结果... 我的预期是、解决该问题不会产生影响。 TM4C 等效代码:

    HWREG (NVIC_SYS_CTRL)|= NVIC_SYS_CTRL_SLEEPDEEP;//设置 SLEEPDEEP
    HWREG (NVIC_SYS_CTRL)|= NVIC_SYS_CTRL_SLEEPEXIT;//设置 SLEEPONEXIT
    ASM (" DSB");//确保 SLEEPONEXIT 在睡眠前立即置位
    ASM (" wfi");
    

    对于存在此问题的系统、您的工程师是否尝试禁用预取缓冲器作为解决方案? 很明显、我们希望找到比这更好的解决方案、但这将是一个很好的数据点、可以知道这是否能为您解决所有系统中的问题。

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

    [引用 user="Ralph Jacobi">我不确定写入缓冲器部分是 DSB 在这里真正影响的部分。 相反、它会影响作为此问题根本原因一部分涉及的预取缓冲器行为以及 DAP 和 WFI。[/引述]我同意测试没有结果。 这样的故障的问题是、正如 Matthieu 所指出的、故障会随着代码的更改而发生、这是为了找出根本原因。

    给出了一些示例、这些示例仅通过使用计时器中断和 GPIO 切换在器件上显示数秒后出现故障、即不依赖于外部输入、TI 是否能够在整个器件上运行精确到周期的仿真?

    例如、是否可以在整个器件的仿真中运行显示器件故障的同一可执行文件、以查看该可执行文件是否复制硬故障、然后跟踪 Cortex-M4执行的导致硬故障的实际指令?

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

    切斯特、您好!

    [引用 USER="Chester Gillon"]给出了一些示例、这些示例显示了仅使用计时器中断和 GPIO 切换在器件上持续数秒后出现的故障、即 TI 是否能够在整个器件上运行精确到周期的仿真?[/QUERPILE]

    我希望这是一个选项、但这些器件的仿真数据库已存档。 但是、即使没有这一点、这些器件的设计也是多年前完成的、从工具链的角度来看、我们在团队中不再拥有专业知识。 遗憾的是、这正是我们真正需要掌握的真正原因、因为我们只能在执行代码时对硬件进行调试。