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.

[参考译文] SK-AM64B:RPC 通信永远等待

Guru**** 2475260 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1463022/sk-am64b-rpc-communication-waits-forever

器件型号:SK-AM64B

工具与软件:

您好!

我要从 Linux 引导并使用远程过程调用启动 r5f、
我在 A53上运行的应用通过 RPMessages 与其中一个 R5f 控制器进行通信

我使用 recvCallback 函数从 Linux 接收 IPC 消息、而我将从 R5f 以非中断控制的方式通过 noRTOS 向 Linux 发送一条消息。
当在 R5f 上执行函数"RPMessage_send (...、timeout)"时、即使超时值仍然存在这个函数从不返回的可能性。
被调用的 IpcNotify_sendMsg()函数可能不会耗尽并将永远等待。
由于我的版本中没有"waitForFifoNotFull"不等于1的 IpcNotify_sendMsg ()函数调用、这种行为是否有意发生、或者是否有权变措施?

我使用的是版本09.00.00.35中的 MCU_SDK。

```μ A

Status = RPMessage_send ((void *)&gSendrpmsg、sizeof (gSendrpmsg)、gCurrentRemoteCoreId、gCurrentEndPt、RPMessage_getLocalEndPt (&gIpcRecvMsgObject[1])、100u);

```μ A

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

    您好、检查完代码后、在我看来您是正确的。

    总结:
    函数 IpcNotify_sendMsg()用于通过邮箱向远程内核发送消息。
    • 它检查 (IpcNotify_mailboxIsFull()) FIFO 是否已满、并在必要时等待。
      • 如果 FIFO 未满、我们将编写消息
      • 如果 FIFO 已满且  设置了"waitForFifoNotFull"(1)、请在再次禁用中断之前短暂重新启用中断以允许进行其他操作、并保持等待
      • 如果 未设置"waitForFifoNotFull"(0)且 FIFO 已满、则它将状态设置为 "SystemP_TIMEOUT"

    如果我在您的应用程序中正确理解了您、则始终使用 IpcNotifoNotFull=1中的 IpcNotify_sendMsg()  。 您是否可以使用 waitForFifoNotFull=0? 如果不是,一个潜在的改进是在 IpcNotify_sendMsg ()内添加一个超时机制,类似下面的行  

    uint32_t timeoutCounter = 1000//超时计数器值示例
    应执行的操作
        {
          isFull = IpcNotify_mailboxIsFull (mailboxBaseAddr、hwFifoId);
          if ((isFull!=(uint32_t) SystemP_Success)&&(waitForFifoNotFull!= 0U))
          {
            /*允许中断启用并再次检查*/
            HWIP_RESTORE (oldIntState);
            oldIntState = hwiP_disable ();
            超时计数器--
          }
        } while ((isFull!=(uint32_t) SystemP_Success)&&(waitForFifoNotFull!= 0U)&&(timeoutCounter > 0U);
    注意:以上代码尚未经过测试、只是一个示例  
    谢谢!
    Paula.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Paula、你是对的。

    我尝试使用最高层的抽象并使用 IpcNotify_sendMsg ()函数、该函数总是设置 waitForFifoNotFull=1。

    如果没有其他选项,我将写我自己的 IpcNotify_sendMsg ()函数与你的想法。

    非常感谢

    Marcel