1.引言
ADSP-TS201是ADI公司推出的新一代高性能浮點(diǎn)DSP,如何在有限的時(shí)間內(nèi)采用編程語(yǔ)言進(jìn)行進(jìn)行算法實(shí)現(xiàn)并使程序效率盡量滿(mǎn)足實(shí)時(shí)性要求是一項(xiàng)值得研究的問(wèn)題。
目前在DSP平臺(tái)上,編程多是混合使用匯編語(yǔ)言和C語(yǔ)言的,匯編語(yǔ)言簡(jiǎn)潔高效,能夠直接操作DSP的內(nèi)部寄存器、存儲(chǔ)空間、外設(shè),但可讀性、可修改性、可移植性較差;而C語(yǔ)言是一種較為高效的高級(jí)語(yǔ)言,在可讀性、可移植性方面優(yōu)于匯編指令。因此有必要根據(jù)DSP的特性對(duì)C語(yǔ)言編寫(xiě)的程序進(jìn)行進(jìn)一步的優(yōu)化,或者使用C和匯編的混合混編方法。
2.基于TS201的C/C++常用優(yōu)化方法
(1)使用16位和8位數(shù)據(jù)類(lèi)型。
(2)靜態(tài)初始化常量。
(3)在內(nèi)部循環(huán)中做盡量多的處理工作。
(4)循環(huán)中避免使用條件指令,條件指令會(huì)打斷循環(huán)的流水,并且條件判決結(jié)論和編譯器預(yù)先估計(jì)的不一樣,就會(huì)有很長(zhǎng)的等待開(kāi)銷(xiāo)。
(5)用移位來(lái)代替除法,除法需要調(diào)用函數(shù),且代價(jià)也相當(dāng)高,當(dāng)除數(shù)是2的冪次時(shí),編譯器會(huì)使用執(zhí)行速度更高的移位操作來(lái)代替除法。
3.C/C++和匯編混合編程方法
C/C++語(yǔ)言和匯編語(yǔ)言混合編程的具體方法有以下兩種,這兩種方法實(shí)現(xiàn)的關(guān)鍵都是要遵守ADSP-TS201 編譯器C/C++運(yùn)行時(shí)模型所做的規(guī)定。
3.1 在C/C++中嵌入?yún)R編
在C/C++程序中嵌入?yún)R編asm()命令,直接寫(xiě)出匯編語(yǔ)句,不需要知道哪個(gè)寄存器或存儲(chǔ)器包含C變量。其語(yǔ)法格式是:
asm(模板
:限制語(yǔ)句(輸出操作數(shù))[,限制語(yǔ)句(輸出操作數(shù))]
:限制語(yǔ)句(輸入操作數(shù))[,限制語(yǔ)句(輸入操作數(shù))]
:選中寄存器);
模板:模板是包含“%數(shù)字”的匯編指令的一串字符,用來(lái)說(shuō)明編譯器在哪個(gè)位置替代操作數(shù)。操作數(shù)按從左到右的順序被編號(hào),編號(hào)的范圍是%0,%1…%9。多個(gè)操作數(shù)用分號(hào)“;”隔開(kāi),整個(gè)語(yǔ)句包含在雙引號(hào)“”里。
限制語(yǔ)句:限制語(yǔ)句是一個(gè)字符串,用來(lái)指示編譯器對(duì)輸出和輸入操作數(shù)使用特定的寄存器組?!?限制語(yǔ)句”里的“=”說(shuō)明操作數(shù)是輸出,所有的輸出操作數(shù)限制語(yǔ)句前必須加“=”。
選中寄存器:選中寄存器用小寫(xiě)字母寫(xiě),每個(gè)寄存器名都用雙引號(hào)“”括起來(lái),不同的寄存器中間用逗號(hào)“,”隔開(kāi),每個(gè)選中的寄存器都要出現(xiàn)在這里。
調(diào)用C子程序,使用的總時(shí)鐘數(shù)和子程序時(shí)鐘數(shù)分別是52872和520216。調(diào)用匯編子程序,使用的總時(shí)鐘數(shù)和子程序時(shí)鐘數(shù)分別是168537和160050。
4.結(jié)束語(yǔ)
本文介紹了基于ADSP-TS201平臺(tái)的代碼優(yōu)化方法——C優(yōu)化方法和混合匯編方法。由示例可以看出,這兩種方法都可以提高程序運(yùn)行效率。
參考文獻(xiàn)
[1]劉書(shū)明,蘇濤,羅軍輝.TigerSHARC DSP應(yīng)用系統(tǒng)設(shè)計(jì)[M].電子工業(yè)出版社,2004,5.
[2]VisualDSP++ 4.5 C_C++ Compiler and Library Manual for TigerSHARC Processors,2005:50-159,300-311,328-333,347- 389.
[3]VisualDSP++ 4.5 User’s Guide.
[4]ADSP_TS201s Programming Reference.