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.
您好、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/)
此致、
纪尧姆
纪尧姆、您好!
我要将您的主题传递给另一位能够从 MCU+方面帮助进行更多调试的团队成员。
调试 IPC RPMSg 行为
1) 1)您正在使用哪个版本的 MCU+ SDK?
2)运行 Linux 的 RPMsg 一次只能发送496个字节的数据。 您试图在操作系统之间传输的以太网帧有多大?
零占空比可能是一个潜在的解决方案吗?
通过设置共享存储区、您可以按 RPMSg 通知发送更多的数据。 例如、如果发送1500字节的帧、则可以发送一个 RPMsg 而不是4个 RPMsg 消息。 或者、如果吞吐量对用例的重要性高于延迟、则可以将多个以太网帧聚合到共享存储器区域中、然后只需每10个帧(或类似的数据帧)发送一个 RPMsg。 在这种设计中、乒乓缓冲方案非常容易实现。
此致、
尼克
您好、Nick、
对不起,我忘记了我的基本要求:/
-您正在使用哪个版本的 MCU+ SDK ?
我使用的是 SDK 8.06。 我查看了最后一个版本(09.01)、但 版本说明未提及 IPC 上的任何修复、并且代码几乎相同。 只添加了 IPCSafe 机制、但我认为使用 IPCSafe 会遇到最糟糕的情况:可在 ISR 中直接管理 IPCSafe 的 CRC、这会进一步减慢 IPC 通知流程。
-您试图在操作系统之间传输的以太网帧有多大?
我知道这一限制、并将 MTU 定义为300字节(对于我的应用来说是可以的)。 我不是在寻找性能、低速流量应该通过 IPC、但可靠性更重要。 通常、文件传输可以通过 IPC 进行、但文件传输速度不重要。
- 零占空比可能是一个潜在的解决方案吗?
我观察到的问题是 Linux 发送一组突发的消息。 将帧分离到更多的部分会增加 IPC 突发。
我记下了您的第二个解决方案、但不同。 我不能在发送通知之前等待 n 帧、因为我不知道堆栈将要发送多少帧。
相反、当需要第一次传输时、我可以等待1ms、并在1ms 的延迟后通过 IPC 进行通知。 同时、我可以复制共享存储器中的帧。 我需要调整这个1ms 的大小、使其小于以太网控制器的传输缓冲区。
我不是内核驱动程序专家、内核空间中的共享内存对我来说是一项新功能
谢谢!
此致、
纪尧姆
纪尧姆、您好!
您好、Nick、
这看起来也是我们过去发现的一个问题。 由于没有缓冲区、ISR 持续触发、但是应用程序不能释放任何缓冲区、这是因为它不能优先于 IRQ。
我们"修复了"、通过为受影响的远程内核禁用 IpcNotify IRQ 并返回允许应用程序处理收到的消息。 稍后、我们会在释放缓冲区后重新启用 IRQ。
这"对我们有用"、但不确定这是否考虑到了所有可能的代码路径。
此致、
多米尼克
您好、Dominic:
感谢您的反馈。 我与您完全吻合。
我做了同样的修改,但正如你所说:它是有效的,但不相信它是否是稳健的所有场景:/
这就是此帖子的目的:确认问题并在下一个版本中请求正确的修复。
此致、
纪尧姆