微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于嵌入式Linux 系统的高速设备驱动程序实现

基于嵌入式Linux 系统的高速设备驱动程序实现

时间:03-24 来源:互联网 点击:

量表明,DMA的缓存已空时,若应用程序调用read()进行读数据的话,将不做任何操作,并返回已读数据量为0。当信号量表明DMA的缓存为满时,将DMA读入的数据丢弃,并设置buff_full = 0。

除此以外,我们还必须对Linux驱动进行以下步骤的操作:设备的注册和注销、设备的打开和释放。通过register_chrdev()函数向系统注册设备的设备号,在设备使用结束后,可以使用unregister_chrdev()从内核注销设备,释放主设备号。在设备注册之后,由open()函数打开设备,close()释放设备。在驱动的初始化中,需要对DMA进行首次设置,以及缓存的分配。我们可以调用 get_free_pages()函数进行内存页面的分配,它会给DMA分配内存中连续的页面,这对于DMA是必须的,因为DMA操作的物理地址是连续的。在内存分配之后,我们进行中断的配置,通过调用函数request_irq()。接着调用request_dma() 函数对DMA进行申请注册。

最后,有一点不得不引起我们的重视,即DMA一致性问题。DMA一致性的问题是指当进行数据DMA方式读入时,由于没有经过CPU的处理,因此 CPU的CACHE会认为该地址的内存没有被重写过,而实际该内存所存储的数据已被改变;当CPU需要处理该内存的数据时,由于认为数据没有改变,会直接调用CACHE内的数据,造成数据错误,一般表现为数据的重复。在实际操作中,我们可以通过禁用该内存的CACHE功能,来避免错误。在新版的Linux 内核中提供dma_alloc_coherent()和dma_free_coherent()函数进行DMA一致性内存的分配。

以上就是我们针对高速设备驱动改进的程序代码结构。该驱动程序结构通过将核心态的DMA操作与数据到拷贝以及用户态上数据的处理独立开来,依靠信号量进行相互的制约,可以有效的避免高速设备DMA操作的频繁性和大数据量处理的较长时间之间的矛盾。驱动程序的流程如图2所示。

3 应用实例

下面我们以视频会议系统为例,介绍基于以上结构的高速设备驱动程序的实现。

在视频会议系统中,AT91RM9200通过SPI接口与TI DM642 DSP芯片的McBSP接口相连进行图像数据的传输。由于数据吞吐量很大,采用一般结构甚至是一般的DMA结构的驱动程序都无法满足数据的接收要求,造成数据无法实时的数据处理。我们针对该系统的特点,对驱动程序按照以上结构作出改进,不但大大减轻了ARM处理器的负荷,同时能够有效的进行大数据量的传输和处理。

表1 驱动程序改进前后对比表

测得码率上限

性能测试描述

改进前

1Mbps

当码率接近1Mbps时,出现数据丢失

改进后

10Mbps

当码率达到10Mbps时,驱动仍然能够正常工作

在我们的系统中,由于SPI接口需要传输标清的视频压缩图像,码率一般为2Mbps,原结构的驱动程序在码率较高的情况下,会出现数据的丢失,而数据的丢失不但影响了当前帧的图像的质量,而且同时会造成后面多帧图像的质量严重下降,因而无法满足这样高数据率传输的需要。而经过改进的驱动程序经过测试,至少可以承受10Mbps码率的数据传输,验证证明该结构的驱动程序可以完全胜任高速设备的数据传输且经过长时间测试,性能可靠。

4 结束语

本文的创新点是提出了一种基于ARM芯片的高速数据传输的设备驱动实现方案。首先对嵌入式Linux驱动程序程序的传统结构框架进行了介绍。而在实际的应用中,为了能够适应高速率的数据传输,针对ARM芯片以及Linux操作系统的特点,对设备驱动程序进行了改进。最后,以视频会议系统为例,对该结构的驱动程序进行实现、测试和验证,可完全胜任高速设备的数据传输且性能可靠。不仅如此,该结构的设备驱动程序同样适合于嵌入式Linux系统的各种高速设备传输的应用。

参考文献

[1] Alessandro Rubini Linux Device Drivers 0'Reilly Assocoates,Inc. 1998.

[2] Karim Yagbmour Building Embedded Linux System 0'Reilly Media,Inc. 2004.

[3] Linux kernel, version 2.4.30

[4] 雷锋成 方滨 李慧杰,嵌入式网络数字图像监控系统,微计算机信息.2006.9-2

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top