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

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論