DMA基本原理 结构与应用

直接記憶體存取 ─基本原理、結構與應用(上)

直接記憶體存取( DMA )控制器 是一種在系統內部轉移數據的獨特週邊設備,可將其視為一種能透過一組專用匯流排,將內部和外部記憶體與每個具有DMA能力之週邊設備相連的控制器。它之所以屬於週邊設備,是因為它是在處理器 的編程控制下進行傳輸。值得注意的是,通常只有數據流量較大(kBps或更高)的週邊設備才需支援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控制進行編程,讓它與核心平行地移動數據,同時讓核心執行其基本處理任務。

在 一項最佳化應用中,核心永遠不用參與任何數據的移動,僅需對L1記憶體中的數據進行讀寫。於是,核心無需等待數據的到來,因為DMA引擎會在核心準備讀取 數據之前將數據準備好。圖2為處理器和DMA控制器間的互動關係。由處理器完成的作業步驟包括:設立傳輸,啟用中斷,產生中斷時執行程式碼。返回處理器的 中斷輸入可用來指示‘數據已準備好,可進行處理’的指令。

數據除了往返於週邊設備外,還必須從一個記憶體空間轉移到另一個空 間中。例如,視訊源可從一個視訊埠直接流入L3記憶體,因為工作緩衝區規模太大,無法放入到記憶體中。我們並不希望讓處理器在每次需要執行運算時,都必須 從外部儲存讀取畫素資訊,因此,為了提高存取效率,可用一個記憶體到記憶體的DMA(MemDMA)來將畫素轉移到L1或L2記憶體中。

目前為止,我們還僅專注於數據的移動,但DMA的傳送能力並不僅限於移動數據。我們可用程式碼覆蓋的方法來提高性能,將DMA控制器配置為在執行前將程式碼送入L1指令記憶體。程式碼往往儲存於較大的外部記憶體中,並根據需求有選擇性的送入L1。

圖1:系統和記憶體DMA架構。
圖1:系統和記憶體DMA架構。

圖2:DMA控制器。
圖2:DMA控制器。

DMA控制器編程

讓我們瞭解在定義DMA活動的過程中可以有哪些選項。我們將從最簡單的模型開始,並在此基礎上過渡到更靈活的模型,這將增加設置的複雜度。

針 對任何類型的DMA傳輸,都必須規定數據的起始源和目標地址。對於週邊設備DMA而言,週邊設備的FIFO可作為數據源或目標端。當週邊設備作為源端時, 某個記憶體的位置(內部或外部)則成為目標端地址。當週邊設備作為目標端,儲存的位置(內部或者外部)則成為源端地址。

在最 簡單的MemDMA情況中,必須告訴DMA控制器源端地址、目標端地址和待傳送的字符數。在採用週邊設備DMA情況下,可規定數據的源端或目標端,具體取 決於傳輸方向。每次傳輸的字符大小可以是8、16或12位元。這類事務代表了簡單的1維(1D)統一‘單一步距’(unity stride)的傳輸。作為這一傳輸機制的一部份,DMA控制器會連續追蹤不斷增加的源端和目標端地址。採用這種傳輸方式時,8位元的傳輸會產生1位元組 的地址增量,而16位元傳輸產生的增量為2位元組,32位元傳輸則產生4位元組的增量。上述參數為基本1D DMA傳輸的設定參數。

只需要改變每次傳輸的數據大小,就可以簡單地增加一維DMA的靈活性。例如,採用非單一大小的傳輸方式時,我們以傳輸數據區塊的大小倍數作為地址增量。也就是說,若規定32位元的傳輸和4個採樣的步距,則每次傳輸結束後,地址的增量為16位元組(4個32位元字)。

雖 然1D DMA獲得了廣泛應用,但用處更大的是2維(2D) DMA,特別是在視訊應用中。2D功能是1D DMA的直接擴展。除了XCOUNT和XMODIFY值之外,還需對對應的YCOUNT和YMODIFY值進行編程設定。2D DMA可簡單地理解為一個層疊的迴圈,即內部迴圈由XCOUNT和XMODIFY規定,外部迴圈由YCOUNT和YMODIFY規範。一個1D DMA可簡單地視為2D傳輸的‘內部迴圈’,如以下所示:

for y = 1 to YCOUNT /* 2D的外部迴圈*/

for x = 1 to XCOUNT /* 1D的內部迴圈 */

{

/* 傳輸迴圈主體轉移到此處 */

}

XMODIFY 決定了XCOUNT每次減少時的DMA控制器步距值,而YMODIFY則決定了YCOUNT每次減少時對應的步距值。與XCOUNT和XMODIFY一 樣,YOUNT能以傳輸數量來定義,而YMODIFY則以位元組數來定義。值得注意的是,YMODIFY可以為負值,這會讓DMA控制器回到緩衝器的起始 點。

