DMA基本原理 结构与应用
直接記憶體存取 ─基本原理、結(jié)構(gòu)與應(yīng)用(上)
直接記憶體存取( DMA )控制器 是一種在系統(tǒng)內(nèi)部轉(zhuǎn)移數(shù)據(jù)的獨(dú)特週邊設(shè)備,可將其視為一種能透過一組專用匯流排,將內(nèi)部和外部記憶體與每個具有DMA能力之週邊設(shè)備相連的控制器。它之所以屬於週邊設(shè)備,是因?yàn)樗窃谔幚砥?的編程控制下進(jìn)行傳輸。值得注意的是,通常只有數(shù)據(jù)流量較大(kBps或更高)的週邊設(shè)備才需支援DMA能力,典型應(yīng)用包括視訊、音訊和網(wǎng)路介面。
一般而言,DMA控制器將包含一條地址匯流排、一條數(shù)據(jù)匯流排和控制暫存器。高效率的DMA控制器將具有存取其所需之任意資源的能力,無須處理器介入,它必須能產(chǎn)生中斷。最後,它必須能在控制器內(nèi)部計(jì)算出地址。
一 個處理器可以包含多個DMA控制器。每個控制器都有多個DMA通道,以及多條直接與記憶體資料庫(memory bank)和週邊設(shè)備連接的匯流排,如圖1所示。許多高性能處理器均整合了兩種類型的DMA控制器。第一類通常稱為‘系統(tǒng)DMA控制器’,可實(shí)現(xiàn)對任何資 源(週邊設(shè)備和記憶體)的存取,對這種類型的控制器而言,訊號週期數(shù)是以系統(tǒng)時脈(SCLK)來計(jì)算的。以ADI的Blackfin處理器為例,頻率最高 可達(dá)133MHz。第二類稱之為內(nèi)部記憶體DMA控制器(IMDMA),專用於內(nèi)部記憶體所處位置之間的相互存取作業(yè)。由於存取都產(chǎn)生在內(nèi)部(L1- L1、L1-L2或L2-L2),其週期數(shù)的計(jì)算以核心時脈(CCLK)為基準(zhǔn),時脈速度可超過600MHz。
每個DMA控制器有一組FIFO,具有DMA子系統(tǒng)和週邊設(shè)備或記憶體間之緩衝器的作用。對於MemDMA(Memory DMA)來說,傳輸?shù)膩碓炊撕湍繕?biāo)端都有一組FIFO。當(dāng)資源吃緊無法完成數(shù)據(jù)傳輸時,FIFO可提供數(shù)據(jù)暫存區(qū)。
設(shè)計(jì)人員通常會在程式碼初始化過程中配置DMA控制器,因此核心僅需在數(shù)據(jù)傳輸完成後對中斷做出響應(yīng)即可??蓪MA控制進(jìn)行編程,讓它與核心平行地移動數(shù)據(jù),同時讓核心執(zhí)行其基本處理任務(wù)。
在 一項(xiàng)最佳化應(yīng)用中,核心永遠(yuǎn)不用參與任何數(shù)據(jù)的移動,僅需對L1記憶體中的數(shù)據(jù)進(jìn)行讀寫。於是,核心無需等待數(shù)據(jù)的到來,因?yàn)镈MA引擎會在核心準(zhǔn)備讀取 數(shù)據(jù)之前將數(shù)據(jù)準(zhǔn)備好。圖2為處理器和DMA控制器間的互動關(guān)係。由處理器完成的作業(yè)步驟包括:設(shè)立傳輸,啟用中斷,產(chǎn)生中斷時執(zhí)行程式碼。返回處理器的 中斷輸入可用來指示‘?dāng)?shù)據(jù)已準(zhǔn)備好,可進(jìn)行處理’的指令。
數(shù)據(jù)除了往返於週邊設(shè)備外,還必須從一個記憶體空間轉(zhuǎn)移到另一個空 間中。例如,視訊源可從一個視訊埠直接流入L3記憶體,因?yàn)楣ぷ骶徯n區(qū)規(guī)模太大,無法放入到記憶體中。我們並不希望讓處理器在每次需要執(zhí)行運(yùn)算時,都必須 從外部儲存讀取畫素資訊,因此,為了提高存取效率,可用一個記憶體到記憶體的DMA(MemDMA)來將畫素轉(zhuǎn)移到L1或L2記憶體中。
目前為止,我們還僅專注於數(shù)據(jù)的移動,但DMA的傳送能力並不僅限於移動數(shù)據(jù)。我們可用程式碼覆蓋的方法來提高性能,將DMA控制器配置為在執(zhí)行前將程式碼送入L1指令記憶體。程式碼往往儲存於較大的外部記憶體中,並根據(jù)需求有選擇性的送入L1。
圖1:系統(tǒng)和記憶體DMA架構(gòu)。
圖2:DMA控制器。
DMA控制器編程
讓我們瞭解在定義DMA活動的過程中可以有哪些選項(xiàng)。我們將從最簡單的模型開始,並在此基礎(chǔ)上過渡到更靈活的模型,這將增加設(shè)置的複雜度。
針 對任何類型的DMA傳輸,都必須規(guī)定數(shù)據(jù)的起始源和目標(biāo)地址。對於週邊設(shè)備DMA而言,週邊設(shè)備的FIFO可作為數(shù)據(jù)源或目標(biāo)端。當(dāng)週邊設(shè)備作為源端時, 某個記憶體的位置(內(nèi)部或外部)則成為目標(biāo)端地址。當(dāng)週邊設(shè)備作為目標(biāo)端,儲存的位置(內(nèi)部或者外部)則成為源端地址。
在最 簡單的MemDMA情況中,必須告訴DMA控制器源端地址、目標(biāo)端地址和待傳送的字符數(shù)。在採用週邊設(shè)備DMA情況下,可規(guī)定數(shù)據(jù)的源端或目標(biāo)端,具體取 決於傳輸方向。每次傳輸?shù)淖址笮】梢允?、16或12位元。這類事務(wù)代表了簡單的1維(1D)統(tǒng)一‘單一步距’(unity stride)的傳輸。作為這一傳輸機(jī)制的一部份,DMA控制器會連續(xù)追蹤不斷增加的源端和目標(biāo)端地址。採用這種傳輸方式時,8位元的傳輸會產(chǎn)生1位元組 的地址增量,而16位元傳輸產(chǎn)生的增量為2位元組,32位元傳輸則產(chǎn)生4位元組的增量。上述參數(shù)為基本1D DMA傳輸?shù)脑O(shè)定參數(shù)。
只需要改變每次傳輸?shù)臄?shù)據(jù)大小,就可以簡單地增加一維DMA的靈活性。例如,採用非單一大小的傳輸方式時,我們以傳輸數(shù)據(jù)區(qū)塊的大小倍數(shù)作為地址增量。也就是說,若規(guī)定32位元的傳輸和4個採樣的步距,則每次傳輸結(jié)束後,地址的增量為16位元組(4個32位元字)。
雖 然1D DMA獲得了廣泛應(yīng)用,但用處更大的是2維(2D) DMA,特別是在視訊應(yīng)用中。2D功能是1D DMA的直接擴(kuò)展。除了XCOUNT和XMODIFY值之外,還需對對應(yīng)的YCOUNT和YMODIFY值進(jìn)行編程設(shè)定。2D DMA可簡單地理解為一個層疊的迴圈,即內(nèi)部迴圈由XCOUNT和XMODIFY規(guī)定,外部迴圈由YCOUNT和YMODIFY規(guī)範(fàn)。一個1D DMA可簡單地視為2D傳輸?shù)摹畠?nèi)部迴圈’,如以下所示:
for y = 1 to YCOUNT /* 2D的外部迴圈*/
for x = 1 to XCOUNT /* 1D的內(nèi)部迴圈 */
{
/* 傳輸迴圈主體轉(zhuǎn)移到此處 */
}
XMODIFY 決定了XCOUNT每次減少時的DMA控制器步距值,而YMODIFY則決定了YCOUNT每次減少時對應(yīng)的步距值。與XCOUNT和XMODIFY一 樣,YOUNT能以傳輸數(shù)量來定義,而YMODIFY則以位元組數(shù)來定義。值得注意的是,YMODIFY可以為負(fù)值,這會讓DMA控制器回到緩衝器的起始 點(diǎn)。
對週邊設(shè)備DMA而言,傳輸?shù)摹洃涹w端’可以是1D或2D。不過,在週邊設(shè)備端,傳輸始終是1D的。唯一的限制是在 DMA每一端(源端和目標(biāo)端)傳輸?shù)奈辉M總數(shù)必須相同。例如,若從3個10位元組的緩衝器向週邊設(shè)備發(fā)送數(shù)據(jù),週邊設(shè)備必須被設(shè)定為傳送30位元組,具 體方式可以是任何所支援之傳輸寬度和傳輸計(jì)數(shù)值的組合。
MemDMA提供的靈活度更高一些。例如,若我們設(shè)立一個1D-D傳輸、一個1D-2D傳輸、1個2D-1D傳輸,且可自然設(shè)立一個2D-2D傳輸,唯一的限制條件是,在DMA傳輸模組兩端所傳送的位元組總數(shù)必須相等。
DMA的設(shè)置
目 前有兩類主要的DMA傳輸結(jié)構(gòu):暫存器模式和描述符號模式。無論屬於哪一類DMA,表1描述的幾類資訊都會在DMA控制器中出現(xiàn)。當(dāng)DMA以暫存器模式工 作時,DMA控制器只是簡單地利用暫存器中所儲存的參數(shù)值。在描述符號模式中,DMA控制器會在記憶體中查找自己的配置參數(shù)。
表1:DMA暫存器
基於暫存器的DMA
在基於暫存器的DMA內(nèi)部,處理器直接對DMA控制暫存器進(jìn)行編程,以啟動傳輸。基於暫存器的DMA提供了最佳化DMA控制器性能,因?yàn)闀捍嫫鱽K不需要不斷地從記憶體中的描述符號上載入數(shù)據(jù),而核心也不需要保持描述符號。
基於暫存器的DMA由兩種子模式組成:自動緩衝(Autobuffer)模式和停止模式。在自動緩衝DMA中,當(dāng)一個傳輸區(qū)塊傳輸完畢,控制暫存器就自動重新載入其最初的設(shè)定值,同一個DMA程序會重新啟動,無任何開銷。
如 圖3中所示,若將一個自動緩衝DMA設(shè)定為從週邊設(shè)備傳輸一定數(shù)量的字符到L1數(shù)據(jù)記憶體緩衝器上,則DMA控制器將會在最後一個字符傳輸完成時迅速重新 載入初始參數(shù)。這構(gòu)成了一個‘循環(huán)緩衝器’,因?yàn)楫?dāng)一個量值被寫入到緩衝器的最後一個位置上時,下一個值將被寫入到緩衝器的第一個位置上。
圖3:用DMA實(shí)現(xiàn)循環(huán)緩衝器。
自 動緩衝DMA特別適合對要求高性能,並要求連續(xù)數(shù)據(jù)串流的應(yīng)用。DMA控制器可在獨(dú)立於處理器的其他活動情況下讀入數(shù)據(jù)串流,然後在每次傳輸結(jié)束時向核心 發(fā)出中斷。雖然有可能以恰當(dāng)?shù)姆绞阶柚棺詣泳徯n模式,但若DMA程序需要定期啟動和停止時,採用這種工作方式就沒有什麼意義。
停 止模式的工作方式與自動緩衝DMA類似,區(qū)別在於DMA結(jié)束後,各暫存器不會重新載入,因此整個DMA傳輸只產(chǎn)生一次。停止模式對於基於某種事件的一次性 傳輸來說十分有用。例如,非定期地將數(shù)據(jù)區(qū)塊從一個位置轉(zhuǎn)移到另一個位置。當(dāng)你需要對事件進(jìn)行同步時,這種模式也非常有用。例如,若一個任務(wù)必須在下一次 傳輸前完成,則停止模式可確保各事件產(chǎn)生的先後順序。此外,停止模式對緩衝器的初始化來說非常有用。
描述符號模型
基 於描述符號(descriptor)的DMA要求在記憶體中存入一組參數(shù),以啟動DMA的系列作業(yè)。該描述符號所包含的參數(shù)與那些通常透過編程寫入DMA 控制暫存器組的所有參數(shù)相同。不過,描述符號容許串聯(lián)多個DMA作業(yè)序列。在基於描述符號的DMA作業(yè)中,可對一個DMA通道進(jìn)行編程,在目前的作業(yè)序列 完成後,自動設(shè)置並啟動另一次DMA傳輸。基於描述符號的方式為管理系統(tǒng)中的DMA傳輸提供了極大靈活性。
ADI的Blackfin處理器上有兩種主要的描述符號方式─描述符號陣列和描述符號列表,這兩種作業(yè)方式所要實(shí)現(xiàn)的目標(biāo)是在靈活性和性能間實(shí)現(xiàn)折衷。
在 描述符號陣列模式下,描述符號駐留在連續(xù)的記憶體位置上。DMA控制器依然從記憶體取用描述符號,但由於下一個描述符號緊跟著目前的描述符號,因此,說明 到何處尋找下一個描述符號(及其相應(yīng)的描述符號取用)的兩個數(shù)據(jù)字就沒有必要。因?yàn)槊枋龇杹K不包含此一‘下一描述符號’指針項(xiàng)目,DMA控制器希望一組 描述符號在記憶體中像陣列般排列。
當(dāng)各描述符號在記憶體中的分佈位置並非‘背對背’時,可使用一個描述符號列表。事實(shí)上,此 處涉及了多種子模式,再一次實(shí)現(xiàn)了性能與靈活性之間的平衡。在‘小描述符號’模型中,描述符號包含一個單16位元的域,可提供‘下一描述符號指針’域的低 位元部份;高位元部份則透過暫存器來獨(dú)立編程設(shè)定,且不產(chǎn)生改變。當(dāng)然,這會將描述符號限制在記憶體中的一個特定64K(=216 )頁面上。當(dāng)描述符號的位置必須跨越此一邊界時,也能提供一個‘大’的模型,它可以為‘下一描述符號指針’項(xiàng)目提供32位元的位置。
無 論採用何種描述符號模式,描述符號的量值數(shù)量越多,則描述符號取用的次數(shù)就越多。這是為何Blackfin處理器定義了一個‘靈活描述符號方式’的原因, 該模式可修改描述符號的長度,使其僅包含特定傳輸所需的數(shù)據(jù)。例如,若不需要2D DMA,YMODIFY和YCOUNT暫存器就不需要成為描述符號數(shù)據(jù)區(qū)塊的一部份。
描述符號管理
管理描述符號列表的最佳方法是什麼?其實(shí),這個問題的答案必須根據(jù)應(yīng)用來定,但必須瞭解存在著何種替代方案。
第 一種可選方案的工作方式非常類似於一個自動緩衝DMA。它必須設(shè)定多種描述符號,並將之串聯(lián),如圖4a所示。‘串聯(lián)’意味著一個描述符號指向下一個描述符 號,描述符號的載入是自動的。為了使鏈條完整,最後一個描述符號會反向指向第一個描述符號,於是整個流程就會重複。使用這種技術(shù)而非自動緩衝的理由是,這 些描述符號可保證傳輸?shù)囊?guī)模,同時在方向上具有更大靈活性。
圖4:由處理器進(jìn)行調(diào)控的DMA描述符號:(a)鏈接的描述符號列表;(b)‘節(jié)流調(diào)節(jié)式’的描述符號管理。
第 二個選擇則是由處理器來管理描述符號列表?;叵胍幌?#xff0c;描述符號實(shí)際上是記憶體中的一種結(jié)構(gòu),每個描述符號包含了一個配置字符。每個配置字符均包含了‘使 能’位元,其作用是在傳輸開始時進(jìn)行調(diào)節(jié)。若必須讓處理器在做好準(zhǔn)備時啟動每次具體傳輸,就可事先設(shè)定所有的描述符號,但把‘使能’位元清零。當(dāng)處理器確 定啟動描述符號的時機(jī)已經(jīng)到來,就僅需簡單地更新記憶體中的描述符號,然後寫入DMA暫存器中,以啟動處於停止?fàn)顟B(tài)的通道,如圖4b所示。
這 種類型的傳輸可用於何種領(lǐng)域呢?請考慮一個需要將輸入串流與輸出串流實(shí)現(xiàn)同步的多媒體應(yīng)用。如在接收視訊採樣時,將其傳輸?shù)接洃涹w的速率可能會不同於將該 視訊輸出顯示的速度。在實(shí)際系統(tǒng)中,即使試圖讓串流以恰好相同的時脈傳輸,也會產(chǎn)生這種情況。在同步成為問題的情況下,處理器可調(diào)整對應(yīng)於輸出緩衝器的 DMA描述符號。在下一個描述符號啟用時,處理器可透過調(diào)整目前的輸出描述符號以實(shí)現(xiàn)串流同步,具體方式是利用一種訊號量機(jī)制(semaphore mechanism)來確保每次只有一個項(xiàng)目存取共享資源。
在處理器之間使用內(nèi)部的DMA描述符號鏈或基於DMA的串流時,一種有用的做法是在所傳輸?shù)臄?shù)據(jù)區(qū)塊末尾添加一個額外字符,協(xié)助標(biāo)識正被發(fā)送的封包,該封包包含了如何處理數(shù)據(jù)的資訊和時間戳記。圖4b中虛線部份顯示了這種方案。
大 多數(shù)成熟的應(yīng)用都有以軟體形式實(shí)現(xiàn)的‘DMA管理器’功能。這可作為作業(yè)系統(tǒng)或即時核心的一部份來提供,但它也能在沒有這兩者的條件下執(zhí)行。在 Blackfin處理器上,該功能可作為VisualDSP++工具套件之‘System Services’的一部份。這一管理功能可透過標(biāo)準(zhǔn)API來轉(zhuǎn)移數(shù)據(jù),無需手工配置每一個控制暫存器。
基本上,一個應(yīng)用將 DMA描述符號的要求提交給DMA佇列管理器,其責(zé)任是處理每一次請求。請求的處理則是依照其被應(yīng)用軟體接收到的順序來進(jìn)行。指向‘回調(diào)’函數(shù)的地址指針 往往也是系統(tǒng)的一部份。該函數(shù)可完成在數(shù)據(jù)緩衝準(zhǔn)備好時你希望處理器來完成的工作,無需讓核心停留在高優(yōu)先級的中斷服務(wù)例程執(zhí)行中。整體而言,DMA管理 器可簡化編程模型。
有兩種通用方法可管理採用中斷的描述符號佇列:第一種是基於在每次描述符號完結(jié)時所發(fā)出的中斷,只有當(dāng)你 能確保每個中斷事件將單獨(dú)得到服務(wù)、無中斷溢出時才使用這種方法;第二種方法是僅在由一個工作區(qū)塊之最後描述符號所規(guī)定的工作傳輸結(jié)束時發(fā)出中斷。工作區(qū) 塊是一個或多個描述符號的集合。
為了保持描述符號佇列的同步,非中斷型軟體必須維持一個添加到佇列中的描述符號數(shù)量計(jì)數(shù),而中斷處理程式則維持一個對已完結(jié)的、從佇列中除去的描述符號計(jì)數(shù)。計(jì)數(shù)次數(shù)僅在DMA完成對所有描述符號的處理後暫停時才會相等。
本文小結(jié)
本文討論了基於暫存器和基於描述符號的DMA數(shù)據(jù)串流結(jié)構(gòu),以及何時使用其中的某種結(jié)構(gòu)。下一期將分析某些先進(jìn)的DMA功能特色,這些功能將能在多媒體系統(tǒng)中有效地移動數(shù)據(jù)。
作者:
David Katz
Rick Gentile
ADI公司
總結(jié)
以上是生活随笔為你收集整理的DMA基本原理 结构与应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝牙耳机连接电脑后再连接手机接听电话没有
- 下一篇: 如何将USB移动硬盘做成DOS启动盘