基于散列DMA的高速串口驅動設計
DMA數據傳輸可分為塊傳輸和散列傳輸兩種方式。在DMA傳輸數據的過程中,要求源物理地址和目標物理地址必須是連續(xù)的。但是在某些計算機體系中(如IA架構),連續(xù)的存儲器地址在物理上不一定是連續(xù)的,所以DMA傳輸要分成多次完成。傳輸完一塊物理上連續(xù)的數據后引發(fā)一次中斷,然后進行下一塊物理上連續(xù)的數據傳輸,這就是DMA塊傳輸方式(Block DMA)。散列傳輸是在塊傳輸方式上發(fā)展起來的,它與一個傳輸鏈表相關,如圖2所示。該鏈表可以是單向結構或環(huán)形結構??刂谱种邪瑪祿粚?、數據塊大小、當前塊傳輸結束是否引發(fā)中斷等控制信息。DMA塊傳輸可看作是只含有一個節(jié)點,且下一節(jié)點指針總是指向當前節(jié)點的散列傳輸。采用散列DMA方式能更靈活、高效地傳輸數據。
3.1 硬件平臺
SPEAR300是ST公司在ARM926EJ-S核的基礎上開發(fā)的高性能嵌入式處理器。其最高工作頻率為333MHz,有8個獨立的DMA通道,支持散列DMA;UART支持DMA傳輸,發(fā)送和接收FIFO大小均為16字節(jié),在192 MHz的外設總線(APB)頻率下支持的最高波特率為12 Mbps,如果提高APB的頻率還可以獲得更高的波特率。本文的硬件平臺是以SPEAR300為核心的人機界面產品,主要外設包括觸摸屏、液晶顯示模組、網口和串口(串口要支持最高波特率為12 Mbps的西門子MPI通信協(xié)議)。
串口驅動程序的核心是實現數據高效穩(wěn)定的收發(fā)。為了實現UART的高速數據傳輸,UART中斷設置為最高優(yōu)先級;同時在操作系統(tǒng)中允許中斷嵌套,打開UART接收超時中斷RTI并使能UART的DMA傳輸。這樣,當UART的發(fā)送FIFO數據減少到設定的參考值(FIFOLevel)時,發(fā)送DMA傳輸就會被觸發(fā)。同樣,當接收FIFO的數據增長到設定值時,接收DMA傳輸就會被觸發(fā)。為了減少DMA傳輸被觸發(fā)的次數同時保證數據被及時傳輸,發(fā)送FIFO Level設定為2字節(jié),而接收FIFOLevel設定為14字節(jié),將發(fā)送和接收的FIFO Level分別設定為0和16字節(jié)是有很大風險的。MPI協(xié)議要求傳輸的一幀數據不能有間斷,所以在使用DMA傳輸UART數據時DMAC必須獨占系統(tǒng)總線。為了避免產生緩存一致性問題,使用2塊非緩存內存區(qū)域存放待發(fā)送的數據和已接收到的數據。
發(fā)送數據時,待發(fā)送的數據量總是已知的。先構造一個傳輸節(jié)點,數據源地址為數據包的首地址,目的地址為UART寄存器,數據位寬為8,下一節(jié)點指針(PTR_NEXT)為空。當前數據包發(fā)送結束前,如果PTR_NEXT被更新,則下一個數據包的傳輸自動開始。當前數據包是否發(fā)送完畢,可通過讀取DMAC寄存器DMACCnControl的TransferSize字段得知。整個發(fā)送數據的過程無需觸發(fā)任何中斷,流程圖如圖3所示。如果采用DMA塊傳輸方式,就需要在每次傳輸完畢后產生DMA中斷,重新裝載數據到內存中的發(fā)送數據區(qū)以發(fā)送下一個數據包。
評論