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.

[参考译文] J721EXSOMXEVM:IPC 同步 MCU2_0 到 MCU2_1

Guru**** 2419530 points
Other Parts Discussed in Thread: J721EXSOMXEVM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1535484/j721exsomxevm-ipc-synchronization-mcu2_0-to-mcu2_1

器件型号:J721EXSOMXEVM


工具/软件:

我在使 IPC 在两个 R5 内核(使用 J721EXSOMXEVM)和 FreeRTOS 上使用 IPC 的载板之间始终如一地工作时遇到问题。   

我确实让 IPC 回声测试 FreeRTOS 正常工作、但由于它支持的所有不同处理器和电路板、使用时很复杂。

但是、我将它用作一个更简单的应用的示例、我想证明这一点。

MCU2_0 包含它要发送到 MCU2_1 的数据、MCU2_1 将接收这些数据。 但是、这并不能始终如一地工作、具体取决于两个处理器的启动方式。 因此、 我进行了一些搜索、并发现以下论坛讨论似乎是相关的:

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/917749/tda4vmxevm-ipc-lld-sequence/3440000#3440000

所以我实现了一个方法/函数,试图做什么是在该“解决方案“中概述  

因此、我的每个处理器都在一项任务中实现了一项功能、该任务会执行以下操作:

 -初始化所有 IPC 内容 (ipc_init、VirtIO、RPMessage_init )

- 调用一个 RPMessage_create 获取一个句柄和我的端点

- RPMessage_annouce 通用服务名称

- RPMessage_getRemoteEndPt

- RPMessage_send 一个虚拟消息(“ TestX 其中 X 是源处理器编号)

- rpmessage_recv 虚拟消息。

但是、这种同步对我来说不起作用。  我必须首先启动 MCU2_1 处理器、甚至才能越过通知并接收消息发送和接收。 然后 MPU2_1 获取已发送的消息、但 MPU2_0 绝不会获取 MPU2_1 的已发送消息。

如果我首先启动 MCU2_0、那么我永远不会得到其中任何一个的通知。   

