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.

[参考译文] AM623:AM62x M4F:IPC 通知 ISR 中断 DDR 共享存储器访问时出现的罕见精确数据总线故障

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1621462/am623-am62x-m4f-rare-precise-data-bus-fault-when-ipc-notify-isr-interrupts-ddr-shared-memory-access

器件型号: AM623

当 IPC Notify ISR 抢占 DDR 共享存储器访问时、AM62x M4F 上会遇到罕见但关键的精确数据总线故障。
此问题极难重现、并且仅在长时间运行(几天)后才会发生。
存在许多风险
SDK:MCU+SDK AM62x 10.01.00.33
操作系统:FreeRTOS
编译器:TI-ARM-CLANG
优化:-os
共享存储器位于 DDR 中。
存储器布局:
DDR_M4:origin = 0x9CC01000
share_data:origin = 0x9D000000(2KB 对齐)
共享结构:
易失性 m4_share_MEM m4_share_mem
__attribute__((section(“.share_MEM_BUF")“)、aligned (2048)));
链接 CMD 文件:linker.cmd.zip 
问题描述
系统长时间正常运行、然后随机崩溃:
精确数据总线故障
故障地址= 0x80600100
调用堆栈:
IpcNotify_ISR
GPIO_INPUT_Handle
IDLE_SCAN_THREAD_TASK
当 ISR 中断以下共享内存访问时发生崩溃:
Val = ENCODER_TIMER_GET_COUNT_WIT_CHECK();
if (m4_share_mem.eQEP-value!= val)
m4_share_mem.eQEP-value = val;
}
m4_share_mem @ 0x9D000000m4_share_mem.eQEP-value @ 0x9D0000C0
故障地址:
0x80600100
这是内部信息:
GPIO0 基址= 0x80600000
其他调查结果
内部发生崩溃:
IpcNotify_getReadMailbox (pInterruptConfig->coreIdList[core]、&mailboxBaseAddr、&hwFifoId、&userId);
行为特性
*只有在长时间运行后才会发生
* ISR 堆栈增加至 30KB→无改进
*共享内存已对齐
*没有 memcpy 重叠
*不能通过手动 ISR 触发器轻松重现 (HwiP_POST)
与时间密切相关。
故障日志
线程 IDLE_SCAN_TASK 故障
===== 线程堆栈信息======
地址:9cc08fd0 数据:84201000
地址:9cc08fd4 数据:80600000
地址:9cc08fd8 数据:9d000000
地址:9cc08fdc 数据:000063d1
地址:9cc08fe0 数据:00000000
地址:9cc08fe4 数据:00000000
地址:9cc08fe8 数据:a5a5a5a5  
地址:9cc08fec 数据:a5a5a5a5  
地址:9cc08ff0 数据:a5a5a5a5  
地址:9cc08ff4 数据:0001c9F1  
地址:9cc08ff8 数据:a5a5a5a5  
地址:9cc08ffc 数据:a5a5a5a5
================================================== 寄存器信息=====================  
R0 : 00000000 R1 : 00000000 R2 : 00000000 R3 : 0000df48 R12: FFFFFFFF LR : 000063d1 PC : 00011610 PSR: 81000000  
=========================================================
总线故障是由精确的数据访问违例引起的总线故障发生地址是 80600100
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好  

    从错误开始、看起来内核正在尝试访问无效的存储器或内核没有读取该存储器的权限。

    您能否与我们共享 example.syscfg 文件和*。map 文件以进行分析?

    此致、

    Tushar

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

    e2e.ti.com/.../example.syscfg.zipe2e.ti.com/.../Release.map.zip

    以下是您需要的两个文件。 期待您的答复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kevin:

    IpcNotify_getReadMailbox (pInterruptConfig->coreIdList[core]、&mailboxBaseAddr、&hwFifoId、&userId);

    您是否知道在上述 API 中的哪条语句发生异常?

    如故障地址报告所示、地址显示为 GPIO。

    此外、 请在将故障地址和 IPC 地址 MPU 区域配置为严格排序后尝试运行应用程序、并查看问题是否重现。

    此致、

    Tushar

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

    您好,感谢您的答复。

    我尝试将 GPIO 地址区域的 MPU 属性设置为 Device、但问题未解决。 我执行了以下最新的测试、可以快速重现问题:

    1. 每个 25µs 都有一个来自 PRU 的总线中断。 在该中断处理程序内、我只切换 GPIO 级别、而不调用任何 FreeRTOS API

    2. 同时、有一个主任务 500ms 运行一次、并打印字符串“main task is running“。

    运行几分钟后、系统会报告错误并抛出以下异常之一(并非总是相同的例外)。 有时它会报告:

    • 使用故障是由于尝试切换到无效状态而引起的

    在其他情况下、它会报告类似的 UsageFault。

    最重要的观察是、当我将这个主任务的堆栈从 DDR 移动到内部 IRAM 时、这两个问题都会立即消失、并且系统正常运行。

    因此、我想确认以下几点:

    当任务栈位于 DDR 中时、如果高频中断反复中断执行并导致 DDR 中频繁进行栈推挽/砰砰声操作、这是否会导致 CPU 在完成后无法正确从中断返回

    或者、这是否意味着任务栈根本不应放置在 DDR 中

    错误日志:e2e.ti.com/.../cm1.txte2e.ti.com/.../cm2.txte2e.ti.com/.../8561.example.zipe2e.ti.com/.../8561.Release.zip

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

    以下是一个附加日志、供参考。 每次出现的错误似乎都是随机发生的。

    还有一点需要注意、在我将之前报告错误的所有任务从 DDR 移动到内部 IRAM 后即使外部高频中断是 active.e2e.ti.com/.../cm3.txt、系统也变得稳定

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

    您好、

    这是否意味着问题仅在将栈放置在 DDR 中时才会出现、而保留在内部存储器中时才会发生?

    还是仍然发生、只是需要很长时间才能重现?  

    另外、请共享示例代码以重现问题。

    此致、

    Tushar