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.

[参考译文] AM62A7:IPC notifiy Init

Guru**** 2434370 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1538608/am62a7-ipc-notifiy-init

器件型号:AM62A7


工具/软件:

TI 开发大家好、

我目前正在使用 Remoteproc 和 IPC (SDK V10.00.xx.xx) 在 AM62A SK 板上开发一个工程。 我已成功从 SDK 导入并构建了示例工程、其中 DSP 内核会向 MSRAM 写入一个值、Linux 端在通过/dev/mem.引导后读取该值 大多数时候、它按预期工作。

但是、我遇到了一个 问题

引导 Linux 后、DSP 内核处于“运行“状态

但是、有一段时间我尝试从 Linux 读取 MSRAM 地址、该值全为零 (0x0)、而不是 DSP 设置的预期值。

这种情况每 20–30 次重新启动(大约 1–2 次)就会随机发生、而其余时间一切都正常。

调试时、我注意到问题似乎发生在 DSP 端的 IpcNotify_init () 调用期间或之前。

•然后、我尝试在 IpcNotify_init () 之前将值写入 MSRAM、并在 IpcNotify_init 之后将值写入 MSRAM。

我的问题:

SDK 10.00.xx.xx 中是否有关于 IPC Notify 初始化竞态条件或 MSRAM 共享存储器同步问题的任何已知问题?

此致、

密钥

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

    Hello Key、

    只是为了检查、您使用的 MSRAM 的地址是什么?

    此致、

    Nick

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

    您好、Nick、

    我使用的 MSRAM 地址为 0x43C40000。

    我花了一些时间来了解 IpcNotify Init 函数。 在 IpcNotify Init 内 、有会导致问题的 HwiP_construct 函数。 我附上了下面 IpcNotify init 函数的捕获结果。  

    此致、  

    密钥

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

    您好、Nick、  

    您能否提供有关此问题的任何更新?  

    此致、
    密钥

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

    您好、Sopheap、

    此器件中有许多不同的存储器、称为“SRAM"</s>“

    此时、我不知道 0x43c4_0000 处的 64KB 存储器的用途(例如,如果处理器的另一部分可能修改该存储器区域中的数据)。 我们仍在研究这个问题。

    但通用片上 SRAM (OC_SRAM) 位于 0x7000_0000。 当前的 AM62Ax TRM 中有一个错误、该错误未列出在存储器映射中、但它将添加到下一个月中的某个时候推出的 TRM 版本中。

    有关 SRAM 分配的更多详细信息、请参阅 AM62Ax 多核 Academy:
    https://dev.ti.com/tirex/explore/node?node=A__AYrsKbr1tG2YndAqFy7LLg__AM62A-ACADEMY__WeZ9SsL__LATEST

    请注意、在该页面中、我提到的 512KB MSRAM 区域是 MCU 域 MSRAM、而不是 0x7000_0000 处的 OC_SRAM。 我将在将来的 Academy 版本中添加一条注释以阐明这一点。

    接下来的步骤 — 我会尝试 0x7000_0000 区域  

    我们仍在研究 0x43c4_0000 区域。 可能还需要几个工作日 — 如果我们在下周中没有收到其他回复,请随时  ping 通主题。 如果您希望在我们做出响应之前取得进展、您可以在 0x7000_0000 处测试该区域、看看它是否适合您。

    此致、

    Nick

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

    您好、Nick、

    当您提到位于 0x7000_0000 的 OC_SRAM 区域时、我看到参考手册中列出了 2 个 MSSRAM_64kB 物理地址、如下所示。 目前、我使用 0x43c4_0000 在 DSP 上写入数据、在 Linux 端读取数据。 当我尝试读取两个地址 (0x43c4_0000 和 0x7000_0000) 处的值时、它会在 IPC 工作时返回完全相同的值、而当 IPC 被打乱或在 ipcnotify init 内 HwiP_construct 之前挂起时、两者都返回 0。

    这两个地址区域之间是否有任何差异?

    此致、
    密钥

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

    Hello Key、

    0x43c4_0000 和 0x7000_0000 指向同一个 OC_SRAM 区域

    看起来我们都决定今天运行相同的测试。 是的、我可以确认这两个地址都指向同一个存储器区域。 其中一个是“真实“地址、另一个是“别名“。 无论您使用哪个地址、从任一地址访问都应相同。

    root@am62axx-evm:/opt/edgeai-gst-apps# devmem2 0x70000100
    /dev/mem opened.
    Memory mapped at address 0xffffad2e5000.
    Read at address  0x70000100 (0xffffad2e5100): 0x00000000
    root@am62axx-evm:/opt/edgeai-gst-apps# devmem2 0x43c40100
    /dev/mem opened.
    Memory mapped at address 0xffffae97a000.
    Read at address  0x43C40100 (0xffffae97a100): 0x00000000
    root@am62axx-evm:/opt/edgeai-gst-apps# devmem2 0x43c40100 w 0xFACEBEEF
    /dev/mem opened.
    Memory mapped at address 0xffff9d051000.
    Read at address  0x43C40100 (0xffff9d051100): 0x00000000
    Write at address 0x43C40100 (0xffff9d051100): 0xFACEBEEF, readback 0xFACEBEEF
    root@am62axx-evm:/opt/edgeai-gst-apps# devmem2 0x43c40100
    /dev/mem opened.
    Memory mapped at address 0xffff8fbc2000.
    Read at address  0x43C40100 (0xffff8fbc2100): 0xFACEBEEF
    root@am62axx-evm:/opt/edgeai-gst-apps# devmem2 0x70000100
    /dev/mem opened.
    Memory mapped at address 0xffffbabcc000.
    Read at address  0x70000100 (0xffffbabcc100): 0xFACEBEEF
    

    避免存储器分配冲突  

    您可能不会遇到这个问题、但如果您没有正确分配存储器区域、不同的软件会写入相同的存储器区域、从而导致数据损坏。 AM64x 用户更有可能通过 OC_SRAM 运行到该情况、因为 SRAM 由 PRU 以太网使用。

    在 AM62Ax 上、似乎没有任何 Linux 驱动程序或应用程序默认获取 OC_SRAM。 您可以看到它已定义、但实际上并未使用:

    /arch/arm64/boot/dts/ti$ grep -r --include=k3-am62a* oc_sram
    k3-am62a-main.dtsi:     oc_sram: sram@70000000 {
    k3-am62a-main.dtsi:             sram = <&oc_sram>;
    
    in k3-am62a-main.dtsi:
    &cbass_main {
            oc_sram: sram@70000000 {
                    compatible = "mmio-sram";
                    reg = <0x00 0x70000000 0x00 0x10000>;
                    #address-cells = <1>;
                    #size-cells = <1>;
                    ranges = <0x0 0x00 0x70000000 0x10000>;
            };
    

    将您的线程传回另一个团队成员  

    我将把您的线程传回团队成员以执行后续调试步骤。

    此致、

    Nick