DMA控制簡介
DMA(Direct Memory Access)控制器是一種在系統內部轉移數據的獨特外設,可以將其視為一種能夠通過一組專用總線將內部和外部存儲器與每個具有DMA能力的外設連接起來的控制器。它之所以屬于外設,是因為它是在處理器的編程控制下來 執行傳輸的。
DMA控制器結構
一般而言,DMA控制器將包括一條地址總線、一條數據總線和控制寄存器。高效率的DMA控制器將具有訪問其所需要的任意資源的能力,而無須處理器本身的介入,它必須能產生中斷。最后,它必須能在控制器內部計算出地址。
一個處理器可以包含多個DMA控制器。每個控制器有多個DMA通道,以及多條直接與存儲器站(memory bank)和外設連接的總線,如圖1所示。在很多高性能處理器中集成了兩種類型的DMA控制器。第一類通常稱為“系統DMA控制器”,可以實現對任何資源(外設和存儲器)的訪問,對于這種類型的控制器來說,信號周期數是以系統時鐘(SCLK)來計數的,以ADI的Blackfin處理器為 例,頻率最高可達133MHz。第二類稱為內部存儲器DMA控制器(IMDMA),專門用于內部存儲器所處位置之間的相互存取操作。因為存取都發生在內部 (L1-L1、L1-L2,或者L2-L2),周期數的計數則以內核時鐘(CCLK)為基準來進行,該時鐘的速度可以超過600MHz。
每個DMA控制器有一組FIFO,起到DMA子系統和外設或存儲器之間的緩沖器的作用。對于MemDMA(Memory DMA)來說,傳輸的源端和目標端都有一組FIFO存在。當資源緊張而不能完成數據傳輸的話,則FIFO可以提供數據的暫存區,從而提高性能。
因為你通常會在代碼初始化過程中對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提出中斷報告。
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(Direct Memory Access,直接內存存取) 是所有現代電腦的重要特色,它允許不同速度的硬件裝置來溝通,而不需要依于 CPU 的大量 中斷 負載。否則,CPU 需要從 來源 把每一片段的資料復制到 暫存器,然后把它們再次寫回到新的地方。在這個時間中,CPU 對于其他的工作來說就無法使用。
DMA 傳輸將數據從一個地址空間復制到另外一個地址空間。當 CPU 初始化這個傳輸動作,傳輸動作本身是由 DMA 控制器 來實行和完成。典型的例子就是移動一個外部內存的區塊到芯片內部更快的內存區。像是這樣的操作并沒有讓處理器工作拖延,反而可以被重新排程去處理其他的工作。DMA 傳輸對于高效能 嵌入式系統 算法和網絡是很重要的。
在實現DMA傳輸時,是由DMA控制器直接掌管總線,因此,存在著一個總線控制權轉移問題。即DMA傳輸前,CPU要把總線控制權交給DMA控制器,而在結束DMA傳輸后,DMA控制器應立即把總線控制權再交回給CPU。
DMA傳輸過程
1.DMA請求
CPU對DMA控制器初始化,并向I/O接口發出操作命令,I/O接口提出DMA請求。
2.DMA響應
DMA控制器對DMA請求判別優先級及屏蔽,向總線裁決邏輯提出總線請求。當CPU執行完當前總線周期即可釋放總線控制權。此時,總線裁決邏輯輸出總線應答,表示DMA已經響應,通過DMA控制器通知I/O接口開始DMA傳輸。
3.DMA傳輸
DMA控制器獲得總線控制權后,CPU即刻掛起或只執行內部操作,由DMA控制器輸出讀寫命令,直接控制RAM與I/O接口進行DMA傳輸。
4.DMA結束
當完成規定的成批數據傳送后,DMA控制器即釋放總線控制權,并向I/O接口發出結束信號。當I/O接口收到結束信號后,一方面停 止I/O設備的工作,另一方面向CPU提出中斷請求,使CPU從不介入的狀態解脫,并執行一段檢查本次DMA傳輸操作正確性的代碼。最后,帶著本次操作結果及狀態繼續執行原來的程序。
由此可見,DMA傳輸方式無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現場和恢復現場的過程,通過硬件為RAM與I/O設備開辟一條直接傳送數據的通路,使CPU的效率大為提高。
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設備之間的傳送以及能夠在傳送過程中檢索某一特定字節或者進行數據檢驗等等。
評論
查看更多