您好、TI!
我正在尝试实现内核驱动程序和 R5固件之间的交换以在以太网上发送帧(由 R5内核管理)。 在从内核驱动程序到 R5内核的突发消息之前、该实现正常运行。

我会观察到、R5内核在无限循环中被阻止、管理代码中以下特定行的 IPC 通知:

在几次反表情后,这是我的理解问题:
-为什么可能是原因?
我认为原因是因为 Linux 中的大量消息足以填满所有 vring 缓冲区。 Linux 比 R5获得缓冲区的速度快到足以填充 vring 缓冲区。
由于 VRING 缓冲区太小、无法吸收 Linux 发出的突发脉冲、所以我将丢失数据包=>好的、这是一个限制、但它不会导致在 ISR 中运行的无限循环中锁定 R5固件
-为什么 R5在这个 infirnite 循环堵塞?
这是一个很棘手的部分、但基本而言、我了解这样的代码:
-在 ISR 中:
--获取 邮箱消息( IpcNotify_ISR)
--检查 vring 中是否有内容( RPMessage_notifyCallback->RPMessage_vringIsFullRxBuf )
--处理消息(RPMMessage_recvHandler)
分配新消息-->失败!
--再次检查是否有任何东西在 vring
--分配新消息 -->失败!
--再次检查是否有任何东西在 vring
--分配新消息 -->失败!
由此、我了解在分配 新消息的期间没有可用的缓冲区。 缓冲区的释放是在一个任务中完成的、该任务由于在短时间内接收到过多的消息而从未被调用、并且在 ISR 中进行处理。
-问题:
您能否确认此类行为?
你有什么建议,以避免这种麻烦?
=>我看到在其他文章的实现"零倍频"在 R5和用户空间。 但我不确定这是否能解决问题、因为 RPMsg 仍用于管理通知。 (https://git.ti.com/cgit/rpmsg/rpmsg_char_zerocopy/)
此致、
纪尧姆