對週邊設備DMA而言,傳輸的‘記憶體端’可以是1D或2D。不過,在週邊設備端,傳輸始終是1D的。唯一的限制是在 DMA每一端(源端和目標端)傳輸的位元組總數必須相同。例如,若從3個10位元組的緩衝器向週邊設備發送數據,週邊設備必須被設定為傳送30位元組,具 體方式可以是任何所支援之傳輸寬度和傳輸計數值的組合。

MemDMA提供的靈活度更高一些。例如,若我們設立一個1D-D傳輸、一個1D-2D傳輸、1個2D-1D傳輸,且可自然設立一個2D-2D傳輸,唯一的限制條件是,在DMA傳輸模組兩端所傳送的位元組總數必須相等。

DMA的設置

目 前有兩類主要的DMA傳輸結構:暫存器模式和描述符號模式。無論屬於哪一類DMA,表1描述的幾類資訊都會在DMA控制器中出現。當DMA以暫存器模式工 作時,DMA控制器只是簡單地利用暫存器中所儲存的參數值。在描述符號模式中,DMA控制器會在記憶體中查找自己的配置參數。

表1:DMA暫存器
表1:DMA暫存器

基於暫存器的DMA

在基於暫存器的DMA內部,處理器直接對DMA控制暫存器進行編程,以啟動傳輸。基於暫存器的DMA提供了最佳化DMA控制器性能,因為暫存器並不需要不斷地從記憶體中的描述符號上載入數據,而核心也不需要保持描述符號。

基於暫存器的DMA由兩種子模式組成:自動緩衝(Autobuffer)模式和停止模式。在自動緩衝DMA中,當一個傳輸區塊傳輸完畢,控制暫存器就自動重新載入其最初的設定值,同一個DMA程序會重新啟動,無任何開銷。

如 圖3中所示,若將一個自動緩衝DMA設定為從週邊設備傳輸一定數量的字符到L1數據記憶體緩衝器上,則DMA控制器將會在最後一個字符傳輸完成時迅速重新 載入初始參數。這構成了一個‘循環緩衝器’,因為當一個量值被寫入到緩衝器的最後一個位置上時,下一個值將被寫入到緩衝器的第一個位置上。

圖3:用DMA實現循環緩衝器。
圖3:用DMA實現循環緩衝器。

自 動緩衝DMA特別適合對要求高性能,並要求連續數據串流的應用。DMA控制器可在獨立於處理器的其他活動情況下讀入數據串流,然後在每次傳輸結束時向核心 發出中斷。雖然有可能以恰當的方式阻止自動緩衝模式,但若DMA程序需要定期啟動和停止時,採用這種工作方式就沒有什麼意義。

停 止模式的工作方式與自動緩衝DMA類似,區別在於DMA結束後,各暫存器不會重新載入,因此整個DMA傳輸只產生一次。停止模式對於基於某種事件的一次性 傳輸來說十分有用。例如,非定期地將數據區塊從一個位置轉移到另一個位置。當你需要對事件進行同步時,這種模式也非常有用。例如,若一個任務必須在下一次 傳輸前完成,則停止模式可確保各事件產生的先後順序。此外,停止模式對緩衝器的初始化來說非常有用。

描述符號模型

基 於描述符號(descriptor)的DMA要求在記憶體中存入一組參數,以啟動DMA的系列作業。該描述符號所包含的參數與那些通常透過編程寫入DMA 控制暫存器組的所有參數相同。不過,描述符號容許串聯多個DMA作業序列。在基於描述符號的DMA作業中,可對一個DMA通道進行編程,在目前的作業序列 完成後,自動設置並啟動另一次DMA傳輸。基於描述符號的方式為管理系統中的DMA傳輸提供了極大靈活性。

ADI的Blackfin處理器上有兩種主要的描述符號方式─描述符號陣列和描述符號列表,這兩種作業方式所要實現的目標是在靈活性和性能間實現折衷。

在 描述符號陣列模式下,描述符號駐留在連續的記憶體位置上。DMA控制器依然從記憶體取用描述符號,但由於下一個描述符號緊跟著目前的描述符號,因此,說明 到何處尋找下一個描述符號(及其相應的描述符號取用)的兩個數據字就沒有必要。因為描述符號並不包含此一‘下一描述符號’指針項目,DMA控制器希望一組 描述符號在記憶體中像陣列般排列。

當各描述符號在記憶體中的分佈位置並非‘背對背’時,可使用一個描述符號列表。事實上,此 處涉及了多種子模式,再一次實現了性能與靈活性之間的平衡。在‘小描述符號’模型中,描述符號包含一個單16位元的域,可提供‘下一描述符號指針’域的低 位元部份;高位元部份則透過暫存器來獨立編程設定,且不產生改變。當然,這會將描述符號限制在記憶體中的一個特定64K(=216 )頁面上。當描述符號的位置必須跨越此一邊界時,也能提供一個‘大’的模型,它可以為‘下一描述符號指針’項目提供32位元的位置。

