DMA控制器

分散控制系統

DMA(Direct Memory Access)控制器是一種在系統內部轉移數據的獨特外設,可以將其視為一種能夠通過一組專用匯流排將內部和外部存儲器與每個具有DMA能力的外設連接起來的控制器。它之所以屬於外設,是因為它是在處理器的編程式控制制下來 執行傳輸的。DMA既可以指內存和外設直接存取數據這種內存訪問的計算機技術,又可以指實現該技術的硬體模塊(對於通用計算機PC而言,DMA控制邏輯由CPU和DMA控制介面邏輯晶元共同組成,嵌入式系統的DMA控制器內建在處理器晶元內部,一般稱為DMA控制器,DMAC)。值得注意的是,通常只有數據流量較大(kBps或者更高)的外設才需要支持DMA能力,這些應用方面典型的例子包括視頻、音頻和網路介面。

DMA控制器的設置


目前有兩類主要的DMA傳輸結構:寄存器模式和描述符模式。無論屬於哪一類DMA,表1的幾種信息都會在DMA控制器中出現。當DMA以寄存器模式工作時,DMA控制器只是簡單地利用寄存器中所存儲的參數值。在描述符模式中,DMA控制器在存儲器中查找自己的配置參數。
1)基於寄存器的DMA
在基於寄存器的DMA內部,處理器直接對DMA控制寄存器進行編程,來啟動傳輸。基於寄存器的DMA提供了最佳的DMA控制器性能,因為寄存器並不需要不斷地從存儲器中的描述符上載入數據,而內核也不需要保持描述符。基於寄存器的DMA由兩種子模式組成:自動緩衝(Autobuffer)模式和停止模式。在自動緩衝DMA中,當一個傳輸塊傳輸完畢,控制寄存器就自動重新載入其最初的設定值,同一個DMA進程重新啟動,開銷為零。如果將一個自動緩衝DMA設定為從外設傳輸一定數量的字到 L1數據存儲器的緩衝器上,則DMA控制器將會在最後一個字傳輸完成的時刻就迅速重新載入初始的參數。這構成了一個“循環緩衝器”,因為當一個量值被寫入 到緩衝器的最後一個位置上時,下一個值將被寫入到緩衝器的第一個位置上。
自動緩衝DMA特別適合於對性能敏感的、存在持續數據流的應用。DMA控制器可以在獨立於處理器其他活動的情況下讀入數據流,然後在每次傳輸結束時,向內核發出中斷。
停止模式的工作方式與自動緩衝DMA類似,區別在於各寄存器在DMA結束后不會重新載入,因 此整個DMA傳輸只發生一次。停止模式對於基於某種事件的一次性傳輸來說十分有用。例如,非定期地將數據塊從一個位置轉移到另一個位置。當你需要對事件進 行同步時,這種模式也非常有用。例如,如果一個任務必須在下一次傳輸前完成的話,則停止模式可以確保各事件發生的先後順序。此外,停止模式對於緩衝器的初 始化來說非常有用。
2)描述符模型
基於描述符(descriptor)的DMA要求在存儲器中存入一組參數,以 啟動DMA的系列操作。該描述符所包含的參數與那些通常通過編程寫入DMA控制寄存器組的所有參數相同。不過,描述符還可以容許多個DMA操作序列串在一 起。在基於描述符的DMA操作中,我們可以對一個DMA通道進行編程,在當前的操作序列完成後,自動設置並啟動另一次DMA傳輸。基於描述符的方式為管理 系統中的DMA傳輸提供了最大的靈活性。
DMA控制器
DMA控制器

DMA運行模式


DMAC可以在兩種模式下運行:無描述符存取模式和描述符存取模式。模式的選取由DCSRx[NODESCFETCH]位決定。同樣在同一時間內,不同的通道里可以分別使用這兩種模式。通道在轉換運行模式之前必須停止數據處理。如果出現錯誤,則通道停留在停止狀態,等待程序處理。
1).無描述符存取模式
在無描述符存取模式下,DDADRx被保留。程序不可以向DDADRx中寫入數據,並且必須載入DSADRx、DTADRx和DCMDx寄存器。當運行位被設置,DMAC立刻運行以傳輸數據。無描述符存取在數據傳輸的開始時被執行。
一個典型的無描述符存取操作順序如下。
(1)複位后,通道處於未初始化狀態。
(2)設置DCSR[RUN]位為0,設置DCSR[NODESCFETCH]位為1。
(3)程序將源地址寫入DSADR寄存器,將目標地址寫入DTADR寄存器,將命令寫入DCMD寄存器。
(4)向DCSR[RUN]位中寫入1,然後無描述符存取被執行。
(5)通道等待數據傳輸請求。
(6)通道傳輸數據,數據量由DCMD[SIZE]和DCMD[LENGTH]較小者決定。
(7)在DCMD[LENGTH]被設置為0之前,通道等待下一次數據請求。
(8)DDADR[STOP]被設置為1,通道運行終止。
2)有描述符存取模式
在有描述符存取模式下,DMAC的寄存器用內存中的DMA描述符數據填充。多個DMA描述符可以被鏈成一個鏈表。這就允許DMA通道在一系列不連續的地址上進行數據傳輸。一個典型的有描述符存取模式的操作步驟如下。
(1)複位后,通道處於未初始化狀態。
(2)程序將描述符地址(16位元組對齊)寫入DDADR寄存器。
(3)程序向DCSR[RUN]中寫入1。
(4)DMAC從DDADR標記的地址中讀取4字長的描述符,其中各字載入情況如下:
· Word -> DDADRx寄存器;
· Word -> DSADRx寄存器;
· Word -> DTADRx寄存器;
· Word -> DCMDx寄存器。

