新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > TMS320C54x代碼在OMAP5910上的實(shí)現(xiàn)

TMS320C54x代碼在OMAP5910上的實(shí)現(xiàn)

作者: 時(shí)間:2007-03-09 來源:網(wǎng)絡(luò) 收藏
摘要:TMS320C54x 已經(jīng)得到了廣泛應(yīng)用。為了充分利用TMS320C54x 上的軟件開發(fā)成果,節(jié)省開發(fā)成本,需要將TMS320C54x的程序移植到OMAP5910平臺(tái)的TMS320C55x 上運(yùn)行。介紹了利用MASM55對(duì)代碼進(jìn)行重新編碼、對(duì)不能移植的代碼進(jìn)行手工修改、重新編寫系統(tǒng)級(jí)代碼等方法成功地實(shí)現(xiàn)了TMS320C54x到TMS320C55x的代碼移植,正確地實(shí)現(xiàn)了程序的功能。充分利用TMS320C55x新增特征,對(duì)部分運(yùn)算量大的函數(shù)進(jìn)行手工代碼優(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)和新增的累加器、ALU及數(shù)據(jù)寄存器,運(yùn)算能力比C54x增加了一位;C55x通過采用1到6字節(jié)的變長(zhǎng)指令,進(jìn)一步提高了代碼密度。因此,C55x在移動(dòng)通信、視頻和圖像處理、語音和音頻壓縮、語音識(shí)別等實(shí)時(shí)信號(hào)處理中術(shù)具應(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主要有: %26;#183;40位算術(shù)邏輯單元ALU,其中包括一個(gè)40位的滾筒移位器和兩個(gè)獨(dú)立的40位累回器; %26;#183;17位%26;#215;17乘法器和一個(gè)40位加法器,可以實(shí)現(xiàn)單周期乖/加操作; %26;#183;比較、選擇和存儲(chǔ)單元(CSSU),可以快速實(shí)現(xiàn)Viterbi算法中的加比選操作; %26;#183;指數(shù)編碼器,能在單周期內(nèi)計(jì)算40位累加器值的指數(shù); %26;#183;兩個(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),提一步提高了性能并降低了功耗。C55x的結(jié)構(gòu)如圖1所示。C55x的新特征有: %26;#183;先進(jìn)的多總線結(jié)構(gòu),包括一條程序總線、五條數(shù)據(jù)線和六線地址線,共十二條獨(dú)立的總線; %26;#183;統(tǒng)一的程序/數(shù)據(jù)存儲(chǔ)空間結(jié)構(gòu); %26;#183;兩個(gè)MAC單元可以在單周期內(nèi)同時(shí)執(zhí)行兩次乘加操作,增加了并行性; %26;#183;24位寬的地址總線支持8M%26;#215;16bit(16M字節(jié))的可尋址存儲(chǔ)空間; %26;#183;單指令重復(fù)和塊循環(huán)指令可以更加快速靈活地實(shí)現(xiàn)循環(huán); %26;#183;七級(jí)流水線可以獲得高的指令吞吐量; %26;#183;指令緩沖單元(I Unit)讀取、解析、排隊(duì)和解碼指令,可減少對(duì)外部存儲(chǔ)器的訪問,減少功率的損耗; %26;#183;程序流程單元(P Unit)在多個(gè)并行CPU功能單元之間協(xié)調(diào)程序行為,能實(shí)現(xiàn)高效循環(huán)、分支、條件執(zhí)行和流水線保護(hù); %26;#183;地址單元(A Unit)產(chǎn)生數(shù)據(jù)地址,使C55x能實(shí)現(xiàn)高效尋址,而且還包括一個(gè)16位ALU,增加了指令級(jí)的并行性; %26;#183;數(shù)據(jù)計(jì)算單元(D Unit)包括一個(gè)40位ALU、兩個(gè)MAC和一個(gè)移位器,是DSP進(jìn)行數(shù)據(jù)處理的核心部分,這一單元提供的指令級(jí)并行性對(duì)提高處理效率是十分關(guān)鍵的。 2 從C54x到C55x的代碼移值 為了將2.4/1.2/0.8/0.6kb/s系列高質(zhì)量低速率聲碼器算法在OMAP5910的C55x DSP核上實(shí)現(xiàn),將聲碼器的C54x匯編代碼移植到C55x上,進(jìn)行重新編譯、調(diào)試、修改和優(yōu)化,正確地實(shí)現(xiàn)了程序的全部功能,在存儲(chǔ)量和計(jì)算量上都達(dá)到了實(shí)現(xiàn)性要求。從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指令;--purecire:對(duì)循環(huán)尋址代碼的移植進(jìn)行優(yōu)化。 (2) 在C54x源代碼中有選擇性地使用C55x指令 MASM55允許文件中同時(shí)存在C54x和C55x的指令,但代碼必須在C54x兼容模式(C54CM=1)下運(yùn)行,此即依然可以使用和訪問C55x新的寄存器和資源??梢允褂肅55x指令進(jìn)行優(yōu)化的情況主要有: ① 當(dāng)循環(huán)本小于56字節(jié)時(shí),使用RPTBLOCAL代替RPTB或RPTED指令。在C55x CPU中有一個(gè)64字節(jié)的CAL指令緩沖隊(duì)列(IBQ),當(dāng)循環(huán)體較小時(shí),使用RPTBLOCAL指令可以使循環(huán)體全部隊(duì)在指令緩沖隊(duì)列中執(zhí)行,減少對(duì)存儲(chǔ)器的訪問,從而提高執(zhí)行速度。在2400b/s聲碼器的代碼移植過程中,進(jìn)行這種優(yōu)化后,運(yùn)算量從59MIPS下降至49MIPS,減小了約10MIPS,性能提高是非常顯著的。 ② C54x的流水線是完全開放不進(jìn)行保護(hù)的,C55x的流水線是被保護(hù)的。因此,重新安排代碼以減小C55x的流水線延時(shí)。 ③C55x使用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),AR2 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新特征主要有: (2)對(duì)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í)寄存器TO和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間接尋址(Xeme/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ì)某些寄存器的更新尚水完成而后臺(tái)的指令就開始使用該寄存器的情況,這就是流水線沖突。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的頁中,將所有數(shù)據(jù)都放置在第0頁。在C55x中還必須增加-sysstack字,對(duì)系統(tǒng)堆棧進(jìn)行初始化。 3.3 混合編程中C54x和C55x函數(shù)調(diào)用的不同 在進(jìn)行DSP應(yīng)用開發(fā)時(shí),完全采用匯編語言編程,復(fù)雜性高、開發(fā)周期長(zhǎng);而完全采用C語言編程,則程序的執(zhí)行效率相對(duì)較低,不能完全滿足實(shí)時(shí)性要求。因此,可以采用混合編程,把C語言和匯編語言的優(yōu)點(diǎn)有效地結(jié)合起來,對(duì)占用大部分執(zhí)行時(shí)間的核心代碼采用匯編語言編寫,可以大大提高代碼的執(zhí)行效率,而C程序可以像調(diào)用C函數(shù)那樣去調(diào)用匯編函數(shù)。 C語言和匯編語言混合編程中調(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ì)低速率語音編碼算法的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ǔ)上又有了很大的提高,功耗只有C55x的1/6,代碼長(zhǎng)度縮短了30%,性能高出了近五倍。C55x的高性能低功耗特點(diǎn)能大幅度提高便攜式設(shè)備的處理能力和電池的使用壽命,將會(huì)廣泛應(yīng)用于新一代手機(jī)、便攜式音頻播放器、個(gè)人醫(yī)療設(shè)備、數(shù)據(jù)相機(jī)、互聯(lián)網(wǎng)信息系統(tǒng)及節(jié)能的多信道電話系統(tǒng)等領(lǐng)域。因此,在很多場(chǎng)合都需要C54x上的軟件系統(tǒng)移植到平臺(tái)上,本文介紹了方法和經(jīng)驗(yàn)極具推廣價(jià)值。

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