直接記憶體存取─基本原理、結構與應用(下)
關鍵字:DMA 直接記憶體存取 Blackfin處理器
在上一期中,我們討論了分別基於暫存器和描述符的DMA模式。在本文中,我們將在系統層面上探討應用中關於數據移動的各種選項所應做出的某些重要的決策問題,以及某些先進DMA功能特性如何協助數據在多媒體系統中有效地移動。首先讓我們重新回顧DMA模式,以說明關於何時選擇其中一種模式而非另一種模式的指導原則。
對於規模相同、連續、單向的數據傳輸來說,自動緩衝方案是最理想的。DMA配置暫存器只要設置一次,就可以自動地在傳輸結束的時候重新載入。如果採用多維尋址,則可以設置多重緩衝,在每次緩衝結束時可以單獨設置各次中斷的觸發。
到一個音訊編碼解碼器的傳輸就是這種類型事務。你所選取的子緩衝區數量應該與你需要執行的處理類型一致。對於連續傳輸來說,只要確保能讓每個緩衝器的最大處理間隔小於取盡一個緩衝器所花費的時間即可。
如果特定通道上的傳輸在方向和尺寸上都將是可變的,描述符模式就是最佳的選擇。試著考慮在內部和外部記憶體間產生的一系列小規模傳輸,若數據區塊容量產生變化,或你希望以一種非連續的方式來在緩衝器中處理數據,則可為此設立描述符。
快取記憶體vsDMA
我們接下來將探討系統數據轉移的某些情形,在這些情形中,我們必須在快取記憶體和DMA之間做出選擇。為此,我們首先需要考察一項在應用內部存在的各種數據移動類型。
透過晶片上週邊設備將數據轉移到系統內或系統外是一種最容易說明問題的情況,因此,我們以這些數據的轉移為起點開始討論。許多週邊設備可在使用核心存取或使用DMA通道來轉移數據之間做出選擇。一般來說,如果可以選擇,你應該使用DMA通道。DMA控制器之所以成為最佳選擇,是因為數據往會延遲或提早來到,但處理器無法高效地對其進行即時處理。
當我們採用慢速串列元件(如SPI埠或者UART)時,數據的傳輸速率遠低於處理器核心執行的速度。核心對這類週邊的存取必然涉及對一個映射記憶體暫存器的某些位元輪詢。即使當週邊設備的工作速度與處理器時脈相較非常低(這意味著存取頻率將會降低),輪詢也是一種浪費。在某些情況下,週邊設備有能力發出中斷,指示核心傳輸已經產生。不過,在這裡,每次增量數據傳輸完成後都會遇到為中斷提供服務的開銷問題,包括前後條件(context)切換的時間。
另一方面,使用DMA控制器來執行傳輸,將使系統可精密地控制在發出中斷前所完成的傳輸次數。而且,這種中斷可以在每個數據區塊的末尾產生,而不僅僅是在每個位元組或者字符之後。
在吞吐率分佈的另一端,更高速(如10~100MHz)的平行週邊設備可能無法選擇核心傳輸方式。主要原因為:首先,以這種方式進行設定時,處理器會頻繁地存取週邊設備;其次,與高速週邊設備相關的處理幾乎都是針對數據區塊進行的。無論是在一個訊號處理應用中透過FFT完成,還是在影像處理系統中進行二維卷積(convolution),處理器在送往緩衝器的最後一個數據採樣一到達時,就會開始其作業。此處用於指示一個數據區塊傳輸結束的中斷可以出現在數百次甚至上千次傳輸中。
無論週邊設備進行何種類型的傳輸,DMA通道都應該具有多個緩衝器,以便讓處理器能在數據填充入下一個緩衝器時存取目前的緩衝器。如果系統更複雜,則有可能需要實現多個同步進行的數據區塊傳輸。例如,除了可以存取目前的數據區塊並採集下一個數據區塊,還可能有必要將最後一個處理過的數據區塊發出,以備未來之需。類似的,要處理目前的訊框,也有可能需要參考數據區塊。各種不同類型的應用都確實存在這一情形,包括大多數類型的視訊壓縮應用。
DMA控制器特性
為了在多媒體系統中有效地運用DMA,必須有足夠多的DMA通道,有一對以上的記憶體DMA(MemDMA)串流可充分支援處理器的週邊設備集。這是一個重要的問題,因為必然存在如下的情況:在未經處理的媒體串流透過高速週邊設備進入外部記憶體時,數據區塊在外部記憶體和L1記憶體之間來回傳輸,以供核心處理。而且,DMA引擎允許在週邊設備和外部記憶體間進行直接數據傳輸,而不要求數據在L1記憶體中‘暫駐’,這可以在一些數值運算密集的演算法執行中避免額外的數據傳遞。
程式開發者常犯的一個錯誤會使開發過程中的除錯問題複雜化。週邊設備及其相應的DMA通道往往會提供一個可選的錯誤中斷,在開發中該中斷應該始終處於使能狀態,這樣可以節省數小時的除錯時間。錯誤中斷通常用來指示編譯的程式中出現了某些錯誤(容易解決),或週邊設備的下溢/溢出(情況更為複雜)。很多情況下,當編程人員在計劃開始之際,用數據串流來設立框架(framework)時,這些類型的問題只會在後來執行中,當應用處理元件被加上時才出現。
其他重要的DMA特性還包括對DMA通道設定優先級,以滿足目前週邊設備任務要求,以及對相應DMA中斷進行配置以便與這些優先級水準相匹配的能力。這些功能有助於確保數據的緩衝區不會由於DMA活躍在其他週邊設備上而出現溢出,它們為程式開發者提供了額外的自由度,能根據每個DMA通道的數據往來情況對整個系統進行最佳化。
系統性能調整
隨著數據率和性能要求的提高,設計者是否具備‘系統性能調整’等控制選項也變得十分關鍵。例如,DMA控制可針對在每個時脈週期上傳送一個數據字符的需求進行最佳化。當同一方向上有多個傳輸在進行時(如均從內部記憶體發往外部記憶體),這往往是對控制器進行操控的最有效方法,因為它能防止DMA匯流排出現閒置。
但是,在需要進行多工雙向視訊和音訊串流傳輸的情況下,‘方向控制’就成為必不可少的措施,其目的是防止一條數據串流完全佔用整條匯流排。例如,如果DMA控制器始終將DMA匯流排的使用權交給任何一個準備好傳輸一個數據字符的週邊設備,則使用外部DRAM時總吞吐率將會下降。在每個數據傳輸週期幾乎都會變換方向的情況下,外部記憶體匯流排花費的轉向時間所導致的相應延遲將會顯著降低吞吐率。
於是,可以讓通道來編程設定突發量大小(burst size)的DMA控制器,其性能便高於傳輸大小固定的控制器。因為每個DMA通道都可將週邊設備與內部或外部記憶體連接,因此,為可能發出緊急佔用匯流排請求的週邊設備提供自動服務的能力也相當重要。
對於多媒體應用來說,晶片上記憶體幾乎無法儲存整個視訊訊框數據。因此,系統往往必須依靠L3 DRAM來支援相對較快的、對大型緩衝區的存取。必須仔細考量涉及高效媒體框架的處理器與外部記憶體之間的通訊,因為對外部記憶體的存取模式必須經過深思熟慮,以保證最佳的數據吞吐能力。
使用DMA和/或快取記憶體有助於提高記憶體性能,因為它們實現了大量數據區塊在同一方向上的傳輸。DMA傳輸一般是將大的數據緩衝區從一個位置轉移到另一個位置,而快取記憶體線填充(cache-line fill)則是將一組連續記憶體中的數據移入或移出設備,利用同方向的區塊傳輸來實現。
除了使用DMA或快取記憶體,還有一些可確保數據串流能流暢通過任何系統中記憶體的執行步驟。兩個關鍵步驟分別是類似的傳輸編組以及優先級分配和裁決方案。
多媒體系統應用考量
1. 使用DMA控制器過濾數據
DMA控制器可用於‘過濾’從相機流入一個系統的數據量。讓我們考慮一個視訊串流正被送入記憶體進行某種處理的情形,當數據並不需要被再次送出來進行顯示時,就不必將逆程消隱(blanking)數據送入記憶體緩衝區。
處理器的視訊埠常常直接連接到一個視訊解碼器或一個CMOS感測器上,並連續地接收採樣。也就是說,外部元件不斷送入數據和空白顯示資訊。DMA控制器可被設定為僅僅把有效視訊送入記憶體中,該功能可同時節省記憶體空間和匯流排頻寬。
對NTSC視訊串流而言,這種消隱顯示資訊佔總輸入視訊頻寬的20%以上。記憶體節省帶來的好處並不大,因為額外的儲存空間可透過外部SDRAM提供,而所帶來的系統成本變化很小。更重要的是,在總處理週期中所節省的頻寬,以及通常用於輸入消隱顯示資訊的時間,都可以重新分配給系統中的其他任務。例如,這些頻寬或時間可用來發送壓縮的數據或輸入來自過去的訊框基準數據。
2. 雙重緩衝
通常,在源視訊和最終顯示的內容間存在數據率差異的系統中,有必要在原有內容和新的視訊訊框間實現平滑切換,這可透過使用雙重緩衝設置來實現。一重緩衝指向目前的視訊訊框,該訊框以一定的刷新速率發送到顯示器;第二重緩衝則填入最新輸出的訊框。當後一重緩衝區被填滿時,DMA則發出中斷訊號,顯示該將新的訊框輸出到顯示器了。此時,第一重緩衝開始用處理過的、待顯示的視訊訊框進行填充,而第二重緩衝則輸出目前顯示的訊框。雙重緩衝以類似於‘打乒乓球’的方式來回切換。
應注意的是,除了雙重緩衝外,也可以使用多重緩衝,以便為同步化提供更多餘量,以及降低中斷的頻率和相應的延遲。
3. 2D DMA的考慮
當數據透過數位鏈路(如I2S)傳輸時,它可能包含幾個通道。例如,這些通道必須能在一個數據線內透過同一個串列埠傳輸。此時,2D DMA可對數據進行解交織(interleaving)處理,以便讓每個通道在記憶體上直線排列。圖1中來自左右通道的採樣被解多工,變成兩個單獨的數據區塊。這種自動化的數據分配結構對於採用數據區塊處理的系統來說具有極高的價值。
圖1:一種用於將(a)I2S立體聲數據解交織,傳輸到(b)分離的左、右緩衝區2D DMA引擎。
對視訊傳輸來說,2D DMA提供了若干系統級的優勢。對於剛開始著手的開發者來說,二維 DMA可簡化巨集模組與外部記憶體間的傳輸,讓數據處理成為實際傳輸作業的一部份,這消除了傳統上傳送非連續數據所需的額外開銷。它還能讓系統透過有選擇的傳輸(如僅傳輸一幅輸入影像中所需區域,而非整幅影像)來大幅減少數據頻寬。
另外一個例子是2D DMA可讓數據以一種對處理來說更自然的順序放置在記憶體中。如圖2所示,RGB數據可從一個CCD感測器出發,以交織的RGB888格式進入處理器的L2記憶體,若採用2D DMA,它可依照紅、綠、藍分別送入L3記憶體。視訊和影像數據色彩空間分量的交織/解交織可省下在處理前進一步移動數據的麻煩。
圖2:透過2D DMA分離間插在一起的數據。
4. 同步的音訊和視訊串流
在一個多媒體系統中,串流內容往往同時包含音訊和視訊分量。鑒於這些串流執行的數據率,必須用DMA通道來與音訊編碼/解碼器和視訊編碼器進行通訊。重點是必須確保串流是同步的,因為這種協同性是觀看品質的一個主要影響因素。
維持同步有多種方法,最常用的技術是為每組音訊和視訊緩衝區設立一組DMA描述符號表,並讓處理器管理這些表。
由於音訊串流中的數據丟失比視訊訊框的丟失更容易引起人們的注意,音訊緩衝往往被設定為‘主’串流。即必須讓音訊緩衝區以連續模式進行循環運轉更為重要。透過保證音訊串流的連續性,處理器可對視訊訊框顯示進行任何必要的調整。從DMA緩衝區的角度來看,針對每個音訊和視訊緩衝器分別產生一組描述符。每個描述符表設置為可用一對指針來控制,一個指針用於填充緩衝區,而另一個則用於清空緩衝區。
每個描述符表都必須更新維護,以確保讀取和寫入指針不會相互‘交叉’,即處理器不應該對正在發送數據的緩衝器進行刷新。類似的,DMA的控制器不應該對處理器正對其填充數據的緩衝區進行數據填充作業。
為了實現音視訊同步,必須保持一個總時間基準。每一個解碼後的數據緩衝區都可在記憶體中利用對應的時間標籤(time tag)來設立。如果音訊串流是‘主’串流,寫入緩衝就是完全循環性的。如果視訊訊框不得不丟棄,負責緩衝器清空的DMA指針可被重新編程設定為與最接近目前之音訊緩衝數據的時間戳記時間一致。
5. 利用DMA控制器降低功率
在一個具有電源管理功能設計的處理器上,DMA控制器可以為系統整體功耗降低提供一種有價值的工具。
當處理器並不對緩衝區進行積極操控時,它可以設定為處於空閒狀態。處於這種無活動狀態時,時脈可以被關閉,有時甚至電壓也會被降低─這兩種措施都將減少處理器功耗。
可考量一種音訊解碼系統。其處理器對編碼後的內容進行解碼作業。解碼後的緩衝數據在記憶體中累積起來,一旦緩衝區碰上‘高水位’(high-water)標記時,處理器就被置於休眠模式,同時,DMA控制器則從緩衝器中採集數據,饋送給音訊編碼/解碼器。為了保證良好的音訊品質,這種傳輸必須連續進行。
若要實現‘低水位’標記,則可透過將DMA控制器編程為在傳輸一定數據採樣量後即發出一個中斷訊號。中斷則可被編程設定為喚醒事件,讓處理器脫離其休眠模式。處理器可重新填滿緩衝區,於是,當DMA控制回轉到緩衝區的起始點時,就可以提供新的數據。
如果這個過程可連續執行,則處理器的工作週期(即處理器有效工作的時間)將大幅降低。
本文小結
一個複雜的系統可能會涉及大量平行執行的DMA通道。當DMA通道用描述符進行編程設定時,描述符的數量會出現爆炸性成長。在這些情況下,最好是實現某種形式的DMA佇列管理器。DMA管理器在用來管理平行傳輸的調度時也有很好的效果。
總之,一個DMA控制器是任何多媒體系統的重要組成部份。瞭解其複雜性,以便充分對一項應用進行最佳化,具有十分重要的意義。然而,它絕不是系統中唯一的執行操控元件,人們也必須處理好其他的系統資源,如記憶體和處理器核心與DMA控制器間的關係,要在它們之間實現完美的平衡,就必須瞭解數據在系統中的轉移基本過程和原理。
作者:
David Katz
Rick Gentile
ADI公司
社區今日頭條 |
---|