控制器的設置
DMA控制器可以作為處理器的一個外設模塊而存在,且可以接收處理器核的參數配置進行數據搬運;DMA控制器可以和處理器核一樣作為主(Master)訪問處理器外部存儲資源和内部存儲器,使得處理器外部的系統存儲器和處理器内部的程序存儲器(PM,ProgramMemory)、數據存儲器(DM,DataMemory)之間可以進行快速的數據搬運,而不需要處理器核使用其内部寄存器進行低效率的數據中轉。
目前有兩類主要的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傳輸提供了最大的靈活性。
運行模式
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寄存器。
(5)通道等待數據傳輸請求。
(6)通道傳輸數據,數據量由DCMD[SIZE]和DCMD[LENGTH]較小者決定。
(7)在DCMD[LENGTH]被設置為0之前,通道等待下一次數據請求。
(8)DDADR[STOP]被設置為1,通道運行終止,否則繼續運行。
基本功能
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控制器。
(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提出中斷報告。