TMS320C54x軟件開發(fā).ppt_第1頁(yè)
TMS320C54x軟件開發(fā).ppt_第2頁(yè)
TMS320C54x軟件開發(fā).ppt_第3頁(yè)
TMS320C54x軟件開發(fā).ppt_第4頁(yè)
TMS320C54x軟件開發(fā).ppt_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章 TMS320C54x軟件開發(fā),CCS運(yùn)行主窗口, 用CCS開發(fā)程序,創(chuàng)建工程文件 工程文件中包含著設(shè)計(jì)中所有的源代碼文件、鏈接器命令文件、庫(kù)函數(shù)、頭文件等。 volume.h rts.lib volume.c volume1.pjt load.asm vectors.asm volume.cmd,5.1 軟件開發(fā)過程及開發(fā)工具,1建立源程序 2C編譯器 (C Compiler) 3匯編器 (Assembler) 4連接器 (Linker) 5調(diào)試工具 6十六進(jìn)制轉(zhuǎn)換公用程序 (Hex Conversion Utility),圖5-1 TMS320C54x DSP軟件開發(fā)流程,5.2 公共目標(biāo)文件格式,5.2.1 COFF文件的基本單元段,段(sections)是COFF文件中最重要的概念。一個(gè)段就是最終在存儲(chǔ)器映象中占據(jù)連續(xù)空間的一個(gè)數(shù)據(jù)或代碼塊。目標(biāo)文件中的每一個(gè)段都是相互獨(dú)立的。一般地,COFF目標(biāo)文件包含3個(gè)缺省的段:text段、data段、bss段。 段可以分為兩大類,即已初始化段和未初始化段。 如圖5-2所示為目標(biāo)文件中的段與目標(biāo)系統(tǒng)中存儲(chǔ)器的關(guān)系。,圖5-2 目標(biāo)文件中的段與目標(biāo)存儲(chǔ)器的關(guān)系,5.2.2 匯編器對(duì)段的處理,1未初始化段 未初始化段主要用來在存儲(chǔ)器中保留空間,通常將它們定位到RAM中。這些段在目標(biāo)文件中沒有實(shí)際內(nèi)容,只是保留空間而已。程序可以在運(yùn)行時(shí)利用這些空間建立和存儲(chǔ)變量。未初始化段是通過使用.bss和.usect匯編偽指令建立的,兩條偽指令的句法分別為: .bss 符號(hào),字?jǐn)?shù) 符號(hào) .usect “段名”,字?jǐn)?shù),2已初始化段 已初始化段包含可執(zhí)行代碼或已初始化數(shù)據(jù)。這些段的內(nèi)容存儲(chǔ)在目標(biāo)文件中,加載程序時(shí)再放到TMS320C54X存儲(chǔ)器中。三個(gè)用于建立初始化段的偽指令句法分別為: .text 段起點(diǎn) .data 段起點(diǎn) .sect “段名”,段起點(diǎn),例 計(jì)算 y=a1x1 + a2x2 + a3x3 +a 4x4 其中: a1=1 . a2=2 .a3= 3 . a4=4 x1=8 . X2=6. x3=4 . X4=2 匯編源程序 xx . asm . title “ xx. asm ” . mmregs stack . usect “stack ” ,10h ; . bss a , 4 ; . bss x , 4 ; . bss y , 1 ;,. def start ; . data table: . word 1, 2, 3, 4 ; .word 8, 6, 4, 2 ; .text ; start: - - STM #a , AR1 ; RPT #7 ; MVPD table , *AR1+ ; -,3命名段 命名段就是程序員自己定義的段,它與缺省的.text、.data和.bss段一樣使用,但與缺省段分開匯編。例:usect段將未初始化的變量匯編到與bss段不同的存儲(chǔ)器中。產(chǎn)生命名段的偽指令為: 符號(hào) .usect “段名”,字?jǐn)?shù) .sect “段名”,段起點(diǎn),4子段 子段(Subsections)是大段中的小段。鏈接器可以像處理段一樣處理子段。采用子段可以使存儲(chǔ)器圖更加緊密。子段的命名句法為: 基段名:子段名 子段也有兩種,用.sect命令建立的是已初始化段,用.usect命令建立的是未初始化段。,例 計(jì)算 y=a1x1 + a2x2 + a3x3 +a 4x4 其中: a1=1 . a2=2 .a3= 3 . a4=4 x1=8 . X2=6. x3=4 . X4=2 匯編源程序 xx . asm . title “ xx. asm ” . mmregs stack . usect “stack ” ,10h ; . bss a , 4 ; . bss x , 4 ; . bss y , 1 ;,5段程序計(jì)數(shù)器(SPC) 匯編器為每個(gè)段安排一個(gè)獨(dú)立的程序計(jì)數(shù)器,即段程序計(jì)數(shù)器(SPC)。 SPC表示一個(gè)程序代碼段或數(shù)據(jù)段內(nèi)的當(dāng)前地址。開始時(shí),匯編器將每個(gè)SPC置0,當(dāng)匯編器將程序代碼或數(shù)據(jù)加到一個(gè)段內(nèi)時(shí),相應(yīng)的SPC增加。如果匯編器再次遇到相同段名的段,繼續(xù)匯編至相應(yīng)的段,且相應(yīng)的SPC在先前的基礎(chǔ)上繼續(xù)增加。,圖5-3 產(chǎn)生的目標(biāo)代碼,SPC(0000H),SPC(0000H),SPC(0000H),SPC(0000H),SPC(0000H),SPC(0003H),SPC(0004H),SPC(0005H),5.2.3 鏈接器對(duì)段的處理,1.鏈接器對(duì)段的處理有兩個(gè)功能: 它將匯編器產(chǎn)生的COFF目標(biāo)文件(.obj文件)中的各種段作為輸入段,當(dāng)有多個(gè)文件進(jìn)行鏈接時(shí),它將輸入段組合起來,在可執(zhí)行的COFF輸出模塊中建立各個(gè)輸出段。 鏈接器為輸出段選擇存儲(chǔ)器地址。,2.鏈接器有兩個(gè)命令完成上述功能,即: MEMORY 命令定義目標(biāo)系統(tǒng)的存儲(chǔ)器配置圖,包括對(duì)存儲(chǔ)器各部分的命名,以及規(guī)定它們的起始地址和長(zhǎng)度。 SECTIONS命令告訴鏈接器如何將輸入段組合成輸出段,在存儲(chǔ)器何處存放。子段可以用來更精確地編排段,可用鏈接器SECTIONS命令指定子段。,圖5-4 鏈接器默認(rèn)的存儲(chǔ)器分配,5.2.4 重新定位,1鏈接時(shí)重新定位 將各個(gè)段定位到存儲(chǔ)器中,每個(gè)段都從合適的地址開始。 將符號(hào)值調(diào)整到相對(duì)于新的段地址的數(shù)值。 調(diào)整對(duì)重新定位后符號(hào)的引用。,2運(yùn)行時(shí)重新定位 將代碼裝入存儲(chǔ)器的一個(gè)地方,而運(yùn)行在另一個(gè)地方。利用SECTIONS命令選項(xiàng)讓鏈接器定位兩次。一些關(guān)鍵的執(zhí)行代碼必須裝入在系統(tǒng)的ROM中,但希望在較快的RAM中運(yùn)行。 鏈接器提供了一個(gè)簡(jiǎn)單的處理該問題的方法。利用SECTIONS命令選項(xiàng)讓鏈接器定位兩次。第一次使用裝入關(guān)鍵字設(shè)置裝入地址,再用運(yùn)行關(guān)鍵字設(shè)置運(yùn)行地址。,5.2.5 程序裝入,硬件仿真器和CCS集成開發(fā)環(huán)境,具有內(nèi)部的裝入器,調(diào)用裝入器的LOAD命令即可裝入可執(zhí)行程序。 將代碼固化在片外存儲(chǔ)器中,采用Hex轉(zhuǎn)換工具(Hex conversion utility),例如Hex500將可執(zhí)行的COFF目標(biāo)模塊(.out文件)轉(zhuǎn)換成幾種其他目標(biāo)格式文件,然后將轉(zhuǎn)換后的文件用編程器將代碼寫入EPROM/Flash。,片外RAM,EPROM/flash,DSP 片內(nèi)RAM,輸入/輸出,5.2.6 COFF文件中的符號(hào),COFF文件中有一個(gè)符號(hào)表,用于存儲(chǔ)程序中的符號(hào)信息。鏈接器對(duì)符號(hào)重定位時(shí)使用該表,調(diào)試工具也使用該表來提供符號(hào)調(diào)試。 外部符號(hào)指在一個(gè)模塊中定義,在另一個(gè)模塊中使用的符號(hào)??墒褂?def、.ref或.global匯編偽指令將符號(hào)定義為外部符號(hào)。 .def在當(dāng)前模塊中定義,可以在別的模塊中使用的符號(hào); .ref在當(dāng)前模塊中引用,但在別的模塊中定義的符號(hào); .global可用于以上任何一種情況。,. def start ; . data table: . word 1, 2, 3, 4 ; .word 8, 6, 4, 2 ; .text ; start: - - STM #a , AR1 ; RPT #7 ; MVPD table , *AR1+ ; -,5.3 常用匯編偽指令,1段定義偽指令 為便于鏈接器將程序、數(shù)據(jù)分段定位于指定的(物理存在的)存儲(chǔ)器 空間,并將不同的obj文件鏈接起來。段的使用非常靈活,但常用以下約定: .text 此段存放程序代碼。 .data 此段存放初始化了的數(shù)據(jù)。 .bss 此段存入未初始化的變量。 .sect 名稱 定義一個(gè)有名段,放初始化了的數(shù)據(jù)或程序代碼。,2條件匯編偽指令 .if、.elseif、.else、.endif偽指令告訴匯編器按照表達(dá)式的計(jì)算結(jié)果對(duì)代碼塊進(jìn)行條件匯編。 .if expression 標(biāo)志條件塊的開始,僅當(dāng)條件為真(expression的值非0即為真)時(shí)匯編代碼。 .elseif expression 標(biāo)志若.if條件為假,而.elseif條件為真時(shí)要匯編代碼塊。 .else 標(biāo)志若.if條件為假時(shí)要匯編代碼塊。 .endif 標(biāo)志條件塊的結(jié)束,并終止該條件代碼塊。,3引用其他文件和初始化常數(shù)偽指令 .include 文件名 將指定文件復(fù)制到當(dāng)前位置,其內(nèi)容可以是程序、數(shù)據(jù)、符號(hào)定義等。 .copy 文件名 與.include類似。 .def 符號(hào)名 在當(dāng)前文件中定義一個(gè)符號(hào),可以被其他文件使用。 .ref 符號(hào)名 在其他文件中定義,可以在本文件中使用的符號(hào)。 .global 符號(hào)名 其作用相當(dāng)于.def、.ref效果之和。,.mmregs 定義存儲(chǔ)器映射寄存器的符號(hào)名,這樣就可以用AR0、PMST等助記符替換實(shí)際的存儲(chǔ)器地址。 .float 數(shù)1,數(shù)2 指定的各浮點(diǎn)數(shù)連續(xù)放置到存儲(chǔ)器中(從當(dāng)前段指針開始)。 .word 數(shù)1,數(shù)2 指定的各數(shù)(十六進(jìn)制)連續(xù)放置到存儲(chǔ)器中。 .space n 以位為單位,空出n位存儲(chǔ)空間。 .end 程序塊結(jié)束。,表5-2 常用的匯編偽指令,例 計(jì)算 y=a1x1 + a2x2 + a3x3 +a 4x4 其中: a1=1 . a2=2 .a3= 3 . a4=4 x1=8 . X2=6. x3=4 . X4=2 匯編源程序 xx . asm,.,.title “x1.asm“ .mmregs .def _c_int00 stack .usect “stack“,10h .bss a,4 .bss x,4 .bss y,1 .data table: .word 1 .word 2 .word 3 .word 4 .word 8 .word 6 .word 4 .word 2,.text _c_int00: k_iptr .set 1400h LDM PMST,A AND #7FH,A OR #k_iptr,A STLM A,PMST RSBX FRCT STM #0,SWWSR STM #stack+10h,SP STM #a,AR1 RPT #7 MVPD #table,*AR1+ CALL SUM end: B end SUM: LD #01h,DP STM #a,AR3 STM #x,AR4 RPTZ A,#3 MAC *AR3+,*AR4+,A STL A,y RET .end,4宏定義和宏調(diào)用 TMS320C54x匯編支持宏語(yǔ)言。如果程序中需要多次執(zhí)行某段程序,可以把這段程序定義(宏定義)為一個(gè)宏,然后在需要重復(fù)執(zhí)行這段程序的地方調(diào)用這條宏。 宏定義如下: Macname .macroparameter 1,parameter n .mexit .endm,5.4 鏈接器命令文件的編寫與使用,1 MEMORY偽指令及其使用,MEMORY偽指令就是用來指定目標(biāo)存儲(chǔ)器的模型。 MEMORY偽指令的一般語(yǔ)法為: MEMORY name : property ,property ,property . name : property ,property ,property . name : property ,property ,property . ,2 SECTIONS偽指令及其使用,SECTIONS偽指令功能如下: 說明如何將輸入段組合成輸出段。 在可執(zhí)行程序中定義輸出段。 指定輸出段在存儲(chǔ)器中存放的位置。 允許對(duì)輸出段重新命名。,xx.obj -o xx.out -m xx.map MEMORY PAGE 0: RAM: origin=1000h,length=800h RAM1: origin=2000h,length=300h PAGE 1: DARAM1: origin=0100h,length=100h DARAM2: origin=0200h,length=100h ,SECTIONS .data : RAM 1 PAGE 0 .text : RAM PAGE 0 stack : DARAM1 PAGE 1 .bss : DARAM2 PAGE 1 ,鏈接命令源程序 :xx . cmd,例:,5.5 匯編語(yǔ)言程序編寫方法,1 匯編語(yǔ)言源程序格式,助記符指令一般包含4個(gè)部分,其一般組成形式為: 標(biāo)號(hào): 助記符 操作數(shù) ;注釋 1標(biāo)號(hào)區(qū) 所有匯編指令和大多數(shù)匯編偽指令前面都可以帶有 標(biāo)號(hào),標(biāo)號(hào)可以長(zhǎng)達(dá)32個(gè)字符,由AZ、az、09、_、和$符號(hào)組成,且第一個(gè)字符不能是數(shù)字,區(qū)分大小寫。,2助記符區(qū) 助記符區(qū)不能從第一列開始,否則被認(rèn)為是標(biāo)號(hào)。 3操作數(shù)區(qū) 操作數(shù)區(qū)是一個(gè)操作數(shù)列表,可以是常數(shù)、符號(hào)或常數(shù)與符號(hào)構(gòu)成的表達(dá)式。操作數(shù)間需用“,”號(hào)隔開。 4注釋區(qū) 注釋區(qū)可以從任何一列開始,可以包含ASCII字符和空格。,. def start ; 主程序 ;入口標(biāo)號(hào) . data table: . word 1, 2, 3, 4 ; 初始化空間 .word 8, 6, 4, 2 ; 地址標(biāo)號(hào)table .text ; 代碼段 start: - - STM #a , AR1 RPT #7 MVPD table , *AR1+ ,例 ,2 匯編語(yǔ)言其它格式,匯編語(yǔ)言中的常數(shù)和字符串,匯編源程序中的符號(hào),匯編源程序中的表達(dá)式,略P 69 P 74,5.6 TMS320C54x C語(yǔ)言編程,5.6.1 存儲(chǔ)器模式 5.6.2 寄存器規(guī)則 5.6.3 函數(shù)調(diào)用規(guī)則 5.6.4 中斷處理 5.6.5 表達(dá)式分析,返回首頁(yè),5.6.1 存儲(chǔ)器模式,1段 C54x將存儲(chǔ)器處理為程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器兩個(gè)線性塊。程序存儲(chǔ)器包含可執(zhí)行代碼;數(shù)據(jù)存儲(chǔ)器主要包含外部變量、靜態(tài)變量和系統(tǒng)堆棧。編譯器的任務(wù)是產(chǎn)生可重定位的代碼,允許鏈接器將代碼和數(shù)據(jù)定位進(jìn)合適的存儲(chǔ)空間。C編譯器對(duì)C語(yǔ)言編譯后除了生成3個(gè)基本段,即.text、.data、.bss外,還生成.cinit、.const、.stack、.sysmem段。,2C/C+系統(tǒng)堆棧 .stack不同于DSP匯編指令定義的堆棧。DSP匯編程序中要將堆棧指針SP指向一塊RAM,用于保存中斷、調(diào)用時(shí)的返回地址,存放PUSH指令的壓棧內(nèi)容。 .stack定義的系統(tǒng)堆棧實(shí)現(xiàn)的功能是保護(hù)函數(shù)的返回地址,分配局部變量,在調(diào)用函數(shù)時(shí)用于傳遞參數(shù),保護(hù)臨時(shí)結(jié)果。 .stack定義的段大?。ǘ褩4笮。┛捎面溄悠鬟x項(xiàng)-stack size設(shè)定,鏈接器還產(chǎn)生一個(gè)全局符號(hào)_ _STACK_SIZE,并賦給它等于堆棧長(zhǎng)度的值,以字為單位,缺省值為1K。,3存儲(chǔ)器分配 (1)運(yùn)行時(shí)間支持函數(shù)。 (2)動(dòng)態(tài)存儲(chǔ)器分配。 (3)靜態(tài)和全局變量的存儲(chǔ)器分配。 (4)位域/結(jié)構(gòu)的對(duì)準(zhǔn)。,返回本節(jié),5.6.2 寄存器規(guī)則,寄存器規(guī)則明確了編譯器如何使用寄存器以及在函數(shù)調(diào)用過程中如何保護(hù)寄存器。 (1)輔助寄存器 (2)堆棧指針SP (3)ARP (4)在默認(rèn)情況下,編譯器總是假定ST1中的OVM在硬件復(fù)位時(shí)被清0。若在匯編代碼中對(duì)OVM置位為1,返回到C環(huán)境時(shí)必須復(fù)位。 (5)寄存器變量,返回本節(jié),5.6.3 函數(shù)調(diào)用規(guī)則,(1)局部幀的產(chǎn)生 (2)參數(shù)傳遞 (3)函數(shù)的返回,返回本節(jié),5.6.4 中斷處理,(1)中斷的使能和屏蔽必須由程序員自己來設(shè)置。 (2)中斷程序沒有參數(shù)傳遞,即使說明,也會(huì)被忽略 (3)中斷處理程序不能被正常的C程序調(diào)用。 (4)為了使中斷程序與中斷一致,在相應(yīng)的中斷矢量中必須放置一條轉(zhuǎn)移指令,可以用.sect匯編偽指令建立一個(gè)簡(jiǎn)單的跳轉(zhuǎn)指令表來完成此項(xiàng)功能。,(5)在匯編語(yǔ)言中,注意在符號(hào)名前面加上一個(gè)下劃線,例如c_int00記為_ c_int00。 (6)中斷程序使用的所有寄存器,包括狀態(tài)寄存器和程序中調(diào)用函數(shù)使用的寄存器都必須予以保護(hù)。 (7)TMS320C54x C編譯器將C語(yǔ)言進(jìn)行了擴(kuò)展,中斷可以利用interrupt關(guān)鍵字由C/C+函數(shù)直接處理。,返回本節(jié),5.6.5 表達(dá)式分析,當(dāng)C程序中需要計(jì)算整型表達(dá)式時(shí),必須注意以下幾點(diǎn): (1)算術(shù)上溢和下溢。 (2)整除和取模。 (3)C代碼對(duì)16位乘法結(jié)果高16位的訪問。,返回本節(jié),5.7 用C語(yǔ)言和匯編語(yǔ)言混合編程,5.7.1 獨(dú)立的C模塊和匯編模塊接口 5.7.2 從C程序中訪問匯編程序變量 5.7.3 在C程序中直接嵌入?yún)R編語(yǔ)句,返回首頁(yè),5.7.1 獨(dú)立的C模塊和匯編模塊接口,在編寫?yīng)毩⒌膮R編程序時(shí),必須注意以下幾點(diǎn): (1)不論是用C語(yǔ)言編寫的函數(shù)還是用匯編語(yǔ)言編寫的函數(shù),都必須遵循寄存器使

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論