摘 要: TMS320C54x DSP已經(jīng)得到了廣泛應(yīng)用。為了充分利用TMS320C54x DSP上的軟件開發(fā)成果,節(jié)省開發(fā)成本,需要將TMS320C54x的程序移植到OMAP5910平臺(tái)的TMS320C55x DSP上運(yùn)行。介紹了利用MASM55對(duì)代碼進(jìn)行重新編譯、對(duì)不能移植的代碼進(jìn)行手工修改、重新編寫系統(tǒng)級(jí)代碼等方法成功地實(shí)現(xiàn)了從TMS320C54x到TMS320C55x的代碼移植" title="代碼移植">代碼移植,正確地實(shí)現(xiàn)了程序的功能。充分利用TMS320C55x新增特征,對(duì)部分運(yùn)算量大的函數(shù)進(jìn)行手工代碼優(yōu)化" title="代碼優(yōu)化">代碼優(yōu)化,大幅度地降低了程序的運(yùn)算量,提高了代碼的執(zhí)行效率和性能。
關(guān)鍵詞: OMAP5910 TMS320C55x TMS320C54x 代碼移植 代碼優(yōu)化
OMAP5910是一個(gè)高度集成的硬件和軟件平臺(tái),采用獨(dú)特的雙核結(jié)構(gòu),集成了一個(gè)ARM9核和一個(gè)TMS320C55x(以下簡(jiǎn)稱C55x)DSP核。OMAP5910雙核處理器有很強(qiáng)的運(yùn)算能力和超低功耗,具有廣闊的應(yīng)用前景。C55x是TI公司在TMS320C54x(以下簡(jiǎn)稱C54x)的基礎(chǔ)上推出的最新一代’C5000 DSP,通過低功耗設(shè)計(jì)和先進(jìn)的功率管理技術(shù)獲得了0.9V時(shí)0.05mW/MIPS的超低功耗,性能達(dá)到800MIPS;C55x通過采用并行指令、雙MAC結(jié)構(gòu)和新增的累加器" title="累加器">累加器、ALU及數(shù)據(jù)寄存器,運(yùn)算能力比C54x增加了一倍;C55x通過采用1到6字節(jié)的變長(zhǎng)指令,進(jìn)一步提高了代碼密度。因此,C55x在移動(dòng)通信、視頻和圖像處理、語(yǔ)音和音頻壓縮、語(yǔ)音識(shí)別等實(shí)時(shí)信號(hào)處理中極具應(yīng)用潛力。C54x DSP具有很好的適應(yīng)性和較高的運(yùn)算速度,已經(jīng)獲得了廣泛的應(yīng)用。為了節(jié)省開發(fā)成本,縮短開發(fā)周期,可以利用C54x上已有的開發(fā)成果,將C54x的程序移植到C55x DSP上運(yùn)行。C55x和C54x指令是兼容的,但存儲(chǔ)器配置、指令流水線、片上外設(shè)、堆棧管理和中斷是不同的,通過對(duì)這些不同點(diǎn)進(jìn)行修改和處理,可以較快地實(shí)現(xiàn)系統(tǒng)移植。
1 C54x DSP和C55x DSP簡(jiǎn)介
C54x DSP采用改進(jìn)的哈佛結(jié)構(gòu),對(duì)程序和數(shù)據(jù)存儲(chǔ)區(qū)使用分離的總線,可以同時(shí)取指令和操作數(shù),提高了程序的運(yùn)行效率和通用性。C54x高度專用的指令結(jié)構(gòu)提供了快速的算法實(shí)現(xiàn)和方便的優(yōu)化,采用5V或3V靜態(tài)CMOS技術(shù)并結(jié)合先進(jìn)的IC處理技術(shù)實(shí)現(xiàn)了低功耗。
C54x采用多總線結(jié)構(gòu),包括一條程序總線、三條數(shù)據(jù)總線和四條地址總線。
C54x的CPU主要有:
·40位算術(shù)邏輯單元ALU,其中包括一個(gè)40位的滾筒移位器和兩個(gè)獨(dú)立的40位累加器;
·17位×17位乘法器和一個(gè)40位加法器,可以實(shí)現(xiàn)單周期乘/加操作;
·比較、選擇和存儲(chǔ)單元(CSSU),可以快速實(shí)現(xiàn)Viterbi算法中的加比選操作;
·指數(shù)編碼器,能在單周期內(nèi)計(jì)算40位累加器值的指數(shù);
·兩個(gè)地址產(chǎn)生器,包括8個(gè)輔助寄存器(AR0~AR7)和兩個(gè)輔助寄存器算術(shù)單元。
C54x的存儲(chǔ)器分為程序區(qū)、數(shù)據(jù)區(qū)、I/O 區(qū)三個(gè)獨(dú)立的部分,每部分的尋址能力都是64K字。C54x 提供7種數(shù)據(jù)區(qū)尋址方式:直接尋址、絕對(duì)尋址、累加器尋址、指令中包含7位地址的直接尋址、間接尋址、存儲(chǔ)器映射寄存器尋址和堆棧尋址。C54x中每條指令的執(zhí)行都要經(jīng)過六級(jí)流水線操作:預(yù)取指令、取指令、解碼、訪問、讀取和執(zhí)行。
在繼承C54x優(yōu)點(diǎn)的基礎(chǔ)上,C55x又做了一些改進(jìn),進(jìn)一步提高了性能并降低了功耗。C55x的結(jié)構(gòu)如圖1所示。C55x的新特征有:
·先進(jìn)的多總線結(jié)構(gòu),包括一條程序總線、五條數(shù)據(jù)線和六條地址線,共十二條獨(dú)立的總線;
·統(tǒng)一的程序/數(shù)據(jù)存儲(chǔ)空間結(jié)構(gòu);
·兩個(gè)MAC單元可以在單周期內(nèi)同時(shí)執(zhí)行兩次乘/加操作,增加了并行性;
·24位寬的地址總線支持8M×16bit(16M字節(jié))的可尋址存儲(chǔ)空間;
·單指令重復(fù)和塊循環(huán)指令可以更加快速靈活地實(shí)現(xiàn)循環(huán);
·七級(jí)流水線可以獲得高的指令吞吐量;
·指令緩沖單元(I Unit)讀取、解析、排隊(duì)和解碼指令,可減少對(duì)外部存儲(chǔ)器的訪問,減少功率的損耗;
·程序流程單元(P Unit)在多個(gè)并行CPU功能單元之間協(xié)調(diào)程序行為,能實(shí)現(xiàn)高效循環(huán)、分支、條件執(zhí)行和流水線保護(hù);
·地址單元(A Unit)產(chǎn)生數(shù)據(jù)地址,使C55x能實(shí)現(xiàn)高效尋址,而且還包括一個(gè)16位ALU,增加了指令級(jí)的并行性;
·數(shù)據(jù)計(jì)算單元(D Unit)包括一個(gè)40位ALU、兩個(gè)MAC和一個(gè)移位器,是DSP進(jìn)行數(shù)據(jù)處理的核心部分,這一單元提供的指令級(jí)并行性對(duì)提高處理效率是十分關(guān)鍵的。C54x和C55x CPU硬件特征的比較見表1。
2 從C54x到C55x的代碼移植
為了將2.4/1.2/0.8/0.6kb/s系列高質(zhì)量低速率聲碼器" title="聲碼器">聲碼器算法在OMAP5910的C55x DSP核上實(shí)現(xiàn),將聲碼器的C54x匯編代碼移植到C55x上,進(jìn)行重新編譯、調(diào)試、修改和優(yōu)化,正確地實(shí)現(xiàn)了程序的全部功能,在存儲(chǔ)量和計(jì)算量上都達(dá)到了實(shí)時(shí)性要求。從C54x到C55x的代碼移植可以分為下面三個(gè)步驟。
2.1 使用MASM55對(duì)代碼進(jìn)行重新編譯
MASM55能對(duì)C54x匯編代碼進(jìn)行編譯,產(chǎn)生C55x的目標(biāo)代碼。雖然C55x和C54x的指令是兼容的,但它們的存儲(chǔ)器配置、片上外設(shè)、堆棧管理和中斷是不同的,因此相關(guān)代碼需要進(jìn)行手工修改。
(1)修改不可移植的代碼。不能直接移植的代碼主要有使用硬編碼地址和偏移量的代碼、利用C54x流水線開放特點(diǎn)的代碼、使用C55x代碼產(chǎn)生工具保留符號(hào)的代碼以及使用ARP寄存器的代碼等。
(2)修改系統(tǒng)級(jí)代碼。其中包括:增加初始化系統(tǒng)堆棧的代碼;重寫中斷向量表,重寫初始化PMST寄存器的代碼,修改初始化IMR和IFR寄存器的代碼;重寫訪問外設(shè)和EMIF寄存器的代碼,替換訪問C54x I/O空間的代碼;重新編寫連接器命令文件。
2.2 對(duì)中等運(yùn)算量的函數(shù)進(jìn)行選擇性的代碼優(yōu)化
通過2.1節(jié)可以獲得功能正確的代碼,但還需對(duì)某些運(yùn)算量較大的函數(shù)進(jìn)行優(yōu)化。
(1)使用MASM55的優(yōu)化選項(xiàng)進(jìn)行重新編譯
這些選項(xiàng)有-mh、-mt、-mn和--purecirco。-mh:設(shè)定編譯器的優(yōu)化目標(biāo)是速度而非代碼大?。?mt:如果程序中一直保持SST=0,使用這個(gè)選項(xiàng)可以提高代碼的空間和時(shí)間效率;-mn:刪除無用的NOP指令;--purecirc:對(duì)循環(huán)尋址代碼的移植進(jìn)行優(yōu)化。
(2)在C54x源代碼中有選擇性地使用C55x指令
MASM55允許文件中同時(shí)存在C54x和C55x的指令,但代碼必須在C54x兼容模式(C54CM=1)下運(yùn)行,此時(shí)依然可以使用和訪問C55x新的寄存器和資源??梢允褂肅55x指令進(jìn)行優(yōu)化的情況主要有:
?、佼?dāng)循環(huán)體小于56字節(jié)時(shí),使用RPTBLOCAL代替 RPTB或RPTBD指令。在C55x CPU中有一個(gè)64字節(jié)的指令緩沖隊(duì)列(IBQ),當(dāng)循環(huán)體較小時(shí),使用RPTBLOCAL指令可以使循環(huán)體全部在指令緩沖隊(duì)列中執(zhí)行,減少對(duì)存儲(chǔ)器的訪問,從而提高執(zhí)行速度。在2400b/s聲碼器的代碼移植過程中,進(jìn)行這種優(yōu)化后,運(yùn)算量從59MIPS下降至49MIPS,減小了約10 MIPS,性能提高是非常顯著的。
?、贑54x的流水線是完全開放不進(jìn)行保護(hù)的,C55x的流水線是被保護(hù)的。因此,重新安排代碼以減小C55x的流水線延時(shí)。
?、跜55x使用T2寄存器而不是ASM來實(shí)現(xiàn)累加器移位。為了與C54x兼容,C55x使用一個(gè)特殊的硬件邏輯自動(dòng)將ASM域中的值復(fù)制到T2中。故將C54x的ASM Load指令替換為相應(yīng)的C55x指令。用C55x本地指令代替ASM Load指令可以避免MASM55將其翻譯成多條指令。例如,將LD *AR2,ASM替換為MOV *AR2,T2。
④在C54x代碼中,經(jīng)常需要加入一些NOP指令以避免流水線沖突,而C55x會(huì)自動(dòng)加入延時(shí)避免沖突,故刪除無用的NOP指令。
?、莓?dāng)BK=0時(shí),去掉循環(huán)尋址符號(hào)%和初始化BK的代碼。
(3)對(duì)C54x指令應(yīng)用C55x指令級(jí)并行性
在C54x代碼移植列C55x環(huán)境之前,可以應(yīng)用C55x指令級(jí)并行性,按一定的規(guī)則將某些指令變成并行對(duì),例如:
STLM A, AR2 | | MVDK *SP(h), AR3
MVDK *SP(db), AR4 | | LD #0, A
通過本節(jié)的工作可以修改某些由MASM55產(chǎn)生的低效率代碼,利用C55x的指令級(jí)并行性,改進(jìn)堆棧的使用,從而降低運(yùn)算量并獲得更好的性能。
2.3使用C55x指令對(duì)高運(yùn)算量函數(shù)進(jìn)行代碼優(yōu)化
經(jīng)過2.2節(jié)的優(yōu)化后,程序的性能仍不能滿足要求,可以利用C55x的結(jié)構(gòu)特點(diǎn),使用C55x本地指令重新編寫某些運(yùn)算量密集的函數(shù)。占用整個(gè)算法運(yùn)算量80%以上的函數(shù)可以考慮用C55x本地指令來實(shí)現(xiàn)??梢杂糜趦?yōu)化的C55x新特征主要有:
(1)雙MAC優(yōu)化
C54x可以在一個(gè)周期內(nèi)實(shí)現(xiàn)一次乘/加操作,C55x則可以在一個(gè)周期內(nèi)使用來自C、D和B總線的三個(gè)獨(dú)立操作數(shù)實(shí)現(xiàn)兩次乘/加操作,兩個(gè)MAC單元都使用B總線提供的數(shù)據(jù),如圖2所示。因此雙MAC指令的第三和第四個(gè)操作數(shù)必須是相同的,例如MAC *AR2+, *CDP+, AC0 ::MAC *AR3+, *CDP+, AC1。在可能的情況下,將C54x實(shí)現(xiàn)單MAC操作的指令替換為C55x雙MAC指令,可以使運(yùn)算量下降為原來的1/2。
(2)循環(huán)尋址的優(yōu)化
C55x中循環(huán)尋址的實(shí)現(xiàn)方法較之C54x更加靈活方便。首先,C55x不需要循環(huán)緩沖隊(duì)列,最多可支持五個(gè)緩沖區(qū)和三種循環(huán)緩沖區(qū)大小。其次,C54x循環(huán)尋址的ARn寄存器包含的是絕對(duì)地址,而C55x ARn包含的是相對(duì)于BSAxx寄存器中緩沖區(qū)起始地址的偏移。
(3)優(yōu)化循環(huán)的實(shí)現(xiàn)
C54x和C55x有相似的循環(huán)和塊循環(huán)機(jī)制,但C55x支持兩級(jí)塊循環(huán)嵌套(在C54CM=0時(shí)),增加了新指令RPTBLOCAL和使用CSR的單重復(fù)指令(RPTADD和RPTSUB)。因此,應(yīng)從以下方面進(jìn)行優(yōu)化:盡量使用RPTBLOCAL代替RPTB;使用RPTB或RPTBLOCAL代替BANZ實(shí)現(xiàn)外層循環(huán);當(dāng)單指令重復(fù)次數(shù)是在運(yùn)行時(shí)計(jì)算時(shí),使用RPT/RPTADD/RPTSUB指令。
(4)A單元ALU的利用
利用C55x中新增的16位A單元ALU可以實(shí)現(xiàn)更高效的ARn計(jì)算,利用AMOV指令可以更快地對(duì)AR進(jìn)行初始化。
(5)新增累加器和T寄存器的使用
C54x有兩個(gè)累加器和一個(gè)臨時(shí)寄存器,C55x有四個(gè)累加器,且增加了兩個(gè)臨時(shí)寄存器T0和T1。這些累加器和寄存器可以代替數(shù)據(jù)存儲(chǔ)器保存中間結(jié)果和臨時(shí)變量,從而減少流水線延時(shí),提高并行性。
(6)使用雙操作數(shù)讀和寫實(shí)現(xiàn)快速數(shù)據(jù)移動(dòng)
C54x只有兩條16位讀總線和一條16位寫總線,C55x增加了一條讀總線和一條寫總線,可以在一個(gè)周期內(nèi)完成32位的寫操作,而C54x則需要兩個(gè)周期。
(7)充分利用Xmem/Ymem尋址
在C54x和C55x中,特殊的雙AR間接尋址(Xmem/Ymem)方式可以同時(shí)進(jìn)行兩個(gè)16位數(shù)據(jù)存儲(chǔ)器訪問。C54x的Xmem/Ymem尋址局限于四種組合(*ARx、*ARx+、 *ARx-, *ARx+0%),只能使用AR2、AR3、AR4、AR5,而C55x可以使用八個(gè)輔助寄存器中的任何一個(gè)。3 移植過程中需要注意的問題
3.1 C54x和C55x流水線的不同
由于在順序流水線操作中,每條指令都是在前面幾條指令尚未完全結(jié)束時(shí)就開始執(zhí)行的,所以就有可能發(fā)生前面指令對(duì)某些寄存器的更新尚未完成而后面的指令就開始使用該寄存器的情況,這就是流水線沖突。C54x的流水線是完全開放的,在編程中需要特別注意防止流水線沖突。因此,有時(shí)需要在兩條指令之間加入一條或幾條NOP指令來形成延時(shí),以保證后面指令使用寄存器時(shí),前面指令對(duì)它的更新已經(jīng)完成。有時(shí)為了使程序更加優(yōu)化,可以充分利用這種延時(shí)來插入其它指令。C55x的流水線是完全保護(hù)的,在可能發(fā)生沖突時(shí)會(huì)自動(dòng)加入延時(shí)保證指令順序執(zhí)行。因此,利用C54x流水線具有開放特點(diǎn)的代碼移植到C55x,執(zhí)行結(jié)果就可能與原來不一樣,產(chǎn)生錯(cuò)誤。例如:
DLD *AR_kernel+, A
MAX B
ADDM #1, *AR_i
XC 1, NC
MVDD *AR_i, *AR_maxgp
C54x中ADDM指令放在XC指令之前是為了利用C54x不對(duì)流水線進(jìn)行保護(hù)的特點(diǎn),節(jié)省NOP周期,而在C55x中指令是順序執(zhí)行的,ADDM指令會(huì)影響到后面指令的判斷條件,從而導(dǎo)致程序出錯(cuò),因此必須進(jìn)行修改,將ADDM指令置于MVDD之后。
3.2 命令文件的編寫
命令文件對(duì)堆棧和系統(tǒng)堆棧的大小進(jìn)行初始化、分配程序和數(shù)據(jù)在存儲(chǔ)器中的位置和各自的大小。在編寫命令文件時(shí),需要注意C54x和C55x的差別。C54x的程序和數(shù)據(jù)存儲(chǔ)空間是分開的,而C55x采用統(tǒng)一的存儲(chǔ)器結(jié)構(gòu),程序和數(shù)據(jù)共享同一地址空間。在命令文件中,C54x使用以16位字為單位的地址和長(zhǎng)度,而C55x以字節(jié)為單位。對(duì)于.sysmem和.stack節(jié),若要保持與C54x中相同的大小,應(yīng)將原來的值乘以2。需要注意的是,在C55x的map文件中,程序地址是以字節(jié)為單位,數(shù)據(jù)地址則是以16位字為單位的。將C54x代碼移植到C55x上,對(duì)程序和數(shù)據(jù)空間的分配有一些限制,必須將數(shù)據(jù)堆棧和系統(tǒng)堆棧分配在同一64K字的頁(yè)中,將所有數(shù)據(jù)都放置在第0頁(yè)。在C55x中還必須增加-sysstack節(jié),對(duì)系統(tǒng)堆棧進(jìn)行初始化。
3.3 混合編程中C54x和C55x函數(shù)調(diào)用的不同
在進(jìn)行DSP應(yīng)用開發(fā)時(shí),完全采用匯編語(yǔ)言" title="匯編語(yǔ)言">匯編語(yǔ)言編程,復(fù)雜性高、開發(fā)周期長(zhǎng);而完全采用C語(yǔ)言編程,則程序的執(zhí)行效率相對(duì)較低,不能完全滿足實(shí)時(shí)性要求。因此,可以采用混合編程,把C語(yǔ)言和匯編語(yǔ)言的優(yōu)點(diǎn)有效地結(jié)合起來,對(duì)占用大部分執(zhí)行時(shí)間的核心代碼采用匯編語(yǔ)言編寫,可以大大提高代碼的執(zhí)行效率,而C程序可以像調(diào)用C函數(shù)那樣去調(diào)用匯編函數(shù)。
C語(yǔ)言和匯編語(yǔ)言混合編程中調(diào)用子程序時(shí),C54x中使用寄存器A和堆棧傳遞函數(shù)參數(shù),而C55x中則使用AR和T0寄存器傳遞參數(shù)。設(shè)函數(shù)格式為:Word32 funcname(參數(shù)1, 參數(shù)2, 參數(shù)3, 參數(shù)4, …, 參數(shù)n),C54x函數(shù)參數(shù)傳遞規(guī)則如下:參數(shù)1放在寄存器A中,其它參數(shù)依次存入堆棧,參數(shù)2存入SP(0) ,參數(shù)3存入SP(1),…,依此類推。各種指針類型參數(shù)占用1個(gè)字(Word16)。若某參數(shù)為Word32類型,則其在堆棧中必須為雙字對(duì)齊,也即放置在*SP(2n)處,函數(shù)返回值放在寄存器A中。C55x函數(shù)參數(shù)傳遞規(guī)則如下:最后一個(gè)參數(shù)(參數(shù)n)利用寄存器T0來傳遞,其它參數(shù)依次放在AR0,AR1,AR2,…中,例如參數(shù)1放在AR0中、參數(shù)2放在AR1中等。
在C程序中,分配局部變量、變量初始化、傳遞函數(shù)變量、保存函數(shù)返回地址、保護(hù)臨時(shí)結(jié)果等功能都是靠堆棧完成的。C編譯器無法檢查程序運(yùn)行時(shí)堆棧是否溢出,所以應(yīng)盡量多給堆棧分配空間。在程序不正常跑飛時(shí)應(yīng)注意檢查是否堆棧溢出。
通過對(duì)低速率語(yǔ)音編碼算法的C54x代碼進(jìn)行一些手工修改,然后用MASM55重新編譯,很快地將其移植到了OMAP5910的C55x DSP芯片上,在非常短的時(shí)間內(nèi)正確地實(shí)現(xiàn)了程序的全部功能。測(cè)試發(fā)現(xiàn),直接從C54x移植過來的代碼在C55x上執(zhí)行效率比較低。例如,2400b/s聲碼器的運(yùn)算量從原來的37.8MIPS上升為64MIPS,經(jīng)過第二階段的優(yōu)化后,運(yùn)算量降至39MIPS,基本上與原來在C54x上的性能相當(dāng),繼續(xù)進(jìn)行第三階段的優(yōu)化可以獲得比原來更好的性能。實(shí)踐證明,利用本文的方法將算法在C55x上實(shí)時(shí)實(shí)現(xiàn),能充分利用先前在C54x上的開發(fā)成果、節(jié)省時(shí)間和人力、降低開發(fā)成本,是一種行之有效極具應(yīng)用價(jià)值的方法。
C54x是業(yè)界目前最省電的DSP元件,已經(jīng)成為通信市場(chǎng)的主流產(chǎn)品,應(yīng)用于全世界70%的數(shù)字移動(dòng)電話中。C55x在C54x的基礎(chǔ)上又有了很大的提高,功耗只有C54x的1/6,代碼長(zhǎng)度縮短了30%,性能高出了近五倍。C55x的高性能低功耗特點(diǎn)能大幅度提高便攜式設(shè)備的處理能力和電池的使用壽命,將會(huì)廣泛應(yīng)用于新一代手機(jī)、便攜式音頻播放器、個(gè)人醫(yī)療設(shè)備、數(shù)碼相機(jī)、互聯(lián)網(wǎng)信息系統(tǒng)及節(jié)能的多信道電話系統(tǒng)等領(lǐng)域。因此,在很多場(chǎng)合都需要將C54x上的軟件系統(tǒng)移植到C55x平臺(tái)上,本文介紹的方法和經(jīng)驗(yàn)極具推廣價(jià)值。
參考文獻(xiàn)
1 TMS320C55x Technical Overview. Texas Instruments Inc., 2000
2 TMS320C55x DSP CPU Reference Guide. Texas Instruments Inc., 2004
3 TMS320C54x DSP Reference Set Volume 1:CPU and Periph-erals. Texas Instruments Inc., 2001
4 TMS320C54x DSP Reference Set Volume 2: Mnemonic Instruction Set.Texas Instruments Inc., 2001
5 C54x-to-C55x Code Migration Reference Guide. Texas Instruments Inc., 2003