無 論採用何種描述符號模式,描述符號的量值數量越多,則描述符號取用的次數就越多。這是為何Blackfin處理器定義了一個‘靈活描述符號方式’的原因, 該模式可修改描述符號的長度,使其僅包含特定傳輸所需的數據。例如,若不需要2D DMA,YMODIFY和YCOUNT暫存器就不需要成為描述符號數據區塊的一部份。

描述符號管理

管理描述符號列表的最佳方法是什麼?其實,這個問題的答案必須根據應用來定,但必須瞭解存在著何種替代方案。

第 一種可選方案的工作方式非常類似於一個自動緩衝DMA。它必須設定多種描述符號,並將之串聯,如圖4a所示。‘串聯’意味著一個描述符號指向下一個描述符 號,描述符號的載入是自動的。為了使鏈條完整,最後一個描述符號會反向指向第一個描述符號,於是整個流程就會重複。使用這種技術而非自動緩衝的理由是,這 些描述符號可保證傳輸的規模,同時在方向上具有更大靈活性。

圖4:由處理器進行調控的DMA描述符號:(a)鏈接的描述符號列表;(b)‘節流調節式’的描述符號管理。<p><p>

圖4:由處理器進行調控的DMA描述符號:(a)鏈接的描述符號列表;(b)‘節流調節式’的描述符號管理。

第 二個選擇則是由處理器來管理描述符號列表。回想一下,描述符號實際上是記憶體中的一種結構,每個描述符號包含了一個配置字符。每個配置字符均包含了‘使 能’位元,其作用是在傳輸開始時進行調節。若必須讓處理器在做好準備時啟動每次具體傳輸,就可事先設定所有的描述符號,但把‘使能’位元清零。當處理器確 定啟動描述符號的時機已經到來,就僅需簡單地更新記憶體中的描述符號,然後寫入DMA暫存器中,以啟動處於停止狀態的通道,如圖4b所示。

這 種類型的傳輸可用於何種領域呢?請考慮一個需要將輸入串流與輸出串流實現同步的多媒體應用。如在接收視訊採樣時,將其傳輸到記憶體的速率可能會不同於將該 視訊輸出顯示的速度。在實際系統中,即使試圖讓串流以恰好相同的時脈傳輸,也會產生這種情況。在同步成為問題的情況下,處理器可調整對應於輸出緩衝器的 DMA描述符號。在下一個描述符號啟用時,處理器可透過調整目前的輸出描述符號以實現串流同步,具體方式是利用一種訊號量機制(semaphore mechanism)來確保每次只有一個項目存取共享資源。

在處理器之間使用內部的DMA描述符號鏈或基於DMA的串流時,一種有用的做法是在所傳輸的數據區塊末尾添加一個額外字符,協助標識正被發送的封包,該封包包含了如何處理數據的資訊和時間戳記。圖4b中虛線部份顯示了這種方案。

大 多數成熟的應用都有以軟體形式實現的‘DMA管理器’功能。這可作為作業系統或即時核心的一部份來提供,但它也能在沒有這兩者的條件下執行。在 Blackfin處理器上,該功能可作為VisualDSP++工具套件之‘System Services’的一部份。這一管理功能可透過標準API來轉移數據,無需手工配置每一個控制暫存器。

基本上,一個應用將 DMA描述符號的要求提交給DMA佇列管理器,其責任是處理每一次請求。請求的處理則是依照其被應用軟體接收到的順序來進行。指向‘回調’函數的地址指針 往往也是系統的一部份。該函數可完成在數據緩衝準備好時你希望處理器來完成的工作,無需讓核心停留在高優先級的中斷服務例程執行中。整體而言,DMA管理 器可簡化編程模型。

有兩種通用方法可管理採用中斷的描述符號佇列:第一種是基於在每次描述符號完結時所發出的中斷,只有當你 能確保每個中斷事件將單獨得到服務、無中斷溢出時才使用這種方法;第二種方法是僅在由一個工作區塊之最後描述符號所規定的工作傳輸結束時發出中斷。工作區 塊是一個或多個描述符號的集合。

為了保持描述符號佇列的同步,非中斷型軟體必須維持一個添加到佇列中的描述符號數量計數,而中斷處理程式則維持一個對已完結的、從佇列中除去的描述符號計數。計數次數僅在DMA完成對所有描述符號的處理後暫停時才會相等。

本文小結

本文討論了基於暫存器和基於描述符號的DMA數據串流結構,以及何時使用其中的某種結構。下一期將分析某些先進的DMA功能特色,這些功能將能在多媒體系統中有效地移動數據。

作者:

David Katz

Rick Gentile

ADI公司

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值