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.

[参考译文] TMS570LC4357:意外且混乱的数据中止

Guru**** 2466550 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1098991/tms570lc4357-unexpected-and-confusing-data-abort

器件型号:TMS570LC4357

您好!

我收到的数据中止对我来说毫无意义。

我使用的是 TMDX570LC4357HDK 电路板、CCS v11.1.0.00012和 TI 20.2.5.LTS 编译器。

我最近在 ESM FIQ 中创建了一个关于 UNDEF 中止的论坛帖子。 我在这个问题上得到了帮助、购买了使用链接器脚本确保闪存的 ECC 数据正确。 我不再获得任何 ESM 中断。 我在这里描述的这个问题在同一个应用程序中几乎同时发生。 我的应用具有两个相同的 HDK 板、它们通过 SPI 相互通信。 如果我没有连接它们的 SPI 引脚、因此没有通信和 SPI 中断、我就不会遇到这个问题。 也许缺少这些中断只是使问题变得更加罕见、所以我还没有看到它、或者 也许中断 是造成问题的原因。 我有两个应用程序- Peer0和 Peer1 -该问题仅存在于其中一个应用程序上,而不管每个对等程序运行在哪个 HDK 上。

在 IRQ 中断内、我将获得数据中止。 我在 ISR 失败之前执行过很多次。 根据调试调用堆栈和 R14_ABT 寄存器、这应该是失败的指令:

00000846: 4913 ldr r1, [pc, #0x4c]      ;reads 0x08001C8C into R1
00000848: 9803 ldr r0, [r13, #0xc]
0000084a: 6008 str r0, [r1]

0000084c: 4914 ldr r1, [pc, #0x50]      ;reads 0x08001C90 into R1
0000084e: 9803 ldr r0, [r13, #0xc]
00000850: 43C0 mvns r0, r0
00000852: 6008 str r0, [r1]

显然、这 毫无意义、因为这不是一个读取/写入操作。 r0和 R1的值表明 尚未 执行第0x84C 行、因为 该值或 R1为 0x08001C8C。

DFSR 的值为 0x00001008、表示"同步外部中止"-这意味着 MVNS 指令是问题方- 因此这是错误的、还是 r14_ABT 是错误的?

DFAR 的值为 0x07FFFFEC、这不是发生中止时任何寄存器的值。

根据 ARMv7-R TRM、表 B5-8 、DFSR[10、3:0]为01000b 意味着 DFAR 有效、这对我来说并不正确。

根据 B5.4.3节、使用数据中止来报告指令提取上的外部中止。 这让我相信、与当前正在执行的代码无关的问题已经发生、并且上述大多数信息都是一个错误。

如何调试该数据中止、或者是否缺少某些内容?

非常感谢、

Adam

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

    尊敬的 Adam:

      r14_ABT 的值是什么?

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

    R14_ABT 为0x850。

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

    如果 R14_ABT=0x850、指令生成的数据中止位于0x850-8=0x848: LDR r0、[R13、#0xc]

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

    LDR r0、[R13、#0xc]看起来确实会导致数据中止、因为 R13_IRQ 为0x07FFFFE8;该值+ 8等于 DFAR。 但是、我不明白为什么 SP 具有该值。 上述说明之前的说明:

    00000840:9803 LDR r0、[R13、#0xc]
    00000842:1C40增加了 r0、r0、#1
    00000844:9003 str r0、[R13、#0xc]

    显然、这些指令不会影响 SP、但如果 SP 在这些指令之前具有该错误值、它们会在实际发生点之前触发数据故障。 我已经检查了反汇编 和 C 代码、并且没有分支会跳过此注释中的粗体指令。

    我唯一能想到的另一种可能性是导致此问题的严重嵌套中断。 SPSR_ABT 显示我们处于 IRQ 模式、IRQ 被禁用、当中止发生时 FIQ 被启用。 这就是我所期望的。 但是、如果我查看 SPSR_IRQ、我会发现我们处于 IRQ 模式、IRQ 和 FIQ 都已启用、之后才获取 IRQ。 这表示我们在中止之前嵌套 IRQ、不应发生这种情况。 内核应 在获取 IRQ 时设置 CPSR 中的 I 位、并且在 IRQ 模式下、我的应用程序中没有清除 CPSR 的代码。

    我已经检查了我的所有汇编代码和内联汇编代码中的 cpsie 指令、并向清除 I 位的 CPSR 写入了数据、但我没有找到任何数据。 我看不到我的中断应该嵌套的原因。

    我错过了什么吗?

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

    尊敬的 Adam:

    对于 TMS570LC43x、在复位时启用闪存错误检测和校正。  在读取程序/数据之前、所有闪存存储器空间(闪存组0至6)的 ECC 值必须被编程到闪存中。  这可以通过 使用链接器 cmd 生成正确的 ECC 值来完成。

    Cortex R5F CPU 可以生成推测取指令、将其取指令到闪存存储器空间内的任何位置。  

    使用链接器 CMD 文件生成 ECC:

    https://software-dl.ti.com/hercules/hercules_docs/latest/hercules/How_to_Guides/index.html

    我用于生成 ECC 的链接器 cmd 文件示例:

    e2e.ti.com/.../4338.HL_5F00_sys_5F00_link.cmd

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

    您好!

    我已经在我的链接器脚本中添加了 ECC 信息、并且在我可以看到它按预期工作;我的红色错误 LED 从未亮起、并且我从未收到 ESM 中断。