<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > TMS320C54x代碼在OMAP5910上的實(shí)現

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

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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>