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