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.

[参考译文] AM6442:AM6442 - R 内核 Rp 消息通信

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1624535/am6442-am6442--inter-r-core-rp-message-communication

器件型号: AM6442

您好、

我正在处理 AM64x (MCU+ SDK) 平台并实现内核间通信。

我跟了过去 LinuxLeft right arrowR5 零复制 RPMessage 示例 成功实现 MCU + SDK 的通信 Linux (A53) 和一个 R5 内核

此外、我还能使用 IpcNotify 以便成功进行通信 R5 内核

但是、在尝试使用时 R5 内核之间的 RPMessage 、它不起作用。

工作原理

  1. 使用 RPMessage 进行 LinuxLeft right arrowR5 通信(零复制示例) –工作。

  2. 使用 IpcNotify_sendMsg ()/ IpcNotify_registerClient () 进行 R5Left right arrowR5 通信 –工作。

哪些不起作用

两个 R5 内核之间的 RPMessage 通信

接收 R5 内核上的 RPMessage 接收回调为 未被调用

当前设置

  • 器件: AM64x

  • SDK: MCU+ SDK 感谢您的赞美... Mary

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

    您好、

    您使用哪个版本的 MCU+SDK? 另外、哪种 R5 到 R5 的通信不起作用?

    是 R5F0-0 -> R5F0-1 不工作还是 R5F0-1 -> R5F0-0?

    您能提供示例代码以复制行为吗?

    请参阅 IPC_RPMESSAGE_ECHO 

    此致、

    Tushar

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

    您好、

    我正在使用 MCU_PLUS_SDK_am64x_09_01_00_41。 我尝试了 R11 到 R01。 这些例子对我有用。 我使用了空系统工程来为整个系统构建整个工程。 根据 Li UX 零复制示例编辑了 MPU 区域和所有区域。ipc notify 正在工作。 我得到回电被邀请...但 Rpmessage 不起作用。

    谢谢

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

    您好、

    我正在使用 MCU_PLUS_SDK_am64x_09_01_00_41。 我尝试了 R11 到 R01。 这些例子对我有用。 我使用了空系统工程来为整个系统构建整个工程。 根据 Li UX 零复制示例编辑了 MPU 区域和所有区域。ipc notify 正在工作。 我得到回电被邀请...但 Rpmessage 不起作用。

    谢谢

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

    请参阅  【常见问题解答】PROCESSOR-SDK-AM64X:如何仅使用两个内核进行 IPC 通信? (例如 R5FSS0-0 和 R5FSS1-1)。 使用 RTOS 在两个内核之间实现 IPC RPMessage 通信。

    此致、

    Tushar

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

    我已将所有这些部分移至 MSRAM   在这种情况下、Linux 与之间的通信以及 R 内核之间的 IPC 通知功能正常。 但 Rcore 之间的 RpMessage 失败。 当我回到 DDR 时、Rpmessage 也起作用。 为什么会发生这种情况?

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

    您是否将 MSRAM 区域标记为缓存? 这可能是 RPMessage 不起作用的原因。

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

    您好、

    MSRAM 区域缓存在 rpmg echo 示例、echo linux 示例以及零复制示例中。无论如何、我会将其标记为非缓存、并告诉您结果。

    谢谢、

    Mary

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

    我确认、.bss.ipc_vring_mem在这两种情况下、都留在 DDR 非缓存共享区域。 只有正常的部分、如.text、、.data.bss.stack等等、才从 DDR 移动到 MSRAM。 之后,Inter-R5 RPMessage 停止工作,但 IpcNotify 仍然工作。 回到 DDR 后、RPMessage 再次工作。 这是否表明 MSRAM 本地段中存在重叠或损坏、而不是虚拟缓存问题? 将 RPMessage 本地对象/堆栈放置在 AM64x 上的共享 MSRAM 中是否存在任何已知限制?

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

    您好、

    感谢您的建议。 将 MSRAM 区域标记为 未 缓存 在 MPU(存储器保护单元)设置中、实际上解决了问题! RPMessage 初始化现在已成功完成、并且内核可以通信。  诸如.text.data、、.bss.stack等的部分已移至 MSRAM。

    为什么在示例中将其标记为缓存?

    这一变化将如何影响整个系统?

    谢谢您、

    Mary

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

     内核之间共享的区域应标记为非缓存、以防止所有写入命中实际物理存储器、其他内核可以访问这些数据。

    为什么在示例中将其标记为缓存?

    在默认示例中、这些区域可能不会在内核之间共享。

    此致、

    Tushar

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

    您好、

    我还有一些与 AM64x 上 R5 内核之间的 RPMessage 相关的问题。

    我的共享区域包括:

    USER_SHM_MEM        :origin = 0xA5000000、长度= 0x80
    Log_SHM_MEM        : origin = 0xA5000080、长度= 0x3F80
    RTOS_NORTOS_IPC_SHM_MEM :origin = 0xA5004000、长度= 0xC000

    该部分.bss.ipc_vring_mem放置在中RTOS_NORTOS_IPC_SHM_MEM、因此 RPMessage 共享/VRING 内存保留在 DDR 中。

    从 MCU+ SDK RPMessage 文档中、我知道对于 RTOS/NORTOS 对等器件、VRING 共享内存可以放置在 DDR 或内部存储器中、但对于所有参与NOLOAD的 CPU、它必须位于相同的地址、并且必须标记为非缓存。

    我比较了两个工作示例:

    1. R 内核之间的 RPMessage 回波示例

      • MSRAM 中的共享存储器

      • MSRAM 中的代码/ rodata

      • MSRAM 中的数据/BSS/堆栈

      • MSRAM 中与 init/exception 相关的段

      • 标记为非缓存的共享 MSRAM 部分

    2. RPMessage echo Linux 示例

      • DDR 中的共享存储器

      • DDR 中的代码/rodata

      • DDR 中的数据/BSS/堆栈

      • DDR 中与 INIT_/异常相关的段

    然后我尝试了:

    • 与 Linux RPMessage 示例中的完全相同、在 DDR 中保留共享 IPC 存储器

    • 将以下局部部分移至 MSRAM:

      • 代码和只读数据

      • 数据段

      • BSS/存储器段

      • 程序栈段

      • 初始化/异常处理段

    观察到的行为:

    • 当标记用于这些局部段的 MSRAM 区域时 非缓存 、R 核心之间的 RPMessage 可行

    • 当标记了相同的 MSRAM 区域时 已缓存 、R 核心之间的 RPMessage 失败

    我的问题是:

    1. 如果.bss.ipc_vring_mem保留在 DDR 中、为什么要进行 本地 MSRAM 区域 缓存/非缓存会影响 R 内核之间的 RPMessage?

    2. 在纯 R 内核 RPMessage 示例中、只有共享的 MSRAM 部分没有被缓存、并且是有效的。 为什么我的情况似乎要求更大的 MSRAM 区域不进行缓存、即使 MSRAM 中没有放置共享 IPC 区域?

    3. 是否有任何 RPMessage 本地状态、控制结构或外部传输元数据.bss.ipc_vring_mem也需要位于非缓存区域?

    4. 使更大的 MSRAM 区域不缓存成为正确的解决方案、还是不必要地影响性能?

    5. 对于这种混合情况、是否有建议的存储器放置方式:

      • MSRAM 中的本地代码/数据

      • DDR 中的 RPMessage 共享存储器

    任何澄清都会很有帮助。

    谢谢、
    Mary

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果.bss.ipc_vring_mem仍在 DDR 中、为什么要进行 本地 MSRAM 区域 缓存/非缓存影响 R 内核之间的 RPMessage?

    理想情况下、如果共享存储器或.bss.ipc_vring_mem 是 DDR、标记为非高速缓存且参与 IPC 的所有内核具有相同地址、则它不应影响 RPMessage 机制。

    在纯 R 内核 RPMessage 示例中、只有共享的 MSRAM 部分没有缓存、并且是有效的。 为什么我的情况似乎要求更大的 MSRAM 区域不进行缓存、即使 MSRAM 中没有放置共享 IPC 区域?

    这需要在您这边进一步调试 IPC 从哪个 API 调用失败?

    将使更大的 MSRAM 区域不缓存为正确的解决方案、或者这会不必要地影响性能?

    是的、它会影响性能。

    [引述 userid=“649919" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1624535/am6442-am6442--inter-r-core-rp-message-communication/6264586

    对于这种混合情况、是否有建议的存储器放置方式:

    • MSRAM 中的本地代码/数据

    • DDR 中的 RPMessage 共享存储器

    [/报价]

    共享存储器应为非缓存存储器、应可由参与 IPC 的内核进行访问。

    BR、

    Tushar