Operating system DMA对小数据包有效吗?

Operating system DMA对小数据包有效吗?,operating-system,embedded,stm32,dma,Operating System,Embedded,Stm32,Dma,DMA芯片对5字节这样的小数据包有效吗 我正在使用STM32进行一个嵌入式项目,我使用DMA接收3字节的数据包,但当使用DMA传输5字节的数据包时,我不会立即在接收端获得数据包,但使用正常传输时,我更快地获得数据包 那么,我们可以说DMA对小数据包无效吗?使用DMA进行接收的问题是,DMA传输中断发生,如果DMA缓冲区已满和/或半满,如果收到的数据包没有填满缓冲区,达到一半或全部传输阈值,您将不会得到指示数据可用性的中断 假设你的接收器有6字节的DMA缓冲区,在半传输和全传输时产生一个中断,你发

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

我正在使用STM32进行一个嵌入式项目,我使用DMA接收3字节的数据包,但当使用DMA传输5字节的数据包时,我不会立即在接收端获得数据包,但使用正常传输时,我更快地获得数据包


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

使用DMA进行接收的问题是,DMA传输中断发生,如果DMA缓冲区已满和/或半满,如果收到的数据包没有填满缓冲区,达到一半或全部传输阈值,您将不会得到指示数据可用性的中断

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

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

此外,即使数据包是DMA缓冲区大小的精确倍数,如果您在链路上丢失数据,您将不再与缓冲区对齐,并将遇到相同的问题

在这种情况下,解决方案是在每次接收DMA半/全传输时设置一个计时器作为超时。超时时间通常会设置为略大于传输一半缓冲区所需的时间(假设您使用半/全传输来允许双缓冲或“乒乓”缓冲),因此如果未实现缓冲区半/全传输,计时器过期,在计时器处理程序上检索已传输的数据。当DMA半/全传输中断确实发生时,您需要说明已经在定时器中断中检索到的数据,并且只检索新数据

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

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


如果您可以维持每个字符一个中断的中断率,那么避免接收数据时使用DMA总是比较简单,但它永远不会“无效”,只是要正确处理会更加复杂。这里的问题不在于小型DMA传输无效,而在于您的实现是次优的。

使用DMA进行接收的问题在于,DMA传输中断发生,然后DMA缓冲区(如果已满和/或半满),如果收到的数据包没有填满缓冲区,达到一半或全部传输阈值,您将不会得到指示数据可用性的中断

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

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

此外,即使数据包是DMA缓冲区大小的精确倍数,如果您在链路上丢失数据,您将不再与缓冲区对齐,并将遇到相同的问题

在这种情况下,解决方案是在每次接收DMA半/全传输时设置一个计时器作为超时。超时时间通常会设置为略大于传输一半缓冲区所需的时间(假设您使用半/全传输来允许双缓冲或“乒乓”缓冲),因此如果未实现缓冲区半/全传输,计时器过期,在计时器处理程序上检索已传输的数据。当DMA半/全传输中断确实发生时,您需要说明已经在定时器中断中检索到的数据,并且只检索新数据

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

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

如果您可以维持每个字符一个中断的中断率,那么避免接收数据时使用DMA总是比较简单,但它永远不会“无效”,只是要正确处理会更加复杂。这里的问题不在于小型DMA传输是无效的,而在于它是无效的