DMA 对小数据包有效吗?

Is DMA effective for small packets?

DMA芯片对5字节这样的小数据包有效吗

我正在使用 STM32 开发一个嵌入式项目,我正在使用 DMA 接收 3 字节数据包,但是当使用 DMA 传输 5 字节数据包时,我没有立即在接收端收到数据包,但是当使用正常转账,更快收到包裹

那么我们可以说DMA对小数据包无效吗?

使用DMA接收的问题是DMA传输中断发生然后DMA buffer if full and/or half-full, if received the packet doesn't fill buffer to reach the half or full - 传输阈值你不会得到一个中断来指示数据的可用性。

假设你的接收器有 6 字节的 DMA 缓冲区,并在传输一半和全部时产生一个中断,你发送一个 3 字节的数据包,你会在每个数据包结束时得到一个中断。如果您发送一个 5 字节的数据包,您将在前三个字节得到一个中断,然后接下来的两个字节将无限期地坐在缓冲区中,直到另一个字节(来自下一个数据包)到达。

因此,这实际上不是“小数据包”的问题,而是数据包与 DMA 缓冲区对齐的问题。事实上,这甚至不是“数据包”的问题——如果数据是一个流,如果数据流恰好不是 DMA 缓冲区大小的倍数,那么当数据流停止时,你最终会遇到同样的问题。

此外,即使数据包恰好是 DMA 缓冲区大小的倍数,如果您在 link 上丢失数据,您将不再与缓冲区对齐并会遇到同样的问题。

这种情况下的解决方案是在每次接收 DMA half/full 传输时设置一个计时器以用作超时。超时通常会设置为比传输一半缓冲区所花费的时间稍长的时间(假设您正在使用 half/full 传输以允许双重或“乒乓”缓冲),因此如果缓冲区 half/full 传输未实现,计时器到期,您在计时器处理程序上检索 已传输的数据。当DMAhalf/full传输中断确实发生时,需要考虑定时器中断中已经取回的数据,只取回新的数据。

因此,您将实现一个驱动程序,其中在 DMA 半传输、全传输或定时器中断中的任何一个上从缓冲区检索数据,并在定时器处理程序中维护最后一个缓冲区位置的计数或索引检索以便在半传输或完全传输中您只检索新数据。

如果您的缓冲区很长而您的数据包很小,并且数据不是流式传输,您可能会在 DMA 中断之间获得多个定时器中断。在这种情况下,您可以使超时时间小于 DMA 缓冲区填充时间。最佳解决方案可能取决于传输数据的性质和您可以承受的延迟。

如果你能维持一个字符一个中断的中断率,那么避免DMA接收数据总是会更简单,但它永远不会“无效”,只是更复杂才能正确。您的问题不是小型 DMA 传输无效,而是您的实现不是最优的。