<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于嵌入式Linux 系統的高速設備驅動(dòng)程序實(shí)現

基于嵌入式Linux 系統的高速設備驅動(dòng)程序實(shí)現

作者: 時(shí)間:2012-03-24 來(lái)源:網(wǎng)絡(luò ) 收藏

圖2 改進(jìn)的設備驅動(dòng)流程圖

2.2 的進(jìn)一步改進(jìn)

基于以上幾點(diǎn),為了能夠在Linux中實(shí)現的數據通信,對結構作出進(jìn)一步改進(jìn)的設計。

在設備的實(shí)現上,采用生產(chǎn)者-消費者模型與循環(huán)緩存相結合的結構。將從硬件設備到核心態(tài)內存的DMA傳輸看作生產(chǎn)者,而從核心態(tài)內存搬移到用戶(hù)態(tài)的數據傳輸過(guò)程看作消費者;同時(shí)為DMA傳輸分配的核心態(tài)內存采用循環(huán)鏈的結構。

在驅動(dòng)程序中,將read()函數作為設備讀操作的主函數,實(shí)現消費者的功能。當read()每次被調用時(shí),從DMA緩存鏈中讀取當前指針所指的內存數據,通過(guò)copy_to_user()函數,將數據傳出核心態(tài),復制到用戶(hù)態(tài)內存,以便后續的數據處理。

而在驅動(dòng)程序中,Irq_service()函數實(shí)現生產(chǎn)者的功能,當有中斷產(chǎn)生后,系統進(jìn)入Irq_service(),表明一次DMA的傳輸結束,并且在Irq_service()中,設置下一次DMA傳輸的參數,包括DMA傳輸的數據大小、DMA傳輸的目標內存。之后,調用interrupt_sleep_on()函數,使得系統進(jìn)入進(jìn)程調度,等待下一次DMA的操作完成。一旦完成,就會(huì )產(chǎn)生中斷并重復以上的過(guò)程。因此,作為生產(chǎn)者的Irq_service()函數,只要初始化后,就會(huì )在中斷的觸發(fā)下不斷被調用。換句話(huà)說(shuō),只要有數據到達硬件設備,就會(huì )不斷將其通過(guò)DMA的方式讀入到核心態(tài)的循環(huán)緩存中。我們可以將DMA緩存在允許的情況下,開(kāi)的大一些,因為當接收的數據呈現一種突發(fā)的狀態(tài)時(shí),較小的緩沖池可能由于不能及時(shí)地將數據取走而溢出,造成數據的丟失。

與此同時(shí),還有個(gè)問(wèn)題必須注意,即當read()函數將緩存池中的數據都搬完之后,仍然沒(méi)有DMA的輸入。此時(shí),read()繼續讀取的話(huà),顯然會(huì )造成數據的錯誤,因此采用信號量是必須的。當信號量表明,DMA的緩存已空時(shí),若應用程序調用read()進(jìn)行讀數據的話(huà),將不做任何操作,并返回已讀數據量為0。當信號量表明DMA的緩存為滿(mǎn)時(shí),將DMA讀入的數據丟棄,并設置buff_full = 0。

除此以外,我們還必須對Linux驅動(dòng)進(jìn)行以下步驟的操作:設備的注冊和注銷(xiāo)、設備的打開(kāi)和釋放。通過(guò)register_chrdev()函數向系統注冊設備的設備號,在設備使用結束后,可以使用unregister_chrdev()從內核注銷(xiāo)設備,釋放主設備號。在設備注冊之后,由open()函數打開(kāi)設備,close()釋放設備。在驅動(dòng)的初始化中,需要對DMA進(jìn)行首次設置,以及緩存的分配。我們可以調用 get_free_pages()函數進(jìn)行內存頁(yè)面的分配,它會(huì )給DMA分配內存中連續的頁(yè)面,這對于DMA是必須的,因為DMA操作的物理地址是連續的。在內存分配之后,我們進(jìn)行中斷的配置,通過(guò)調用函數request_irq()。接著(zhù)調用request_dma() 函數對DMA進(jìn)行申請注冊。