这种 IPC 必须启动的顺序和时序对我来说毫无意义。

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

    您好:

    [报价 userid=“620214" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1535484/j721exsomxevm-ipc-synchronization-mcu2_0-to-mcu2_1

    我确实让 IPC 回声测试 FreeRTOS 正常工作、但由于它支持的所有不同处理器和电路板、使用时很复杂。

    但是、我将它用作一个更简单的应用的示例、我想证明这一点。

    [/报价]

    IPC_ECHO_TEST 是 IPC 中非常基本的示例应用。 如果您不希望与所有内核进行通信、那么您只能保留所需的远程 proc。

    [报价 userid=“620214" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1535484/j721exsomxevm-ipc-synchronization-mcu2_0-to-mcu2_1

    因此、我的每个处理器都在一项任务中实现了一项功能、该任务会执行以下操作:

     -初始化所有 IPC 内容 (ipc_init、VirtIO、RPMessage_init )

    - 调用一个 RPMessage_create 获取一个句柄和我的端点

    - RPMessage_annouce 通用服务名称

    - RPMessage_getRemoteEndPt

    - RPMessage_send 一个虚拟消息(“ TestX 其中 X 是源处理器编号)

    - rpmessage_recv 虚拟消息。

    [/报价]

    这与我们在 IPC 回波测试中所做的相同。

    Rp Message_Announce、根据需要向所有内核或相应内核发出消息。

    到调用 RP Message_Announce 时、另一个内核必须准备好接收消息、否则我们可能会丢失消息。如果您从 MCU2_1 发出通知、则确保 MCU2_0 在 MCU2_1 之前准备就绪、这很简单。

    如果您信标使用 FreeRTOS 任务看起来很复杂、您可以继续使用 ipc_testsetup_bareMetal.c 示例。

    此致

    Tarun Mukesh

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

    Tarun、

    感谢您的答复。  

    请注意、我们不是初学者的嵌入式编程器、并且在 RTOS、裸机、多线程应用程序、低级驱动程序等方面具有丰富的经验  但是、我们对 TI 平台和工作方式不熟悉、在您投入时、我们正在努力了解一些“基本“内容。

    值得一提的是、由于我们正在运行 2 个 RTOS 内核、我们使用的不是 Linux 来运行应用、而是 JTAG。  使用 CCS UI 启动两个内核很难获得一致的启动时序。 也许我应该使用脚本来启动它们?

    ipc_echo_test 是 IPC 中非常基本的示例应用。 如果您不希望与所有内核进行通信、则只能保留所需的远程 proc。

    是的、我们已经这样做了、并将这些示例用作教育经验、以了解 IPC 应该如何工作。 不过,值得一提的是,即使是基本的例子也只适用于我们,如果我们在“发布“模式下构建和运行它们。 如果在“调试“模式下编译并运行、则它们不会始终正常工作。 因此,我们的教训是,有一些时间或其他原则正在进行。 在得到非常基本的工作示例后、我们使用该模板、使用 MCU2_0 和 MCU2_1 编写自己的 IPC 应用程序、并尝试遵循相同的原理。 当我们的应用程序没有按预期运行时,在尝试不成功地对其进行故障排除后,我们联系了这里,到论坛,寻求一些帮助。

    在 Message_Announce 调用另一个内核时、必须确定接收消息、否则我们可能会丢失消息。如果您从 MCU2_1 宣布、则确保 MCU2_0 在 MCU2_1 之前准备就绪、这很简单。

    我确实明白、在 IPC 向另一个发出通知之前、处理器必须在一定程度上处于“正常“状态。  虽然这本身不是一个明显的事实,但我们从论坛的帖子和经验中学到了一些东西。 但是、“上升“或“就绪“是什么意思? 已上电并开始运行、是否调用 IPC_Init 函数?  我认为,如果你能更简洁地定义“起来“,这将是有用的。  

    如果我们的应用程序有两个内核、则表明每个处理器需要处于哪种“开启“状态? 我引用的论坛帖子提到,RPMessage_init() 必须在另一个处理器上宣布之前在接收处理器上调用,否则它将无法获得宣布。 这是真的吗?

     最后,我们的应用程序有时成功地宣布了以太网并在每个处理器上收到了公告,但随后,大约一半的时间,发送虚拟消息给以太网的下一步已经导致一个接收到消息,另一个从未收到消息。 我曾希望、一旦他们协调起来、发送信息就会起作用。

    我不希望任何人调试我们的代码或执行此类操作。 我只需要一些想法、要查看的内容、有关 IPC 时序或功能的信息、我可能会遗漏这些信息。

    谢谢你。

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

    您好:

    确定的。很高兴知道你的细节。

    让我细分您的疑问并逐一回答。

    值得一提的是、由于我们运行 2 个 RTOS 内核、我们不使用 Linux 运行应用、而是使用 JTAG。  使用 CCS UI 启动两个内核很难获得一致的启动时序。 也许我应该使用脚本启动它们?

    如果您要一次启动 2 个内核、请在 CCS 中选择您的案例中的 MCU2_0 和 MCU2_1 这两个内核并将它们设为一个组。

    无需额外的脚本。 如果您运行组、则两个内核将同时启动。

    我确实明白、在 IPC 向另一个处理器发出通知之前、处理器必须在一定程度上处于“最新“状态。  虽然这本身不是一个明显的事实,但我们从论坛的帖子和经验中学到了一些东西。 但是、“上升“或“就绪“是什么意思? 已上电并开始运行、是否调用 IPC_Init 函数?  我认为,如果你能更简洁地定义“起来“,这将是有用的。  [/报价]

    就绪  表示、已有内核正在运行、IPC 初始化已完成。

    如果我们的应用有两个内核、则宣布每个处理器需要处于哪种“向上“状态? 我引用的论坛帖子提到,RPMessage_init() 必须在另一个处理器上宣布之前在接收处理器上调用,否则它将无法获得宣布。 这是真的吗?

    如果两个内核都在执行 Message_Announce、那么您始终可以使用 RPMessage_getRemoteEndPt 作为一个内核上的阻塞调用。

    此外,根据来自 RP, Message_Announce 的状态,如果它在早期的情况下失败,你可以重新宣布。

     最后,我们的应用有时成功地宣布给以太网并在每个处理器上收到通知,但大约一半的时间,下一步发送虚拟消息给以太网导致一个接收消息,另一个从未收到消息。 我曾希望,一旦他们同步,消息的发送只会起作用。

    如果通知成功并且收到其他消息、则终点详细信息意味着同步已发生。 除非另一个内核关断或中止或进入异常模式、否则发送和接收应该会顺利进行。

    我们有 512*256 的缓冲区限制, 496 字节的数据进入 256 个缓冲区。如果你继续发送的数据超过这个,而其他内核没有读取,那么我们可能会丢失消息,但任何低于这个应该不是问题。

    参考资料:https://dev.ti.com/tirex/explore/content/tda4vm_academy_1_01_00_00/_build_tda4vm_academy_1_01_00_00/_downloads/29e369bee60741ce211f389f47fb9bd4/IPC-training.pdf

    感谢您的理解。

    此致

    Tarun Mukesh

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

    Tarun、

    这是有用信息。  尤其是能够对 CPU 进行分组并同时启动它们。

    我正在学习 IPC 回波测试示例、以便我们可以使用该示例、并逐步将其更改为应用所需的形式。  如果遇到麻烦、我会让您知道。

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

    您好、

    谢谢。

    如果您遇到任何问题、请务必告诉我。

    此致

    Tarun Mukesh