DMA控制器的基本功能


DMA控制器是內存儲器同外設之間進行高速數據傳送時的硬體控制電路,是一種實現直接數據傳送的專用處理器,它必須能取代在程序控制傳送中由CPU和軟體所完成的各項功能;它的主要功能是:
(1)DMAC同外設之間有一對聯絡信號線——外設的DMA請求信號DREQ以及 DMAC向外設發出的DMA響應信號DACK;
(2)DMAC在接收到DREQ后,同CPU之間也有一對聯絡信號線——DMAC向CPU 發出匯流排請求信號(HOLD或BUSRQ),CPU在當前匯流排周期結束後向DMAC發出匯流排響應信號(HLDA或BUSAK),DMAC接管對匯流排的控制權,進入DMA操作方式;
(3)能發出地址信息,對存儲器定址,並修改地址指針,DMAC內部必須有能自動加1或減1的地址寄存器;
(4)能決定傳送的位元組數,並能判斷DMA傳送是否結束。DMA內部必須有能自動減1的字計數寄存器,計數結束產生終止計數信號;
(5)能發出DMA結束信號,釋放匯流排,使CPU恢復匯流排控制權;
(6)能發出讀、寫控制信號,包括存儲器訪問信號和I/O訪問信號。DMAC內部必須有時序和讀寫控制邏輯。有些DMAC晶元和模塊在這些基本功能的基礎上還增加了一些新的功能。如:在DMA傳送結束時產生中斷請求信號;在傳送完一個位元組數后輸出一個脈衝信號,用於記錄已傳送的位元組數、為外部提供周期性的脈衝序列;在一個數據塊傳送完后能自動裝入新的起始地址和位元組數,以便重複傳送一個數據塊或將幾個數據塊鏈接起來傳送;產生兩個存儲器地址,從而實現存儲器與存儲器之間的傳送以及能夠對I/O設備定址,實現I/O設備與I/O設備之間的傳送以及能夠在傳送過程中檢索某一特定位元組或者進行數據檢驗等等。

DMA控制器的基本組成


一個DMA控制器,實際上是採用DMA方式的外圍設備與系統匯流排之間的介面電路,這個介面電路是在中斷介面的基礎上再加DMA機構組成。習慣上將DMA方式的介面電路稱為DMA控制器。
DMA控制器
DMA控制器
(1)內存地址計數器:用於存放內存中要交換的數據的地址。在 DMA傳送前,須通過程序將數據在內存中的起始位置(首地址)送到內存地址計數器。而當 DMA 傳送時,每交換一次數據,將地址計數器加“1”,從而以增量方式給出內存中要交換的一批數據的地址。
(2)字計數器:用於記錄傳送數據塊的長度(多少字數)。其內容也是在數據傳送之前由程序預置,交換的字數通常以補碼形式表示。在DMA傳送時,每傳送一個字,字計數器就加“1”。當計數器溢出即最高位產生進位時,表示這批數據傳送完畢,於是引起DMA控制器向CPU發出中斷信號。
(3)數據緩衝寄存器:用於暫存每次傳送的數據(一個字)。當輸入時,由設備(如磁碟)送往數據緩衝寄存器,再由緩衝寄存器通過數據匯流排送到內存。反之,輸出時,由內存通過數據匯流排送到數據緩衝寄存器,然後再送到設備。
(4)“DMA請求”標誌:每當設備準備好一個數據字后給出一個控制信號,使“DMA
請求”標誌置“1”。該標誌置位後向“控制/狀態”邏輯發出DMA請求,後者又向CPU發出匯流排使用權的請求(HOLD),CPU響應此請求后發迴響應信號HLDA,“控制/狀態”邏輯接收此信號后發出DMA響應信號,使“DMA 請求”標誌複位,為交換下一個字做好準備。 (5)“控制/狀態”邏輯:由控制和時序電路以及狀態標誌等組成,用於修改內存地址計數器和字計數器,指定傳送類型(輸入或輸出),並對“DMA請求”信號和CPU響應信號進行協調和同步。
(6)中斷機構:當字計數器溢出時,意味著一組數據交換完畢,由溢出信號觸發中斷機構,向CPU提出中斷報告。