最后,有一點(diǎn)不得不引起我們的重視,即DMA一致性問(wèn)題。DMA一致性的問(wèn)題是指當進(jìn)行數據DMA方式讀入時(shí),由于沒(méi)有經(jīng)過(guò)CPU的處理,因此 CPU的CACHE會(huì )認為該地址的內存沒(méi)有被重寫(xiě)過(guò),而實(shí)際該內存所存儲的數據已被改變;當CPU需要處理該內存的數據時(shí),由于認為數據沒(méi)有改變,會(huì )直接調用CACHE內的數據,造成數據錯誤,一般表現為數據的重復。在實(shí)際操作中,我們可以通過(guò)禁用該內存的CACHE功能,來(lái)避免錯誤。在新版的Linux 內核中提供dma_alloc_coherent()和dma_free_coherent()函數進(jìn)行DMA一致性?xún)却娴姆峙洹?P>以上就是我們針對驅動(dòng)改進(jìn)的程序代碼結構。該驅動(dòng)程序結構通過(guò)將核心態(tài)的DMA操作與數據到拷貝以及用戶(hù)態(tài)上數據的處理獨立開(kāi)來(lái),依靠信號量進(jìn)行相互的制約,可以有效的避免DMA操作的頻繁性和大數據量處理的較長(cháng)時(shí)間之間的矛盾。驅動(dòng)程序的流程如圖2所示。

3 應用實(shí)例

下面我們以視頻會(huì )議系統為例,介紹基于以上結構的高速設備驅動(dòng)程序的實(shí)現。

在視頻會(huì )議系統中,AT91RM9200通過(guò)SPI接口與TI DM642 DSP芯片的McBSP接口相連進(jìn)行圖像數據的傳輸。由于數據吞吐量很大,采用一般結構甚至是一般的DMA結構的驅動(dòng)程序都無(wú)法滿(mǎn)足數據的接收要求,造成數據無(wú)法實(shí)時(shí)的數據處理。我們針對該系統的特點(diǎn),對驅動(dòng)程序按照以上結構作出改進(jìn),不但大大減輕了ARM處理器的負荷,同時(shí)能夠有效的進(jìn)行大數據量的傳輸和處理。

表1 驅動(dòng)程序改進(jìn)前后對比表

測得碼率上限

性能測試描述

改進(jìn)前

1Mbps

當碼率接近1Mbps時(shí),出現數據丟失

改進(jìn)后

10Mbps

當碼率達到10Mbps時(shí),驅動(dòng)仍然能夠正常工作

在我們的系統中,由于SPI接口需要傳輸標清的視頻壓縮圖像,碼率一般為2Mbps,原結構的驅動(dòng)程序在碼率較高的情況下,會(huì )出現數據的丟失,而數據的丟失不但影響了當前幀的圖像的質(zhì)量,而且同時(shí)會(huì )造成后面多幀圖像的質(zhì)量嚴重下降,因而無(wú)法滿(mǎn)足這樣高數據率傳輸的需要。而經(jīng)過(guò)改進(jìn)的驅動(dòng)程序經(jīng)過(guò)測試,至少可以承受10Mbps碼率的數據傳輸,驗證證明該結構的驅動(dòng)程序可以完全勝任高速設備的數據傳輸且經(jīng)過(guò)長(cháng)時(shí)間測試,性能可靠。

4 結束語(yǔ)

本文的創(chuàng )新點(diǎn)是提出了一種基于A(yíng)RM芯片的高速數據傳輸的設備驅動(dòng)實(shí)現方案。首先對驅動(dòng)程序程序的傳統結構框架進(jìn)行了介紹。而在實(shí)際的應用中,為了能夠適應高速率的數據傳輸,針對ARM芯片以及Linux操作系統的特點(diǎn),對設備驅動(dòng)程序進(jìn)行了改進(jìn)。最后,以視頻會(huì )議系統為例,對該結構的驅動(dòng)程序進(jìn)行實(shí)現、測試和驗證,可完全勝任高速設備的數據傳輸且性能可靠。不僅如此,該結構的設備驅動(dòng)程序同樣適合于系統的各種高速設備傳輸的應用。

參考文獻

[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] 雷鋒成 方濱 李慧杰,嵌入式網(wǎng)絡(luò )數字圖像監控系統,微計算機信息.2006.9-2


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>