實(shí)時(shí)圖像處理系統要求系統必須在有限的時(shí)間內完成大量數據的運算。DSP以其獨特的哈佛總線(xiàn)結構和并行的存儲塊結構,將乘法操作與加法操作統一考慮,可以在一個(gè)指令周期完成般處理器的多次運算;并且指令系統采用多級流水線(xiàn)操作方式,保證了系統對實(shí)時(shí)性的要求,因此得以在實(shí)時(shí)圖像處理系統廣泛應用。圖像處理系統的最大特點(diǎn)就是運算數據量大。大多數情況下,數據量遠遠大于片內存儲器容量,計算過(guò)程中必須進(jìn)行數據的交換。合理使用DMA可以提高數據傳輸效率,取得事半功倍的效果。本文以TMS320C6701(簡(jiǎn)稱(chēng)C6701)為例,介紹DMA在圖像處理中的幾種典型應用。 1 圖像處理系統特點(diǎn)與使用DMA的必要性 前面已經(jīng)提到,圖像處理系統的最大特點(diǎn)是就是運算數據量大,數據量往往大于片內存儲器容量。不僅如此,圖像處理系統之中,運算過(guò)程產(chǎn)生的中間數據往往與源數據大小相當,這也限制了片內高速存儲區的使用。然而為了提高處理的速度,計算源數據、中間數據必須盡可能多地在片內高速存儲區進(jìn)行,因此,必須使用DMA在片內高速存儲區與片外低速存儲區之間進(jìn)行數據交換,以提高數據處理速度。 另外,數據的排列往往不符合程序的要求;必須對數據進(jìn)行重排達到程序要求;使用DMA對數據重排,可以滿(mǎn)足程序要求。與數據重排如出一轍,圖像處理中許多操作的基礎都是對多重數組的操作,也就是矩陣運算。諸如求逆、取子圖等圖像處理中經(jīng)常用到的運算,也可以通過(guò)DMA完成。這些運算當然可用C語(yǔ)言編程實(shí)現,但是,如果程序實(shí)現是一個(gè)多重循環(huán),不利于軟件流水,而且隨著(zhù)數據量的增加,消耗的時(shí)鐘周期也會(huì )成比例增加;即使使用并行匯編在時(shí)鐘消耗上可以有所減少,這都是不符合系統實(shí)時(shí)性要求的。如果通過(guò)DMA數據重排,可以輕而易舉地實(shí)現,而且這個(gè)過(guò)程CPU只占有一個(gè)時(shí)鐘周期,通過(guò)巧妙程序安排,安全可以使數據的傳輸過(guò)程在CPU的后臺進(jìn)行,根本感覺(jué)不到DMA的存在。 2 C6x系列DMA簡(jiǎn)介 TMS320C6701S是TMS320C6000系列的高速浮點(diǎn)數字信號處理信號,是TI公司20世紀90年代后期的最新一代DSP產(chǎn)品。C6701有4個(gè)通道自加載的DMA通道,用于數據的DMA傳輸;另外,1個(gè)輔助DMA通道,負責與主機通信。DMA通道可以在沒(méi)有CPU參與下完成映射空間的數據傳輸。數據的傳輸可以是片內存存儲器、片內外圍部件或外部器件之間的傳輸。 2.1 DMA控制寄存器 對于C6x系列的DMA,在使用任何一個(gè)DMA通道進(jìn)行數據傳輸前,都必須設置以下幾組寄存器。各寄存器及其功能如下: *主控寄存器(primary control register)——用于控制DMA狀態(tài)及傳輸類(lèi)型; *副控寄存器(secondary control register)——用于使能CPU中斷,監視DMA通道狀態(tài); *傳輸計數寄存器(transfer control register)——用于記錄傳輸的單位數目; *源地址寄存器(source control register)——傳輸的起始地址 *目標地址寄存器(destination control register)——傳輸的目的地址; 此外,DMA通道可以使用以下全局DMA寄存器,以完成比較復雜的傳輸過(guò)程: *全局地址寄存器組(global address register A、B、C和D); *全局索引寄存器組(global index register A和register A和B)。 全局地址寄存器組共有4個(gè)32位寄存器,其作為分裂地址或地址重載值。全局索引寄存器2個(gè)32位寄存器。每個(gè)寄存器含2個(gè)控制域,其中高16位為幀索引域(FRAME INDEX),其值為幀間的地址偏移量,也就是傳輸完1幀后,地址的調整量;低16位為數據單元索引域(ELEMENT INDEX),其值為幀內地址偏移量,也就是每傳輸完1個(gè)數據單元的地址調整量。全局計數重載計數器與全局索引寄存器結構一樣,用于重載DMA通道的傳輸計數寄存器。全局DMA寄存器可以為任意DMA通道使用,而且同一寄存器可以同時(shí)被一個(gè)以上的DMA通道使用。 2.2 DMA工作過(guò)程簡(jiǎn)介 DMA是十分復雜的系統,限于篇幅,這里只簡(jiǎn)要介紹DMA的工作過(guò)程。 在C6000系列DMA中,把所傳輸的一定數量的數據單元(ELEMENT)稱(chēng)為幀(FRAME),幀的大小由傳輸計數寄存器的低16位數據即單元計數域(ELEMENT COUNT)指定,該寄存器的值通過(guò)傳輸計數寄存器的高16位即幀計數域(FRAME COUNT)指定。當完成1次DMA讀操作,ELEMENT COUNT值自動(dòng)域1;當最后1個(gè)數據單元讀操作完成時(shí),FRAME COUNT自動(dòng)減1,此時(shí)ELEMENT COUNT的值將被全局計數重載寄存器的ELEMENT COUNT更新;當最后1幀的讀操作完成后,傳輸計數寄存器將被全局計數重載寄存器的值更新。 DMA控制器負責對每個(gè)通道的讀寫(xiě)傳輸進(jìn)行地址計算。在計算機傳輸地址時(shí),有基本調整和使用全局索引寄存器進(jìn)行調整2種方式:基本調整是指通過(guò)控制域SRC DIR和DST DIR來(lái)設置傳輸地址,按數據字長(cháng)大。ㄓ蒃SIZE控制)遞增、遞減或保持不變;而使用全局索引寄存器調整與基本調整不同,這種模式下,根據傳輸的數據元素是否當前幀的最后一個(gè)來(lái)進(jìn)行地址調整。 在全局索引寄存器調整模式下,地址調整值由全局索引寄存器控制。全局索引寄存器含2個(gè)控制域,其中高16位為幀索引域(FRAME INDEX),其值為幀間的地址偏移量,也就是傳輸完1幀后的地址調整量;低16位為數據單元索引域(ELEMENT INDEX),其值的幀內地址偏移量,也就是每傳輸完1個(gè)數據單元的地址調整量。 3 幾種典型的DMA操作及其應用 3.1 塊移動(dòng) 塊移動(dòng)能夠將1塊連續數據塊從一個(gè)地址傳輸到另一個(gè)地址,通常用于將數據或程序從外部存儲器移到內部存儲器。這種塊移動(dòng)是最簡(jiǎn)單、最常見(jiàn)的DMA工作方式。例如,將1塊1K連續的32位數據塊從外存(0x02000000)移動(dòng)至內存(0x80000000),如圖1所示。 相關(guān)寄存器的值設置: Primary control register =0x00000050 Transfer control register =0x00000400 Source control register =0x02000000 Destination control register =0x80000000 其中主控寄存器各控制域設置與意義如下: DST RELOAD =00 無(wú)目標地址重載 SRC RELOAD =00 無(wú)源地址重載 EMOD =0 FS =0 無(wú)幀同步 TCINT =1 允許中斷 PRI =1 DMA優(yōu)先 WSYNC =00000 無(wú)讀同步 RSYNC =000 無(wú)寫(xiě)同步 RSYNC =00 無(wú)寫(xiě)同步 FRAME COUNT =0X000 ELEMENT COUNT =0X0400 INDEX =0 全局計數重載寄存器A CNT RELOAD =0 全局計數重載寄存器A SPLIT =00 無(wú)分裂地址 ESIZE =00 數據單元4BYTES DSTDIR =11 索引寄存器方式 SRCDIR =01 地址遞增 STATUS =00此位只讀 START =00 DMA停止 在主控寄存器的START讀中寫(xiě)入01b就可以開(kāi)始DMA的傳輸。 3.2 數據重排 往往數據的格式并不符合運算的要求。在這種情況下,可以通過(guò)DMA進(jìn)行數據重新排列,以滿(mǎn)足運算的要求。數據重排主要是利用DMA的幀傳輸方式。數據重排所必需的、最關(guān)鍵的一步是設置全局寄存器,所以,以下討論的重點(diǎn)就是全局寄存器的設置。 3.2.1 求矩陣轉置 圖2顯示了將一個(gè)位于外存16bit的連續數據區,開(kāi)始地址(0x02000000),數據重排并移至片內存儲區,首地址為(0x80000000)前后的排列情況。 在數據重排中,主要是正確設置全局索引寄存器。在這里,可以將1幀看作1個(gè)數組,那么數據單元就是數組的元素。因此,如果假設共有F%26;#215;E的矩陣,即有F幀數據,每幀E個(gè)數據單元,每個(gè)元素為S(Byte),重排為E%26;#215;F的矩陣。在這種情況下,源地址遞增,目標地址根據全局索引寄存器的值進(jìn)行調整。在幀內相鄰的數據單元傳輸時(shí),目標地址偏移應為F%26;#215;S,所以傳輸完1幀后的地址總偏稱(chēng)為(E-1)%26;#215;F,因此,下一幀的第1個(gè)數據單元地址為在當前的地址減去((E-1)%26;#215;F-1)%26;#215;S。也就是說(shuō), *FRAME INDEX應設為-((E-1)%26;#215;F-1)%26;#215;S *ELEMENT INDEX應設為F%26;#215;S 在上例中寄存器的設置為: *FRAME INDEX =-((2-1) %26;#215;4-1) %26;#215;2=0xFFEE *ELEMENT INDEX=4%26;#215;2=8 因此,寄存器設置如下: Primary control register =0x030001D0 Transfer control register =0x00040002 Source control register =0x02000000 Destination control register =0x80000000 Global index register A =0xFFFA0008 Global count reload A =0x00000002 3.2.2 取圖像子圖 圖像處理中,往往要從圖像中摳取一定大小的子圖,然后對子圖進(jìn)行處理。對于大型圖像,尺寸往往超過(guò)了DSP系統的片內存儲器的大小,這種摳取的操作成了必不可少的步驟。這可以通過(guò)使用全局索引寄存器來(lái)完成。例如,從一個(gè)8%26;#215;4的圖像中摳取一個(gè)2%26;#215;4的子圖,如圖3所示,其中每個(gè)數據單元為1Byte。 可以這樣描述:有F1幀數據,每幀數據有E1個(gè)數據單元,每個(gè)數據單元為S(Byte);從中摳取部分為F2幀數據,每幀數據E2個(gè)數據單元,數據單元為S(Byte)。這種情況下,因為完成數據傳輸后,目標存儲區為連續數據,因此目標地址遞增;源地址根據全局索引寄存器的值進(jìn)行調整。幀內相鄰的數據單元傳輸時(shí),源地址偏移應為S;當讀完幀的最后一個(gè)數據單元,源地址指針跳過(guò)(E1-E2)個(gè)數據單元,即幀間的地址調整量為((E1-E1)+1)%26;#215;S。這樣全局寄存器的設置: **FRAME INDEX =((8-4)+1%26;#215;1=4 *ELEMENT INDEX=1 *FRAME COUNT =2 *ELEMENT INDEX=4 因此,寄存器設置如下: Primary control register =0x03000270 Transfer control register =0x00020004 Source control register =0x02000000 Destination control register =0x80000000 Global index register A =0x00050001 Global reload register A =0x00000001 結束語(yǔ) 作為實(shí)時(shí)系統,選取合理有效的核心算法是至關(guān)重要的,同時(shí),選擇有效的數據傳輸方法也是不容忽視的。我們在實(shí)際工作中發(fā)現,在大多數情形下,數據傳輸所花費時(shí)間往往超過(guò)數據處理的時(shí)間,成為實(shí)時(shí)圖像處理系統中的瓶頸。因此,合理使用DMA提高數據傳輸效率,是很有實(shí)際價(jià)值和意義的。 |