DSP圖像處理算法的實現(xiàn)III
《DSP圖像處理算法的實現(xiàn)III》由會員分享,可在線閱讀,更多相關(guān)《DSP圖像處理算法的實現(xiàn)III(23頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 本科畢業(yè)論文 (科研訓(xùn)練、畢業(yè)設(shè)計) 題 目:DSP 圖像處理算法的實現(xiàn)-III 姓 名: 學(xué) 院:信息技術(shù)與科學(xué)學(xué)院 系:電子工程系 專 業(yè):電子信息工程專業(yè) 年 級: 學(xué) 號: 指導(dǎo)教師(校內(nèi)):楊濤 職稱:教授 指導(dǎo)教師(校外): 職稱: 2012 年 5 月 20 日 1 摘要 本文研究的是基于 TI 公司DSP 硬件平臺的數(shù)字圖像處理技術(shù)??? 慮到可移植性,采用 C 語言編寫代碼。采用空域法設(shè)計圖像處理的算法,所涉 及運算包括卷積,相關(guān),中值濾波等
2、。由于圖像處理要處理大量的數(shù)據(jù),需用 DSP 處理器來提高效率。TMS320C6000 系列 DSP 是 TI 公司最新推出的一種 并行處理的數(shù)字信號處理器,其特有的代碼優(yōu)化器也使得 C 優(yōu)化更加方便。我 們根據(jù) TMS320C6000 系列的結(jié)構(gòu)特點,對 C 代碼進(jìn)行一系列優(yōu)化,例如:選 用適當(dāng)?shù)木幾g器選項,內(nèi)聯(lián)函數(shù)的使用,字處理技術(shù),打開循環(huán),流水線技術(shù), 線性匯編等一系列方法對 C 代碼進(jìn)行優(yōu)化,從而極大地提高了數(shù)字圖像處理的 工作效率。 關(guān)鍵字 數(shù)字圖像處理 TMS320C6000 系列 DSP C 語言優(yōu)化 Abstract: In this thesis
3、, based on the DSP hardware platform of TI Co., the algorithms of digital image processing were studied. C language was used to program these algorithms for the purpose of maximizing the portability of program modules. These algorithms, which include convolutions, correlations and medium filters,
4、 were designed based on spatial patterns. To make real-time image processing possible, DSP processors are used to process the massive data in images. The TMS320C6000 DSPs from TI Co. are parallel digital image processors, of which the C-complier makes the compilation and optimization of C
5、-codes seamless and highly efficient. The C-code optimization was highly improved based on the unique designing features of TMS320C6000 series, such as proper choices of compiling options, the utility of intrinsics, the word processing technology, loop opening, pipeline technologies, linear assembly
6、 and etc. Keywords: Digital image processing technology TMS320C6000 C code optimization 2 目錄: 引言…………………………………………………………………….4 第一章 數(shù)字圖像處理的基本知識............................4 1.1 數(shù)字圖像處理簡述…………………………………………………4 1.2 幾種處理算法………………………………………………………4 第二章 TMS
7、320C6000DSP芯片的特點..........................6 2.1 數(shù)字信號處理器的特點 ………………………………………… ..6 2.2 TMS320C6000 的硬件結(jié)構(gòu)簡介……………………………...…..7 2.3 TMS320C6000 指令系統(tǒng)………………………………………...10. 第三章 基于TMS320C6000DSP系列的代碼優(yōu)化…………………..…….11 3.1 第一個階段代碼優(yōu)化…………………………………………….….11 3.2 第二個階段代碼優(yōu)化…………………………………………….….13 3.3 第三個階段代碼優(yōu)化……
8、……………………………………….….17 第四章 對所編C代碼進(jìn)行優(yōu)化處理......................................................20 4.1 小循環(huán)的打開………………………………………………….......20 4.2 較大循環(huán)的打開 ………………………………………………21 結(jié)論................................................................................................................22 致謝語…………………………
9、…………………………..……………………….24 參考文獻(xiàn)………………………………………………….……………………….24 3 隨著計算機(jī)技術(shù)的發(fā)展,數(shù)字圖像處理技術(shù)以其廣闊的應(yīng)用領(lǐng)域,受到人們 越來越多的關(guān)注,本次實驗是以 DSP 為平臺,對數(shù)字圖像處理系統(tǒng)進(jìn)行仿真。 由于圖像處理需要處理大量的數(shù)據(jù),并且對運算速度提出了很高的要求,因此我 們選用 DSP 平臺,并根據(jù)它的結(jié)構(gòu)特點,對所編的 C 代碼進(jìn)行了優(yōu)化,極大地 提高了運算速度 第一章 數(shù)字圖像
10、處理的基本知識 第一節(jié) 數(shù)字圖像處理的概述 數(shù)字圖像處理(Digital Image Processing)又稱為計算機(jī)圖像處理,它是指 利用計算機(jī)和其它高速、大規(guī)模集成數(shù)字硬件,對從圖像信息轉(zhuǎn)換來的數(shù)字電信 號進(jìn)行某些數(shù)字運算或處理,以期提高圖像的質(zhì)量或達(dá)到人們所預(yù)想的結(jié)果。 數(shù)字圖像處理方法大致可分為兩大類,即空域法和變換域法。 1、空域法 這種方法是把圖像看作是平面中各個像素組成的集合,然后直接對這一二維 函數(shù)進(jìn)行相應(yīng)的處理??沼蛱幚矸ㄖ饕邢旅鎯纱箢悺? (1)領(lǐng)域處理法 包括梯度運算、拉普拉斯算子運算、平滑算子運算和卷積運 算。
11、 (2)點處理法 包括灰度處理及面積、周長、體積、重心運算等。 2、變換域法 數(shù)字圖像處理的變換域處理方法是首先對圖像進(jìn)行正交變換,得到變換域系 數(shù)陣列,然后施行各種處理,處理后再反變換到空間域,得到處理結(jié)果。 在我們的設(shè)計中采用的是空域法中的域處理法. 第二節(jié) 幾種圖像處理算法的介紹 對于一張數(shù)字圖像,我們采用 RGB 模式真彩色位圖來表示它,一張圖像由 4 像素矩陣構(gòu)成,每個像素包含它對應(yīng)的位置信息,以及 RGB 三個通道各自亮度 值的大小,R 對應(yīng)紅色,G 對應(yīng)綠色,B 對應(yīng)藍(lán)色,它們統(tǒng)稱為三基色,這三 中色彩的不同搭配,就可以搭
12、配成各種現(xiàn)實中的色彩。如果是單色圖像,只要讓 三個通道的值相等就可以了 。 在實現(xiàn)數(shù)字圖象處理的過程中,主要是通過對圖像中的每一個像素點運用各 種圖像處理算法來達(dá)到預(yù)期的效果,在本實驗里主要涉及了卷積運算,相關(guān)運算, 中值濾波。 1 卷積運算: 使用一個 m*n 的掩模,依次覆蓋在要處理圖像的各個像素上,掩模中心與 該像素重合。掩模上的各個元素均有其自身的權(quán)值。將掩模各元素權(quán)值與覆蓋在 其下的像素值分別相乘后求和,在除以掩模權(quán)值之和,所得結(jié)果稱為響應(yīng),賦給 當(dāng)前處理的像素。通過選取不同的矩陣,我們可以對圖像得出很多不同的結(jié)果, 這個結(jié)果取決于所選取的卷積矩陣不同,可以是高通濾波,低通濾波
13、等等,通過 濾波我們可以得到所需要處理圖像的一些特性,比如可以采用高通濾波突出某些 邊緣輪廓,用低通濾波來平滑圖像,去掉圖像中的高頻成分。 2 相關(guān)運算: 圖像的相關(guān)性運算與卷積運算基本上類似,不同點是卷積矩陣 mask 取自圖 像本身的某一塊值,這里不對相關(guān)性的圖像處理做圖像處理,主要說明一下相關(guān) 性的意義。利用相關(guān)性可以檢測出圖像的矩陣模板,用于模板的匹配,檢測等等。 3 中值濾波: 同樣使用一個 m*n 的掩模依次處理各個像素,但是掩模沒有權(quán)值,而是將 掩模覆蓋下的像素值排序后取中間值,將這個中值賦值給當(dāng)前處理的像素。 中值濾波可以將圖像中的高頻成分去掉,使圖像變得平滑,這個特
14、性和低通 濾波有點類似。 掩模在圖像邊緣時,會遇到覆蓋了非圖像部分的情況,這里可以有多種方式 處理,比較常見的有部分濾波和補(bǔ)零法(zero-padding)。部分濾波為在遇到圖像 邊界時,忽略超出圖像邊界的部分,采用部分掩模處理邊界像素。補(bǔ)零法是將圖 像邊緣部分補(bǔ)上相應(yīng)于掩模大小的零值(也可以為其它常值),處理完成后再將這 部分切除,恢復(fù)至原圖像大小,但是這樣圖像邊緣往往會出現(xiàn)灰度值偏小的情況。 5 一般來說圖像邊緣往往是不重要的部分,所以這些處理帶來的缺點是可以容忍 的。 第二章、TMS320C6000 DSP 芯片的硬件系統(tǒng)
15、 第一節(jié) 數(shù)字信號處理器的特點 1 算術(shù)單元 硬件乘法器 由于 DSPS 的功能特點,乘法操作是 DSPS 的一個主要任務(wù)。在通用微處 理器內(nèi)是通過程序?qū)崿F(xiàn)乘法操作的,這往往需要耗費很大的時鐘周期,因此在 DSPS 內(nèi)部設(shè)有硬件乘法器來完成乘法乘法操作,以提高乘法速度。所以硬件乘 法器是 DSP 區(qū)別于通用微處理器的一個重要標(biāo)志。 多功能單元 為進(jìn)一步提高速度,可以在 CPU 內(nèi)設(shè)置多個并行操作的功能單元(ALU, 乘法器,地址產(chǎn)生器等)。如 C6000 的 CPU 內(nèi)部有八個功能單元,即兩個乘法 器和六個 ALU,八個功能單元最多可以在一個周期內(nèi)同時執(zhí)行八條 32
16、位指令。由 于多功能單元的并行操作,使 DPS 在相同時間內(nèi)能夠完成更多的操作,因而提 高了程序的執(zhí)行速度。 2 總線結(jié)構(gòu) 通用微處理器是為計算機(jī)設(shè)計的,通常采用馮諾依曼總線結(jié)構(gòu),統(tǒng)一的程序 和數(shù)據(jù)空間,共享的程序和數(shù)據(jù)總線,由于總線的限制,微處理器執(zhí)行指令時, 取指和存取操作數(shù)必須共享總線,因而程序指令只能串行執(zhí)行。對于 DSP 而言, 采用馮諾依曼總線結(jié)構(gòu)將使系統(tǒng)的性能受到很大的限制,因此 DSP 采用了獨立 程序總線的哈弗總線結(jié)構(gòu),而且很多 DSP 甚至有兩套以上內(nèi)部數(shù)據(jù)總線,這種 總線結(jié)構(gòu)稱為修正的哈佛結(jié)構(gòu),對于乘法或加法等運算,一條指令要從存儲器中 取兩個操作數(shù),多套數(shù)據(jù)總線就使
17、得兩個操作數(shù)可以同時取得,提高了程序效率 3 專用尋址單元 6 DSP 面向的是數(shù)據(jù)密集型應(yīng)用,因為需要頻繁地訪問數(shù)據(jù),數(shù)據(jù)地址的計 算時間也線性增長,如果不做特殊處理,計算地址的時間有時會比實際的算術(shù)操 作時間還長。因此,DSP 通常都有支持地址計算的算術(shù)單元——地址產(chǎn)生器與 ALU 并行工作,因此地址的計算不再額外占用 CPU 時間 4 流水處理 除了多功能單元外,流水技術(shù)是提高 DSP 程序執(zhí)行效率的另一個主要手段。 流水技術(shù)使兩個或更多不同的操作可以重疊執(zhí)行,流水線操作是 DSP 實現(xiàn)高速 度、高效率的關(guān)鍵技術(shù)之一。TMS320C6000 只有在流水線充分發(fā)揮作
18、用的情況 下,才能達(dá)到 1600MIPS 的速度。C6000 的流水線分為三個階段:取指、解碼、 執(zhí)行、總共 11 級。和以前的 C3x、C54x 相比,有非常大的優(yōu)勢,主要表現(xiàn)在: 簡化了流水線的控制以消除流水線互鎖;增加流水線的深度以消除傳統(tǒng)流水線結(jié) 構(gòu)在取指、數(shù)據(jù)訪問和乘法操作上的瓶頸。其中取指、數(shù)據(jù)訪問分為多個階段, 使得 C6000 可以高速地訪問存儲空是。 5 大容量片內(nèi)存儲器 大容量片內(nèi)存儲器外部存儲器一般不能適應(yīng)高性能 DSP 核的處理速度, 因 此在片內(nèi)設(shè)置較大容量的程序/數(shù)據(jù)存儲器以減少對外部存儲器的訪間速度, 充 分發(fā)揮 DSP 核的高性能,數(shù)據(jù) RAM 的容量高達(dá)
19、7MB。采用大的片內(nèi)存儲器可以 減少外部存儲器接口的引腳, 甚至省略外部存儲器接口, 而且還可以減小芯片的 封裝體積。 6 零消耗循環(huán)控制 數(shù)字信號處理的一大特點是很多運算時間都用在執(zhí)行較小循環(huán)的少量核心 代碼上大部分 DSP 芯片具有零消耗循環(huán)控制的專門硬件, 可以省去循環(huán)計數(shù)器 的測試指令, 提高了代碼效率, 減少了執(zhí)行時間。 第二節(jié) TMS320C6000 的硬件結(jié)構(gòu)簡介 TMS320C6000 系列 DSP(數(shù)字信號處理器)是 TI 公司最新推出的一種并 行處理的數(shù)字信號處理器。它是基于 TI 的 VLIW 技術(shù)的,它包含兩個子系列: 用于定點計算的 TMS32
20、0C62X 系列和用于浮點計算的 TMS320c 67x 系列其中, TMS320C62xx 是定點處理器,TMS320C67xx 是浮點處理器。以 TMS320C6201 7 為例,該處理器的工作頻率最高可以采用 50MHz,經(jīng)內(nèi)部 4 倍頻后升至 200MHz, 每個時鐘周期最多可以并行執(zhí)行 8 條指令,從而可以實現(xiàn) 1600MIPS 的定點運 算能力,而且完成 1024 定點 FFT 的時間只需 70μs。 TMS320C6000 的 CPU 有兩個數(shù)據(jù)通道 A 和 B,每個通道有 16 個 32 位字 長的寄存器(A0~A15,B0~B1
21、5),四個功能單元(L,S,M,D),每個功能 單元負(fù)責(zé)完成一定的算術(shù)或者邏輯運行。A、B 兩通道的寄存器并不是完全共享, 只能通過 TM320C6000 提供的兩個交換通道 1X、2X,才能實現(xiàn)處理單元從不 同通道的寄存器堆那里獲取 32 位字長的操作數(shù)。TMS320C6000 的地址線為 32 位,存儲器尋址空間是 4G。 各個部分簡要介紹: C62X 和 C67X 的數(shù)據(jù)通路包括: 2 個通用寄存器組(A 和 B)8 個功能單元(.L1,.L2,.S1,.S2,.M1,.M2,.D1,D2) 2 個存儲器讀取通路(LD1 和 LD2)2 個存儲器存儲通路(ST1 和 ST2)
22、 2 個寄存器組交叉通路(1X 和 2X)2 個數(shù)據(jù)尋址通路(DA1 和 DA2) 1 通用寄存器組 C62X/C67X 數(shù)據(jù)通路中有 2 個通用寄存器組(A 和 B): 寄存器組 A:A0-A15,寄存器組 B:B0-B15。 8 條件寄存器: A1、A2、B0、B1 和 B2 可用于循環(huán)尋址的寄存器:A4-A7 和 B4-B7。 通用寄存器組支持 32 位和 40 位定點數(shù)據(jù),C67X 也支持 32 位單精度和 64 位雙精度浮點數(shù)據(jù)。對于 40 位和 64 位數(shù)據(jù),需跨放在兩個寄存器內(nèi)。 2 功能單元 8 個功能單元分成 A、B 兩組:A 組:L1、S
23、1、M1、D1 B 組:L2、S2、 M2、D2 每個功能單元都有:2 個 32bit 讀口和 1 個 32 位寫口 .L1、.L2、.S1 和.S2 另有:8bit 寫口和 8bit 讀口,支持 40 位操作數(shù)的讀寫 同一周期 8 個功能單元可并行使用 功 能 單 元 定 點 操 作 浮 點 操 作 .L 單元(.L1,.L2) 32/40 位算術(shù)和比較操作 32 位中最左邊 1 或 0 的位數(shù)計數(shù) 32 位和 40 位計數(shù) 32 位邏輯操作 算術(shù)操
24、作 轉(zhuǎn)換操作 DP→SD INT→DP INT→SP .S 單元(.S1,.S2) 32 位算術(shù)操作 32/40 位移位和 32 位位操作 32 位邏輯操作 轉(zhuǎn)移 常數(shù)產(chǎn)生 寄存器與控制寄存器傳遞(僅.S2) 比較倒數(shù)和倒數(shù)平方根 操作 絕對值操作 SP→DP 轉(zhuǎn)換 .M 單元(.M1,.M2) 1616 乘法操作 3232 乘法操作 浮點乘法操作 .D 單元(.D1,.D2) 32 位加、減、線性循環(huán)尋址計算 5 位常數(shù)偏移量取存 15 位常數(shù)偏移量取存(僅.D2) 5 位常數(shù)偏移量雙字讀 取 各個功能單元的執(zhí)行操作 結(jié)構(gòu)示意圖
25、 3 寄存器組交叉通路 9 CPU 中有兩個交叉通路 1X 和 2X 1X:允許 A 側(cè)功能單元讀取 B 組寄存器數(shù)據(jù) 2X:允許 B 側(cè)功能單元讀取 A 組寄存器數(shù)據(jù) 每側(cè)僅有一個交叉通路,在同一周期內(nèi)從另一側(cè)寄存器組讀操作數(shù)只能一 次,或者同時進(jìn)行使用 2 個交叉通路(1X 和 2X)的操作。 .D 不能使用交叉通路僅 src2 可以使用另一側(cè)寄存器數(shù)據(jù) 第三節(jié) TMS320C6000 指令系統(tǒng) C62xx 和 C67xx 共享同一個指令集。所以 C67xx 可以使用所有的 C62xx 指
26、令,但因為 C67xx 是浮點芯片,怕以 C67xx 的指令集中有一些指令只能用于 浮點運算。TMS320C6201CPU 的設(shè)計采用了類似于 RISC 的結(jié)構(gòu),指令集簡單、 運算速度快。8 個功能單元負(fù)責(zé)不同功能的運算,指令和功能單元之間存在一個 映射關(guān)系。其中,L 單元有 23 條指令,M 單元有 20 條指令,S 單元 29 有條指 令,D 單元有 26 條指令。 TMS320C6201 的大部分指令都可在單周期內(nèi)完成,都可以直接對 8/16/32bit 數(shù)據(jù)進(jìn)行操作。同時,TMS320C6201 指令集針對數(shù)字信號處理算法 提供了一引起特殊指令:為復(fù)雜計算提供的 40bit 的
27、特殊操作的加法運算;有效 的溢出處理和歸一化處理;簡潔的位操作功能等。TMS320C6201 中最多可以有 8 條指令同時并行執(zhí)行;所有指令均可條件執(zhí)行。以上所有特點提高了指令的執(zhí) 行效率、減小了代碼長度、大大減少了因跳轉(zhuǎn)引起的開銷、提高了編碼效率。 10 第三章 基于 TMS320C6000 系列的 C 代碼優(yōu)化 在 DSP 軟件開發(fā)中推薦的開發(fā)流程如圖 1 所示 于是我們可以份三個階段來優(yōu)化所寫的 C 語言代碼 第一個階段:對第一個階段,
28、我們根據(jù)需要實現(xiàn)的功能來編寫 C 語言程序, 這時的代碼和硬件平臺是獨立的,可以進(jìn)行一些基本的 C 優(yōu)化,然后使用 C6000 代碼剖析工具,確定 C 代碼中可能存在的低效率段,為進(jìn)一步改進(jìn)代碼性能, 進(jìn)入第二階段。 第二個階段:在這一階段,我們根據(jù) TI,C6000 平臺一些基本的結(jié)構(gòu)特點, 11 使用特定的優(yōu)化方法,改進(jìn) C 代碼。這些方法包括使用編譯器選項、和代碼轉(zhuǎn) 換字訪問、軟件流水和循環(huán)展開等。如果代碼仍不能達(dá)到所期望的效率,則進(jìn)入 第三個階段。 第三個階段:從 C 代碼中抽出對運行時間影響最大的代碼段,用線性匯編 改寫這段代碼。用戶能使用匯編優(yōu)化器優(yōu)化該
29、代碼。 第一節(jié) 第一個階段代碼優(yōu)化 第一階段的優(yōu)化是基于通用微處理器的 PC 機(jī)環(huán)境中的優(yōu)化,主要是針對 C 程序的通用特性來考慮的。這方面的優(yōu)化工作主要包括數(shù)據(jù)類型選擇、數(shù)值操作 優(yōu)化、快速算法、變量定義和使用優(yōu)化、函數(shù)調(diào)用優(yōu)化以及計算表格化等.這個 階段的 C 代碼優(yōu)化,可以通過選定 CCS(Code Composer Studio)提供的 C 編 譯器的選項來實現(xiàn)優(yōu)化,所以不詳細(xì)展開,但有幾點與 C6000 的硬件結(jié)構(gòu)有關(guān), 需詳細(xì)說明下 1 數(shù)據(jù)類型 數(shù)據(jù)類型的選擇在分析和編寫代碼時很重要,充分考慮數(shù)據(jù)類型大小才能從 C6000 體系結(jié)構(gòu)中取得最優(yōu)的性能。C6x 編譯器對每
30、種數(shù)據(jù)類型都定義了數(shù)據(jù) 大小。char :8 bit ; short : 16 bit ; int :32 bit ; long :40 bit ;float :32 bit ;double :64 bit 基于每一種數(shù)據(jù)類型的大小,在書寫 C 代碼時,應(yīng)注意以下原則。(1) 要避免 把 int 和 long 數(shù)據(jù)類型當(dāng)成相同大小來處理,因為 C6x 編譯器對 long 數(shù)據(jù)使 用 40 bit 操作數(shù);(2) 定點乘法,盡量采用 short 型作為輸入,因為 C6x 上是一 個 16? 16 的乘法器;(3) 用于循環(huán)的計數(shù)器,數(shù)據(jù)類型采用 int 或者 unsigned int 以避
31、免匯編器產(chǎn)生不必要的符號擴(kuò)展指令;(4) 當(dāng)在浮點 DSP 裝置中使用浮點 指令時,例如 C67x 應(yīng)使用-mv6700 編譯器開關(guān),使得代碼產(chǎn)生器符合浮點的 硬件裝置代碼。 2 數(shù)值操作優(yōu)化 C 程序中主要有以下數(shù)值操作優(yōu)化:(1)用比特的移位操作來代替 2 次冪整 數(shù)的乘除法運算更為有效;(2 )當(dāng)使用浮點設(shè)備時, 盡量使用浮點數(shù)據(jù)類型,這 能夠減小定點處理單元的負(fù)擔(dān);(3) 盡量避免數(shù)值的上下溢出,除非是算法本身 的需要。 3 快速算法 12 本優(yōu)化方法是用快速算法實現(xiàn)各種變換。例如離散傅立葉變換(DFT)是數(shù)字 圖像處理中應(yīng)用十分廣泛的一種變換,具有很好的實
32、用性,其快速算法——快速 傅立葉變換(FFT)對其計算速度又有非常大的改進(jìn),從而使得該算法得到了更 加廣泛的應(yīng)用。 4 變量定義和使用優(yōu)化 C 程序中對于需要多次重復(fù)使用的變量,如 for 循環(huán)中的變量值,一般可以 設(shè)置成 register 變量,從而提高效率。另外在 C 語言中指針和數(shù)組是可以相互 替代的,而對于數(shù)組的尋址非常耗時,特別是多維數(shù)組,因此可以通過降低數(shù)組 的維數(shù),再指針化,從而提高效率。 5 函數(shù)調(diào)用優(yōu)化 函數(shù)調(diào)用會產(chǎn)生大量的代碼,開銷也很大。當(dāng) C 調(diào)用一個函數(shù)時,它首先 把參數(shù)傳遞給寄存器或者堆棧,如果函數(shù)參數(shù)很多,則調(diào)用開銷將很大。因此要 盡量避免傳遞結(jié)構(gòu),一般用
33、結(jié)構(gòu)指針代替。另外,限制局部變量的數(shù)目也有利于 提高效率。對于 C++用戶,可以用 inline 技術(shù)消除函數(shù)調(diào)用的開銷,但這樣往 往以增加目標(biāo)代碼的大小為代價,在實際開發(fā)中要根據(jù)需要綜合考慮。 6 計算表格化 在數(shù)值運算中,除基本的加減乘除運算外,還有其它許多非線性運算,如對 數(shù)運算、開方運算、指數(shù)運算、三角函數(shù)運算等,實現(xiàn)這些非線性運算一般采用 查表法。查表法是快速實現(xiàn)非線性運算最常用的方法。在實時 DSP 應(yīng)用中,一 般采用這種方法必須根據(jù)自變量的范圍和精度要求制作一張表格。查表法求值所 需的計算就是根據(jù)輸入值確定表的地址,根據(jù)地址就可得到相應(yīng)的值,因而運算 量較小。 第二節(jié) 第二
34、個階段代碼優(yōu)化 第二個階段可以利用如下技術(shù)來提高性能: 1 使用 C6x 編譯器選項 C6X 編譯器具有很高的效率,它可將 C 代碼轉(zhuǎn)換成更高效率的匯編語言源 代碼,進(jìn)而進(jìn)行匯編和連接,產(chǎn)生可執(zhí)行的目標(biāo)代碼,在編譯選項中有許多與 C 優(yōu)化器直接相關(guān)的選項,我們可以通過對她們的設(shè)置,來實現(xiàn)優(yōu)化代碼的目的。 C6000 的優(yōu)化器是 TI 公司的一個創(chuàng)新, 它對程序循環(huán)的流水處理使得代碼 13 的效 率得到很大提高。其使用也很簡單, 只要在編譯時加人優(yōu)化選項即可。采用 優(yōu)化選項進(jìn)行優(yōu)化后, 點積函數(shù)可的執(zhí)行時間有大幅減少,性能提高了很多 表 1 給出了與優(yōu)
35、化器有關(guān)的編譯選項 選項 說明 -ox 文件級優(yōu)化選項,與-pm 合用,可進(jìn)行程序級優(yōu)化,x 是數(shù)字 0,1,2,3 -pm 使語法分析器在啟動優(yōu)化器和代碼產(chǎn)生器之間,把所有的 C 文 件合成一個文件來處理,這樣做,可以對整個程序進(jìn)行優(yōu)化, 使優(yōu)化效率更高 -mt 向編譯器說明在程序中沒有出現(xiàn) aliasing。有了這個信息, 優(yōu)化器在進(jìn)行優(yōu)化時效率就可能更高,選項-ma 與-mt 相反, 它通知編譯器在程序中使用了 aliasing,因而在優(yōu)化時會更 謹(jǐn)慎 -x2 內(nèi)聯(lián)選項。使用-x2 之后,編譯器會對于小于指定長度的函數(shù), 以及使用了 inline 關(guān)鍵
36、字的函數(shù)進(jìn)行內(nèi)聯(lián)處理,在進(jìn)行三級 優(yōu)化時,內(nèi)聯(lián)選項自動啟用。 -ml 大模式選項,大模式選項用于說明程序中使用超過了 32k 字節(jié) 的 static 和 global 變量:如果不特別指明是 near,編譯器會 把每個變量都作為 far 變量處理 -g 符號調(diào)試選項,符號調(diào)試選項-g 會使許多與符號調(diào)試不兼容 的優(yōu)化手段無法使用。二級優(yōu)化是與符號調(diào)試兼容的最高優(yōu)化 級別 -s,-ss,-os 交叉列表功能選項。在最初功能調(diào)試階段,把 C 語句,匯編語 句以及編譯器注釋放在一起,對調(diào)試會有幫助,但可能會影響 代碼的優(yōu)化 當(dāng)優(yōu)化器被激活時,將完成圖 2 所示的過程。C 語言源代
37、碼首先通過一個完 成預(yù)處理的解析器(Parser),生成一個中間文件(.if)作為優(yōu)化器(Optimizer)的輸 入。優(yōu)化器生成一個優(yōu)化文件(.opt),這個文件作為完成進(jìn)一步優(yōu)化的代碼生成 器(Code generator)的輸入,最終生成匯編文件(.asm)。當(dāng)選擇編譯選項時,-o2 和-o3 將盡可能地優(yōu)化軟件。如下圖所示: 14 編譯器優(yōu)化 C/C++程序流程 C/C++語言 源程序 解析器 優(yōu)化器 代碼生 成器 .if 文件 .opt 文件 .asm 文件
38、 編譯器工具也包括一個外殼程序,利用它,程序可一步完成代碼的編譯,匯 編優(yōu)化,匯編和連接。 調(diào)用外殼函數(shù)需鍵入下列命令: cl6x[options]{filenames}{-z[linker options]{object files}}如: 不帶優(yōu)化選項進(jìn)行編譯,即功能驗證時,cl6x-g-s file.c-z; 用最高級別優(yōu)化選項進(jìn)行編譯 cl6x-03-pm film.c-z 用優(yōu)化級別 o2 進(jìn)行編譯 cl6x-g-o file.c-z 注意每個步驟都要進(jìn)行功能驗證 2 用 C6x 編譯器內(nèi)部函數(shù)來代替復(fù)雜的 C 代碼; 內(nèi)聯(lián)函數(shù) intr
39、insics:直接與 C62xx 匯編指令相對應(yīng)的特殊內(nèi)聯(lián)函數(shù),沒有函 數(shù)調(diào)用開支。TMS320C6X 提供了很多內(nèi)聯(lián)函數(shù),它們直接映射為內(nèi)嵌 C6X 匯 編指令的特殊函數(shù),這樣可迅速優(yōu)化 C 語言代碼。C 編譯器以內(nèi)聯(lián)函數(shù)的形式 支持所有 C 語言代碼不易表達(dá)的指令。內(nèi)聯(lián)函數(shù)用下劃線“_”開頭,使用時同調(diào)用 函數(shù)一樣調(diào)用它,尤其在需要大量 C 代碼才能表示的復(fù)雜功能時,應(yīng)盡量用 C6x 的內(nèi)部函數(shù)表示。例如執(zhí)行飽和加法的 C 代碼需要多個周期,若引用 intrinsics, 則這些復(fù)雜的代碼可以通過一條單獨指令_sadd()取代。C6000intrinsics 中有些 指令如_ass2()
40、,_mpyhl()和_mpylh()是對存儲在 32 位寄存器的高 16 位和低 16 位字段進(jìn)行操作。當(dāng)對一連串短型數(shù)據(jù)進(jìn)行操作時,可使用字(整型)一次訪問 2 個短型數(shù)據(jù),然后使用 C6000 intrinsics 對這些數(shù)據(jù)進(jìn)行操作,從而減少對內(nèi) 存的訪問。 3.對短字長的數(shù)據(jù)使用寬長度的存儲器訪問,即字處理技術(shù) 15 要提高 C6000 數(shù)據(jù)處理率,應(yīng)使一條 Load/Store 指令能訪問多個數(shù)據(jù)。 如使用字訪問存放在 32 位寄存器的高 16 位和低 16 位字段的數(shù)據(jù),使用雙字 訪問存放在 64 位寄存器的 32 位數(shù)據(jù)。這樣一條指令就能同時處理兩個
41、數(shù)據(jù), 再配上前面所說的內(nèi)聯(lián)函數(shù),如_mpyh,(數(shù)據(jù)的高十六位相乘)_mpy(數(shù)據(jù)的低 十六位相乘),可以極大地提高運算速度。要實現(xiàn)上面的優(yōu)化還碰到一個問題是: 如何對十六位數(shù)據(jù)進(jìn)行三十二位的訪問。 這里列舉三個方法: 1) 聯(lián)合 Union ,把要訪問的 16 位 short 類型定為 union 位類型定義為類型, 方法如下 Typedef union { Short a[4]; Int w[2]; } data_union; Data_union x={1,2,3,4}; Short y; Int z; Y=x.s[2];//訪問十六位數(shù)據(jù) Z=x.w[1];/
42、/訪問三十二位數(shù)據(jù) 2) 強(qiáng)制類型轉(zhuǎn)換 Short x[4]={1,2,3,4}; Short y,*xp=x; Int z; Y=*xp; //訪問 16 位數(shù)據(jù) Z=*(int*)xp; //訪問 32 位數(shù)據(jù) 3)把數(shù)據(jù)直接定義為 32 位字 Int x[2]={0x0002000}; Int z*xp=x; 下面具體舉例說明字處理與內(nèi)聯(lián)函數(shù)結(jié)合在一起的應(yīng)用 short DP(short *m, short *n, short count) { short i ; int pro_h, pro_l ; int sum_h = 0 ; int sum_
43、l = 0 ; int sum = 0 ;
int *data_a = ( int *) m ;/這里用來實現(xiàn)強(qiáng)制類型轉(zhuǎn)換,現(xiàn)在的指針一次
16
取就可以取出十六位,即原來數(shù)組中兩個元素,一個放在高八位,一個放在低八位
int *data_x = ( int *) n ;
count = count >> 1 ;/COUNT 變?yōu)樵瓉淼囊话?
for(i=0;i 44、mpyh( data_a[i], data_x[i]) ;/_mpyh 也是內(nèi)聯(lián)函數(shù),它是 把高八位的兩個數(shù)相乘,結(jié)果給 pro_h
sum_l += pro_l ;
sum_h += pro_h ;
}
sum = sum_l + sum_h ;
return( sum) ;
}
4 軟件流水線技術(shù)的使用
軟件流水線技術(shù)用來對一個循環(huán)結(jié)構(gòu)的指令進(jìn)行調(diào)度安排,使之成為多重迭
代循環(huán)并行執(zhí)行。必須指出的是,只有當(dāng)循環(huán)計數(shù)器大于一定值的時候才能進(jìn)行 以上優(yōu)化,在編譯時使用-o2 和-o3 選項,編譯器可對循環(huán)代碼實現(xiàn)軟件流水。 軟件流水線的循環(huán)結(jié)構(gòu)圖如下圖 所示。在圖中用 A 45、、B、C、D、E 表示循環(huán)的 各次迭代,其實的數(shù)字表示各次迭代的第幾條指令,同一行的指令是同一周期內(nèi) 并行執(zhí)行的指令。同一周期內(nèi)最多可執(zhí)行 5 次迭代的不同指令(陰影部分)又稱 為循環(huán)核,核前部分叫做循環(huán)填充,核后部分叫做循環(huán)排空。
A1
流水線填充
B1
A2
C1
B2
A3
D1
C2
B3
A4
E1
D2
C3
B4
A5
循環(huán)內(nèi)核
E2
D3
C4
B5
流水線排空
E3
D4
C5
E4
D5
E5
5 46、循環(huán)結(jié)構(gòu)中的代碼展開
改進(jìn)性能的另一種方法就是展開循環(huán),這種優(yōu)化方法可增加并行執(zhí)行的指令 數(shù),當(dāng)單次迭代操作沒有充分利用 C6x 結(jié)構(gòu)的所有資源時,可使用循環(huán)展開提
17
高性能,展開循環(huán)結(jié)構(gòu)的代碼對于編譯器利用軟件流水線技術(shù)也有很大的好處,
因為匯編優(yōu)化器只針對最內(nèi)層的循環(huán)進(jìn)行優(yōu)化,因此,為了提高性能可創(chuàng)造一個 比較大的內(nèi)循環(huán)。創(chuàng)造大的內(nèi)循環(huán)的一個方法就是完全展開執(zhí)行周期很少的內(nèi)循 環(huán)。同時,因為展開循環(huán)會增加代碼尺寸,所以我們必須在代碼大小與運算時間 之間做出取舍。
第三節(jié) 第三個階段代碼優(yōu)化
如果經(jīng)過前兩步的優(yōu)化,代碼還不能達(dá)到要求的話,我們可以進(jìn)入第三階 47、段 的優(yōu)化。由于匯編語言具有高效性,所以可以利用代碼剖析工具從 C 代碼中抽 出效率低的部分,然后用匯編語言改寫它。,這里有兩種方法可以進(jìn)行匯編優(yōu)化。 一種是使用線性匯編重新改寫,然后用 CCS 提供的匯編優(yōu)化器對改寫的線性匯 編進(jìn)行優(yōu)化得到最終優(yōu)化的匯編代碼;另一種方法是直接對這部分代碼進(jìn)行手工 改寫,得到優(yōu)化的匯編代碼[]。第二種方法需要程序員對 C6000 系列芯片的內(nèi) 部結(jié)構(gòu)非常了解,所以我們一般用第一種辦法,采用線性匯編改寫 C 代碼。
線性匯編與普通的 C6x 匯編很相似,都使用匯編指令書寫代碼。不同的是, 線性匯編不需要書寫普通匯編時必須提供的所有信息(如指令是否并行執(zhí)行、指 48、令的標(biāo)號、流水線的延遲、寄存器的使用和功能單元的使用等) 。匯編優(yōu)化器從 輸入的線性匯編代碼中,完成以下功能:(1) 尋找哪些 CPU 指令可以并行執(zhí)行; (2) 在軟件流水線期間,處理流水線標(biāo)號;(3) 分配寄存器的用法;(4) 定義使用 哪個功能單元。
1 線性匯編優(yōu)化技術(shù)
下面用定點點積來具體舉例說明用線性匯編優(yōu)化代碼的過程。
例 2 定點點積的 C 代碼
short dotp(short a[], short b[])
{
int sum, i;
sum = 0;
for(i=0; i<40; i++) sum += a[i] * b[i]; return(s 49、um);
}
把 C 代碼改編成線性匯編指令
loop:
ADD .L1 A4,A5,A5;
18
|| MPY .M1X B4,A3,A4;
|| [B0] B .S2 loop;
|| [B0] SUB .L2 B0,0x1,B0;
|| LDH .D2T2 *B5++,B4;
|| LDH .D1T1 *A0++,A3;
上述定點點積的 C 代碼沒有經(jīng)過優(yōu)化的時候需要 1787 個指令周期,經(jīng)過 線性匯編的優(yōu)化以后只需要 120 個周期,效率得到提高。在實際的開發(fā)過程中 常常用這種方法對 C 代碼進(jìn)行匯編優(yōu)化
2 手工匯編優(yōu)化技術(shù)
所謂手工匯編優(yōu)化, 50、就是對 C 代碼編譯產(chǎn)生的匯編代碼進(jìn)行手工優(yōu)化改寫。 在某些性能要求比較苛刻的開發(fā)中,有時需要程序員對程序進(jìn)行手工的匯編優(yōu) 化,以發(fā)揮 DSP 性能的極致。手工匯編優(yōu)化方法是首先寫出要優(yōu)化的 C 程序 代碼段的一般匯編形式,然后對應(yīng)一般匯編形式畫相關(guān)圖并分配資源,然后寫出 與相關(guān)圖對應(yīng)的匯編代碼。通常的優(yōu)化策略包括:1 寫并行代碼 2 有對短數(shù)據(jù)(16 bit) 使用字(32 bit) 訪問、3 軟件流水線技術(shù)、4 多周期循環(huán)的模編排、5 循環(huán)展 開等[4],這里不再具體介紹。
51、
19
第四章 對所編的 C 代碼進(jìn)行優(yōu)化處理
第一節(jié)
小循環(huán)的打開
(1)for(l=0;l 52、_data->width + i + k] *mask[j*3 + k];
}
}
sum = (sum >> shift);
sum = (sum > 32767)? 32767 : (sum < -32768 ? -32768 : sum); OUT[(l+1)*in_data->width+i+1]=(short)sum;
}
}
在這里,由于 j k i 都不是很大,于是我們可以把里面的幾層循環(huán)都打開,程序可 以改為,
for(l=0;l 53、 i++)
20
{
sum = 0;
for (j = 0; j < 3; j++)
{
for (k = 0; k < 3; k++)
{
Sum += p[(l+j)*in_data->width + 0 + 0] *mask[j*3 + 0]; Sum += p[(l+j)*in_data->width + 0+ 1] *mask[j*3 + 1]; Sum += p[(l+j)*in_data->width + 0+ 2] *mask[j*3 + 2]; Sum += p[(l+j)*in_data->width + 1 + 0] *mask[j*3 + 54、0]; Sum += p[(l+j)*in_data->width + 1 + 1] *mask[j*3 + 1]; Sum += p[(l+j)*in_data->width + 1 + 2] *mask[j*3 + 2]; Sum += p[(l+j)*in_data->width + 2 + 0] *mask[j*3 + 0]; Sum += p[(l+j)*in_data->width + 2 + 1] *mask[j*3 + 1]; Sum += p[(l+j)*in_data->width + 2 + 2] *mask[j*3 + 2];
}
}
sum = (sum >> 55、shift);
sum = (sum > 32767)? 32767 : (sum < -32768 ? -32768 : sum); OUT[(l+1)*in_data->width+i+1]=(short)sum;
}
}
第二節(jié) 較大循環(huán)的處理
for(l=0;l 56、ta[(l+j)*temp_data->width + i + k] *mask[j * 7 + k];
}
}
sum = (sum >> shift);
sum = (sum > 255) ? 255 : (sum < 0 ? 0 : sum);
out_data->pData[l*in_data->width+i] = sum ;
}
}
在這個程序里,我們把里面的循環(huán)打開了以后,還可以用字處理進(jìn)行
21
優(yōu)化,如下所示:
for(l=0;l 57、th ; i++)
{
sum = 0;
for (j = 0; j < 7; j++)
{ int pro_h0, pro_l0 , pro_h2, pro_l2, pro_h4, pro_l4, pro_h6, pro_l6;
int sum_h0=0 sum_h2=0 sum_h4=0 sum_h6=0 ;
int sum_l0=0 sum_l2=0 sum_l4=0 sum_l6=0 int sum = 0 ;
int * maskl = ( int *)mask;
int *data_x = ( int *) temp_data->pDat 58、a ;
pro_l0 = _mpy(data_x [(l+j)*temp_data->width+i+0], maskl[j*7+0]) ;
pro_h0 =_mpyh(data_x[(l+j)*temp_data->width+i+0], maskl[j*7+0]) ;
sum_l0 += pro_l0 ;
sum_h0 += pro_h0 ;
pro_l2= _mpy(data_x [(l+j)*temp_data->width+i+2], maskl[j*7+2]) ;
pro_h2 =_mpyh(data_x[(l+j)*temp_data->width+i+2], mas 59、kl[j*7+2]) ;
sum_l2 += pro_l2 ;
sum_h2 += pro_h2
pro_l4 = _mpy(data_x [(l+j)*temp_data->width+i+0], maskl[j*7+4]) ;
pro_h4 =_mpyh(data_x[(l+j)*temp_data->width+i+0], maskl[j*7+4]) ;
sum_l4 += pro_l4 ;
sum_h4 += pro_h4 ;
pro_l6 = _mpy(data_x [(l+j)*temp_data->width+i+0], maskl[j*7+6]) ;
sum_l 60、6 += pro_l6 ;
}
sum0 = sum_l 0+ sum_h0 sum2 = sum_l 2+ sum_h2; sum4 = sum_l 4+ sum_h4 sum6 = sum_l 6
sum=sum0+sum2+sum4+sum6
sum = (sum >> shift);
sum = (sum > 255) ? 255 : (sum < 0 ? 0 : sum);
out_data->pData[l*in_data->width+i] = sum ;
}
}
結(jié)論:隨著信息技術(shù)草命的深入和計算機(jī)技術(shù)的飛速發(fā)展, 圖像處理技術(shù)
發(fā)展迅速, 其應(yīng) 61、用領(lǐng)城也愈來愈廣泛, 已經(jīng)診透到工程、工業(yè)、醫(yī)療保健、航空
22
航天、軍事、科研、安全保衛(wèi)等各個方面, 在國計民生及國民經(jīng)濟(jì)中發(fā)揮越來越
大的作用。由于數(shù)字圖像處理對于數(shù)據(jù)量和運算速度的特殊要求,通常采用 DSP 設(shè)計系統(tǒng),以提高速度。TI 公司的 TMS320C6000 系列提供了一個很好的硬件 平臺,我們根據(jù)這個平臺的結(jié)構(gòu)特點,對編寫的 C 語言進(jìn)行一系列優(yōu)化,大大 提高了程序的運算速度。通過這次畢設(shè),我學(xué)到了很多關(guān)于代碼優(yōu)化方面的理論 知識,這些知識都具有很高的應(yīng)用價值。在理論聯(lián)系實際的過程中,也遇到一些 困難,比如太多重的循環(huán)不知如何打開,比如代碼長度和運算 62、速度如何取舍的問 題。目前很多圖像處理的產(chǎn)品本都是基于 DSP 技術(shù)和器件的, 因此對此進(jìn)行深
入的研究,
并針對具體的應(yīng)用, 研究新的處理方法,構(gòu)造新的處理系統(tǒng), 開拓更
廣泛的應(yīng)用領(lǐng)城, 都有著十分重要的實際意義。
致謝語 在楊濤老師的指導(dǎo)下,我們順利地完成了這次畢業(yè)設(shè)計,通過這次設(shè)計,我們不 僅增長了專業(yè)知識,同時也學(xué)會了如何與他人一起合作,受益匪淺。感謝楊濤老
師孜孜不倦的教誨,感謝同組所有成員熱忱的幫助。
參考文獻(xiàn)
[1]Texas Instruments Incorporation.TMS320C6000 CPU and Instru 63、ction Set Reference
Guide[Z].USA:TI,
2000.
[2]Texas Instruments Incorporation.TMS320C6000 Programmers Guide[Z].USA:TI,2002 [3]陽明曄,張志勇.基于 TMS320C6000 系列 DSP 的 C 代碼優(yōu)化方法研究[J].微機(jī)處理,
2004,第 2 期:59-64.
[4]Texas Instruments Incorporation.TMS320C6000 Assembly Language Tools Users
Guide [Z].USA:TI,2002 64、
[5]期刊: 覃海山.淺談優(yōu)化 C/C++ 語言編寫基于 DSP 程序的方法[J]. 科技信息, 2007,
16(期): 63.
[6]期刊: 趙俊梅 林祥德 朱林泉.基于 DSP 芯片的圖像處理技術(shù)[J]. infrared(monthly),
2007,
28(期): 63.
[7]學(xué)位論文: 趙訓(xùn)威 王東昱 張 平. TMS320C6000 嵌入式系統(tǒng)優(yōu)化編程的研究[D]. 京郵 電大學(xué)電信工程學(xué)無線技術(shù)研究所:, 2006 年.
[8]期刊: 邱春武,余文,楊大利.基于 TMS320C6000 系列 DSP 代碼優(yōu)化方法研究[J]. 科技 信息, 2007, 16(期): 63.
23
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點美食推薦
- XX國有企業(yè)黨委書記個人述責(zé)述廉報告及2025年重點工作計劃
- 世界濕地日濕地的含義及價值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點節(jié)后常見的八大危險
- 廈門城市旅游介紹廈門景點介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個個會應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案