基于DMA的数据传输方法
技术领域
本发明涉及一种数据传输方法,尤其涉及一种基于DMA的数据传输方法。
背景技术
DMA(Direct Memory Access,直接内存存取)是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依于CPU的大量中断负载。
DMA传输将数据从一个地址空间复制到另外一个地址空间。当CPU初始化这个传输动作时,传输动作本身是由DMA控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区,像是这样的操作并没有让处理器工作拖延,反而可以被重新调度去处理其他的工作。
在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。
传统的DMA数据传输必须经过如下4个步骤:DMA请求:CPU对DMA控制器初始化,并向I/O接口发出操作命令,I/O接口提出DMA请求;DMA响应:DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求;DMA传输:DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输;DMA结束。当完成规定的成批数据传送后,DMA控制器即释放总线控制权,并向I/O接口发出结束信号。
现有CPU通过DMA发送数据过程如图1所示,接收数据过程如图2所示。虽然数据传输过程中,CPU可以被解放出来去做其他的事情,但是整个交互过程还是涉及到CPU中断,DMA请求交互。对于大量数据传输,需要高的数据传输效率,而中断和交互就是性能的瓶颈。
发明内容
本发明所要解决的技术问题是提供一种基于DMA的数据传输方法,能够大大降低中断交互造成的效率低下,避免传统DMA数据传输过程中由于频繁的交互导致性能下降的现象。
本发明为解决上述技术问题而采用的技术方案是提供一种基于DMA的数据传输方法,包括如下步骤:a)初始化外部设备,并为每个外部设备设置DMA操作缓冲区后开启DMA控制器;b)所述每个外部设备通过DMA控制器将数据传送到各自的DMA操作缓冲区;c)应用程序采用定期轮询方式获取各个外部设备对应DMA操作缓冲区中的数据。
上述的基于DMA的数据传输方法,其中,所述步骤a)中设置DMA操作缓冲区包括设置存放数据的物理内存起始地址、数据缓冲区长度以及指示当前数据存储位置相对起始地址的地址偏移值。
上述的基于DMA的数据传输方法,其中,所述外部设备在DMA操作缓冲区写入数据完成后再更新地址偏移值,所述应用程序预先存储各个外部设备DMA操作缓冲区的地址偏移值,并在定期轮询时根据地址偏移值的变化判断是否有可用数据。
上述的基于DMA的数据传输方法,其中,所述DMA操作缓冲区为环形数据缓冲区,当数据写入地址到达环形数据缓冲区边界时,若无剩余数据,则设置地址偏移值为0,若有剩余数据,则所述剩余数据开始从头写入,并设置地址偏移值为剩余数据的长度。
上述的基于DMA的数据传输方法,其中,所述步骤b)的具体过程如下:b10)所述外部设备缓冲区中有待写数据时,根据配置信息获取物理内存起始地址以及当前偏移地址值,并计算出待写数据地址;b20)判断待写数据是否能完全写入,若是,根据所述待写地址将所述待写数据写入所述DMA操作缓冲区,当前偏移地址值增加待写数据的长度,并且如果新的当前偏移地址值等于所述数据缓冲区的长度,将当前偏移地址值设置为0;若否,根据所述待写地址将所述待写数据写入并将所述剩余数据开始从头写入DMA操作缓冲区,并设置地址偏移值为剩余数据的长度。
上述的基于DMA的数据传输方法,其中,所述步骤b20)中每次写入所述DMA操作缓冲区后,根据新的当前偏移地址值以及物理内存起始地址计算出下次待写入数据地址并保存于配置信息中;所述步骤b10)中的待写数据地址为上次写入数据时更新保存于配置信息中的数据地址。
上述的基于DMA的数据传输方法,其中,所述步骤c)具体为:应用程序定期轮询时,若发现该外部设备对应的DMA操作缓冲区地址偏移值和预存的地址偏移值不同,则获取所述预存地址偏移值处的数据并将所述预存地址偏移值更新为DMA操作缓冲区的地址偏移值。
上述的基于DMA的数据传输方法,其中,所述外部设备与应用程序之间传输定长数据,定长数据的长度为L,所述数据缓冲区的长度为定长数据的长度的整数倍,所述步骤b20)为根据所述待写地址将所述定长数据写入所述DMA操作缓冲区,当前偏移地址值增加L。
上述的基于DMA的数据传输方法,其中,所述外部设备和应用程序之间传输变长数据,所述变长数据包括数据字头和数据内容,所述数据字头包括数据总长度和位置格式配置信息,所述步骤b20)为根据所述待写地址将所述变长数据写入所述DMA操作缓冲区,当前偏移地址值增加所述变长数据的总长度。
上述的基于DMA的数据传输方法,其中,所述应用程序获取所述预存地址偏移值处的变长数据后根据数据字头中的位置格式配置信息解析变长数据的内容。
为了解决上述问题,本发明还提供了一种基于DMA的数据传输方法,包括如下步骤:d)初始化外部设备,并为每个外部设备设置DMA操作缓冲区后开启DMA控制器,所述设置DMA操作缓冲区包括设置存放数据的物理内存起始地址、数据缓冲区长度以及指示当前数据存储位置相对起始地址的地址偏移值;e)将应用程序中的数据传送到待写入数据的外部设备DMA操作缓冲区;f)所述外部设备定期轮询所述对应的DMA操作缓冲区的地址偏移值,如果新获取的地址偏移值与预存的地址偏移值不同,则所述外部设备通过所述DMA控制器获取所述DMA操作缓冲区中的数据。
为了解决上述问题,本发明还提供了一种基于DMA的数据传输方法,包括如下步骤:g)初始化外部设备,并为每个外部设备设置DMA操作缓冲区后开启DMA控制器,所述设置DMA操作缓冲区包括设置存放数据的物理内存起始地址、数据缓冲区长度以及指示当前数据存储位置相对起始地址的地址偏移值;h)将应用程序中的数据传送到待写入数据的外部设备DMA操作缓冲区,并发送指令至所述待写入数据的外部设备中的寄存器;i)所述外部设备被所述寄存器触发之后,通过DMA控制器获取所述DMA操作缓冲区中的数据。
本发明对比现有技术有如下的有益效果:本发明提供的基于DMA的数据传输方法,完全由外部设备自动判断是否进行DMA传输,CPU仅需要查询是否有可用数据即可,从而避免了传统DMA数据传输过程中由于频繁的交互导致性能下降的现象,避免了中断交互造成的效率低下,提高了数据传输效率和性能。
附图说明
图1为现有CPU通过DMA发送数据流程示意图;
图2为现有CPU通过DMA接收数据流程示意图;
图3为本发明基于DMA的数据传输流程示意图;
图4为本发明实施例中基于DMA的定长数据交互示意图;
图5为本发明实施例中基于DMA的定长数据发送的流程示意图;
图6为本发明实施例中基于DMA的定长数据接收的流程示意图;
图7为本发明实施例中基于DMA的变长数据交互示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的描述。
图3为本发明基于DMA的数据传输流程示意图。
请参见图3,本发明提供的基于DMA的数据传输方法包括如下步骤:
步骤S1:初始化外部设备,并为每个外部设备设置DMA操作缓冲区(ring buffer)后开启DMA控制器;初始化设备的信息包括:用于DMA操作过程中存放数据的物理内存起始地址DATA_BUFFER_START_ADDRESS、数据缓冲区长度DATA_BUFFER_LENGTH以及用于指明设备已经写入到DMA操作缓冲区中数据相对于DATA_BUFFER_START_ADDRESS的地址偏移值DATA_OFFSET_ADDRESS。初始化设备完成后开启DMA控制器。接下来,在后续DMA数据传输过程中不再涉及CPU与DMA控制器之间的相互交互。
步骤S2:每个外部设备通过DMA控制器将设备缓冲区FIFO数据按照配置信息自动传送到各自的DMA操作缓冲区;每次外部设备缓冲区中有待写数据时,根据配置信息获取物理内存起始地址以及当前偏移地址值,并计算出待写数据地址。为了便于下次写入数据,外部设备每次写入所述DMA操作缓冲区后,可以先根据新的当前偏移地址值以及物理内存起始地址自动计算出下次待写入数据地址并保存于配置信息中。下次有待写数据时,待写数据地址可以直接从配置信息中获取。DMA传输的数据可以分为定长和变长,定长数据接收和传输过程相对简单,只需要一次定位就可以获得数据,而变长数据接收和传输过程则需要辅助数据结构才能正确获得完整数据。
请继续参见图4,以定长数据的发送为例,假设DMA数据一次交互固定大小的数据块长度为L,地址偏移值的初始值为0。
如图5所示设备端的具体处理步骤如下:
步骤S201:当设备缓存区FIFO中有数据Data0时,自动发起DMA写操作将数据写入到内存中待写数据地址处。
步骤S202:更新DMA操作缓冲区中的offset值为L,表明已经存在下个待写数据的起始地址。
步骤S203:更新待写数据地址,当数据写入地址到达环形缓冲区边界时,若无剩余数据,则更新地址偏移值值为0;若有剩余数据,则所述剩余数据重新开始重头写入,并设置地址偏移值为剩余数据的长度。一般在传输定长数据时,为DMA操作缓冲区中开辟的数据缓冲区长度,优选是定长数据长度L的整数倍。
步骤S204:循环步骤S201~S203,如此反复,直到外部设备被停止。
步骤S3:应用程序采用定期轮询方式获取各个外部设备对应DMA操作缓冲区中的数据。应用程序通过读取DATA_OFFSET_ADDRESS地址处的值就可以获得DMA操作缓冲区中的数据情况。由于没有交互的存在,应用程序必须主动去判断是否存在可用数据,即轮询DATA_OFFSET_ADDRESS地址处的地址偏移值。轮询的频率也是影响效率的一个因素,过密会增加CPU负荷,可以通过增大DMA操作缓冲区(ring buffer)尺寸来缓存较长时间数据。
应用程序初始化后,应用程序中预先设置地址偏移值更新为内存中设备更新的地址偏移值,即表明数据缓冲区中没有数据。
如图6所示,以定长数据接收为例,主机端应用程序处理步骤如下:
步骤S301:应用程序读取DMA操作缓冲区中地址偏移值,如果预存的地址偏移值和DMA操作缓冲区中地址偏移值的不同,说明外部设备已把数据写入到内存中,执行步骤S302,否则继续循环比较直至预存的地址偏移值和DMA操作缓冲区中的地址偏移值不同。
步骤S302:应用程序读取物理内存起始地址+地址偏移值(Offset Local)的数据,从而获得来自外部设备的数据;
步骤S303:如果起始地址+地址偏移值到达DMA操作缓冲区最后,应用程序更新预存的地址偏移值为0,否则应用将预存预存的地址偏移值增加一个数据长度L。
步骤S304:重新执行步骤S301~S303,直到所述应用程序停止运行。
图5为本发明基于DMA的变长数据交互示意图。
请继续参见图5,当每次DMA数据传输的尺寸不同时必须添加辅助数据才能正确获得数据。因此必须为每个变长数据添加数据头(header)结构,来指明读取数据信息,包括变长数据包总长度、位置格式配置信息。根据header结构定制和解析数据,就可以根据需要传输各种复杂的数据块。变长数据传输过程与定长数据传输过程一样,不同的是外部设备必须定制header和数据信息,而应用程序必须通过header才能获得数据,中间增加了一个解析过程。
此外,对变长数据,当数据写入地址到达环形缓冲区边界时,若无剩余数据,则更新地址偏移值为0;若有剩余数据,则所述剩余数据重新开始重头写入,并设置地址偏移值为剩余数据的长度。具体操作如下:每次写变长数据时先判断待写数据是否能完全写入,若是,根据所述待写地址将所述待写数据写入所述DMA操作缓冲区,当前偏移地址值增加待写数据的长度,并且如果新的当前偏移地址值等于所述数据缓冲区的长度,将当前偏移地址值设置为0;若否,根据所述待写地址将所述待写数据写入并将所述剩余数据开始从头写入DMA操作缓冲区,并设置地址偏移值为剩余数据的长度。
上面详细描述了外部设备发送数据,CPU(应用程序)接收数据的传输过程。对于CPU(应用程序)发送数据,与外部设备接收数据流程大致相同,只不过是反向进行操作。外部设备预先保存一个本地地址偏移变量,并以一定的时间间隔采样DMA操作缓冲区中的地址偏移值,如果DMA操作缓冲区中的地址偏移值值与本地预存地址偏移值不相同说明DMA操作缓冲区中存在数据,于是外部设备启动DMA控制器将数据从DMA操作缓冲区中拷贝到设备缓冲区中,如此反复进行,在此不再一一赘述。在另一个实施例中,数据写入DMA操作缓冲区中之后,将已写入数据的相关信息发送至外部设备寄存器,从而触发设备根据寄存器信息通过DMA控制器读取数据。
虽然本发明已以较佳实施例揭示如上,然其并非用以限定本发明,任何本领域技术人员,在不脱离本发明的精神和范围内,当可作些许的修改和完善,因此本发明的保护范围当以权利要求书所界定的为准。