Embedded DMA控制器如何处理诸如串行端口之类的输入设备

Embedded DMA控制器如何处理诸如串行端口之类的输入设备,embedded,dma,Embedded,Dma,到目前为止,我学到的是,每当需要从硬盘传输数据时,CPU都会将源地址、目标地址、字数和方向编程到DMA控制器。但在本例中,硬盘驱动器只是一个哑设备,因此它是有意义的,因为硬盘驱动器永远无法启动数据传输 但是,如果我们连接了串行端口,在某些情况下,我们将获得8位数据。我知道DMA控制器用于大内存传输,但我想对这8位进行DMA。但是CPU上的设备驱动程序无法判断数据何时到达,也无法判断有多少数据到达,因为串行端口可能发送8位或16位数据,或者根本没有数据。因此,在这种情况下,谁填充DMA控制器的计数

到目前为止,我学到的是,每当需要从硬盘传输数据时,CPU都会将源地址、目标地址、字数和方向编程到DMA控制器。但在本例中,硬盘驱动器只是一个哑设备,因此它是有意义的,因为硬盘驱动器永远无法启动数据传输

但是,如果我们连接了串行端口,在某些情况下,我们将获得8位数据。我知道DMA控制器用于大内存传输,但我想对这8位进行DMA。但是CPU上的设备驱动程序无法判断数据何时到达,也无法判断有多少数据到达,因为串行端口可能发送8位或16位数据,或者根本没有数据。因此,在这种情况下,谁填充DMA控制器的计数和内存地址,因为数据何时进入,设备驱动程序是完全未知的

当传入数据不是连续流或固定长度的数据包时,使用DMA串行输入很复杂。具体细节将取决于特定的UART和DMA控制器,但通常情况下,到达的每个字符都将复制到提供的DMA缓冲区中的下一个位置,并且当缓冲区半满和完全满时,DMA控制器将生成一个中断

单字节DMA缓冲区在使用UART的数据可用中断时没有什么作用,只会将字节处理延迟一个字符周期

如果DMA缓冲区有两个字符长,那么每个字符都会有一个中断(一个用于半传输,一个用于全传输),这解决了部分填充的缓冲区不能被服务的问题,但根本不会减少中断开销,因此与直接UART中断处理相比,没有什么优势。如果您的UART包含FIFO缓冲区,那么当只需要少量缓冲时,这将是处理异步串行输入的更好方法

当使用较大的DMA缓冲区时,中断率会降低,但当缓冲区不完整时,您将不会得到中断,数据可能会无限期等待。该问题的一个解决方案是实现超时机制,如果DMA中断没有在波特率和缓冲区长度确定的时间段内到达,则超时处理程序检索当前缓冲的所有数据。这种机制需要小心避免超时和DMA中断之间的竞争条件,并确保在处理超时时到达的数据不会丢失,或者,当DMA中断最终到达时,超时检索的数据不会重复。

当传入数据不是连续流或固定长度的数据包时,使用DMA串行输入是复杂的。具体细节将取决于特定的UART和DMA控制器,但通常情况下,到达的每个字符都将复制到提供的DMA缓冲区中的下一个位置,并且当缓冲区半满和完全满时,DMA控制器将生成一个中断

单字节DMA缓冲区在使用UART的数据可用中断时没有什么作用,只会将字节处理延迟一个字符周期

如果DMA缓冲区有两个字符长,那么每个字符都会有一个中断(一个用于半传输,一个用于全传输),这解决了部分填充的缓冲区不能被服务的问题,但根本不会减少中断开销,因此与直接UART中断处理相比,没有什么优势。如果您的UART包含FIFO缓冲区,那么当只需要少量缓冲时,这将是处理异步串行输入的更好方法


当使用较大的DMA缓冲区时,中断率会降低,但当缓冲区不完整时,您将不会得到中断,数据可能会无限期等待。该问题的一个解决方案是实现超时机制,如果DMA中断没有在波特率和缓冲区长度确定的时间段内到达,则超时处理程序检索当前缓冲的所有数据。这种机制需要小心避免超时和DMA中断之间的竞争条件,并确保在处理超时时到达的数据不会丢失,或者在DMA中断最终到达时,超时检索的数据不会重复。

谢谢!很好的解释。@JigarAgrawal:不客气,但我建议你-特别是“我什么时候不应该发表评论?”。如果答案很好,请投票并/或接受它。谢谢!很好的解释。@JigarAgrawal:不客气,但我建议你-特别是“我什么时候不应该发表评论?”。如果答案很好,请投票表决并/或接受它。“这是有意义的,因为硬盘驱动器永远无法启动数据传输”——一般来说,许多外围设备都是如此。来自HDD的输入是请求输入;CPU从设备请求数据。来自通信设备的输入可以是非请求的;未明确请求数据到达,但必须读取设备以防止数据溢出。“但CPU上的设备驱动程序无法判断数据何时到来”——中断通知CPU(或与DMA控制器握手)数据可用。“这是有意义的,因为硬盘驱动器永远无法启动数据传输”——一般来说,许多外围设备都是如此。来自HDD的输入是请求输入;CPU从设备请求数据。来自通信设备的输入可以是非请求的;未明确请求数据到达,但必须读取设备以防止数据溢出。“但CPU上的设备驱动程序无法判断数据何时到来”——中断通知CPU(或与DMA控制器握手)数据可用。