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

下載本文檔

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

文檔簡介

1、第5章 TMS320C54x軟件開發(fā),5.1 軟件開發(fā)過程及開發(fā)工具 5.2 公共目標文件格式 5.3 常用匯編偽指令 5.4 鏈接器命令文件的編寫與使用 5.5 匯編語言程序編寫方法 5.6 TMS320C54x C語言編程 5.7 用C語言和匯編語言混合編程,5.1 軟件開發(fā)過程及開發(fā)工具,1建立源程序 2C編譯器(C Compiler) 3匯編器(Assembler) 4連接器(Linker) 5調(diào)試工具 6十六進制轉換公用程序(Hex Conversion Utility),返回首頁,圖5-1 TMS320C54x DSP軟件開發(fā)流程,表5-1 TMS320C54xV3.50版代碼生成

2、工具程序,返回本節(jié),5.2 公共目標文件格式,5.2.1 COFF文件的基本單元段 5.2.2 匯編器對段的處理 5.2.3 鏈接器對段的處理 5.2.4 重新定位 5.2.5 程序裝入 5.2.6 COFF文件中的符號,返回首頁,5.2.1 COFF文件的基本單元段,段(sections)是COFF文件中最重要的概念。一個段就是最終在存儲器映象中占據(jù)連續(xù)空間的一個數(shù)據(jù)或代碼塊。目標文件中的每一個段都是相互獨立的。一般地,COFF目標文件包含3個缺省的段:text段、data段、bss段。 段可以分為兩大類,即已初始化段和未初始化段。如圖5-2所示為目標文件中的段與目標系統(tǒng)中存儲器的關系。,圖

3、5-2 目標文件中的段與目標存儲器的關系,返回本節(jié),5.2.2 匯編器對段的處理,1未初始化段 未初始化段主要用來在存儲器中保留空間,通常將它們定位到RAM中。這些段在目標文件中沒有實際內(nèi)容,只是保留空間而已。程序可以在運行時利用這些空間建立和存儲變量。未初始化段是通過使用.bss和.usect匯編偽指令建立的,兩條偽指令的句法分別為: .bss符號,字數(shù) 符號.usect“段名”,字數(shù),2已初始化段 已初始化段包含可執(zhí)行代碼或已初始化數(shù)據(jù)。這些段的內(nèi)容存儲在目標文件中,加載程序時再放到TMS320C54X存儲器中。三個用于建立初始化段的偽指令句法分別為: .text段起點 .data段起點

4、.sect“段名”,段起點,3命名段 命名段就是程序員自己定義的段,它與缺省的.text、.data和.bss段一樣使用,但與缺省段分開匯編。 data段不同的存儲器中,將未初始化的變量匯編到與bss段不同的存儲器中。產(chǎn)生命名段的偽指令為: 符號.usect“段名”,字數(shù) .sect“段名”,段起點,4子段 子段(Subsections)是大段中的小段。鏈接器可以像處理段一樣處理子段。采用子段可以使存儲器圖更加緊密。子段的命名句法為: 基段名:子段名 子段也有兩種,用.sect命令建立的是已初始化段,用.usect命令建立的是未初始化段。,5段程序計數(shù)器(SPC) 匯編器為每個段安排一個獨立的

5、程序計數(shù)器,即段程序計數(shù)器(SPC)。SPC表示一個程序代碼段或數(shù)據(jù)段內(nèi)的當前地址。開始時,匯編器將每個SPC置0,當匯編器將程序代碼或數(shù)據(jù)加到一個段內(nèi)時,相應的SPC增加。如果匯編器再次遇到相同段名的段,繼續(xù)匯編至相應的段,且相應的SPC在先前的基礎上繼續(xù)增加。,圖5-3 例5-1產(chǎn)生的目標代碼,返回本節(jié),5.2.3 鏈接器對段的處理,鏈接器對段的處理有兩個功能。首先,它將匯編器產(chǎn)生的COFF目標文件(.obj文件)中的各種段作為輸入段,當有多個文件進行鏈接時,它將輸入段組合起來,在可執(zhí)行的COFF輸出模塊中建立各個輸出段。其次,鏈接器為輸出段選擇存儲器地址。,鏈接器有兩個命令完成上述功能,

6、即: MEMORY 命令定義目標系統(tǒng)的存儲器配置圖,包括對存儲器各部分的命名,以及規(guī)定它們的起始地址和長度。 SECTIONS命令告訴鏈接器如何將輸入段組合成輸出段,以及在存儲器何處存放輸出段。子段可以用來更精確地編排段,可用鏈接器SECTIONS命令指定子段。,圖5-4 鏈接器默認的存儲器分配,返回本節(jié),5.2.4 重新定位,1鏈接時重新定位 將各個段定位到存儲器中,每個段都從合適的地址開始。 將符號值調(diào)整到相對于新的段地址的數(shù)值。 調(diào)整對重新定位后符號的引用。,2運行時重新定位 將代碼裝入存儲器的一個地方,而運行在另一個地方。利用SECTIONS命令選項讓鏈接器定位兩次。一些關鍵的執(zhí)行代碼

7、必須裝入在系統(tǒng)的ROM中,但希望在較快的RAM中運行。 鏈接器提供了一個簡單的處理該問題的方法。利用SECTIONS命令選項讓鏈接器定位兩次。第一次使用裝入關鍵字設置裝入地址,再用運行關鍵字設置運行地址。,返回本節(jié),5.2.5 程序裝入,(1)硬件仿真器和CCS集成開發(fā)環(huán)境,具有內(nèi)部的裝入器,調(diào)用裝入器的LOAD命令即可裝入可執(zhí)行程序。 (2)將代碼固化在片外存儲器中,采用Hex轉換工具(Hex conversion utility),例如Hex500將可執(zhí)行的COFF目標模塊(.out文件)轉換成幾種其他目標格式文件,然后將轉換后的文件用編程器將代碼寫入EPROM/Flash。,返回本節(jié),5

8、.2.6 COFF文件中的符號,COFF文件中有一個符號表,用于存儲程序中的符號信息。鏈接器對符號重定位時使用該表,調(diào)試工具也使用該表來提供符號調(diào)試。 外部符號指在一個模塊中定義,在另一個模塊中使用的符號??墒褂?def、.ref或.global匯編偽指令將符號定義為外部符號。.def在當前模塊中定義,可以在別的模塊中使用的符號;.ref在當前模塊中引用,但在別的模塊中定義的符號;.global可用于以上任何一種情況。,返回本節(jié),5.3 常用匯編偽指令,返回首頁,表5-2 常用的匯編偽指令,1段定義偽指令 為便于鏈接器將程序、數(shù)據(jù)分段定位于指定的(物理存在的)存儲器空間,并將不同的obj文件鏈

9、接起來。段的使用非常靈活,但常用以下約定: .text 此段存放程序代碼。 .data 此段存放初始化了的數(shù)據(jù)。 .bss 此段存入未初始化的變量。 .sect 名稱 定義一個有名段,放初始化了的數(shù)據(jù)或程序代碼。,2條件匯編偽指令 .if、.elseif、.else、.endif偽指令告訴匯編器按照表達式的計算結果對代碼塊進行條件匯編。 .if expression 標志條件塊的開始,僅當條件為真(expression的值非0即為真)時匯編代碼。 .elseif expression 標志若.if條件為假,而.elseif條件為真時要匯編代碼塊。 .else 標志若.if條件為假時要匯編代碼塊

10、。 .endif 標志條件塊的結束,并終止該條件代碼塊。,3引用其他文件和初始化常數(shù)偽指令 .include 文件名 將指定文件復制到當前位置,其內(nèi)容可以是程序、數(shù)據(jù)、符號定義等。 .copy 文件名 與.include類似。 .def 符號名 在當前文件中定義一個符號,可以被其他文件使用。 .ref 符號名 在其他文件中定義,可以在本文件中使用的符號。 .global 符號名 其作用相當于.def、.ref效果之和。,.mmregs 定義存儲器映射寄存器的符號名,這樣就可以用AR0、PMST等助記符替換實際的存儲器地址。 .float 數(shù)1,數(shù)2 指定的各浮點數(shù)連續(xù)放置到存儲器中(從當前段指

11、針開始)。 .word 數(shù)1,數(shù)2 指定的各數(shù)(十六進制)連續(xù)放置到存儲器中。 .space n 以位為單位,空出n位存儲空間。 .end 程序塊結束。,4宏定義和宏調(diào)用 TMS320C54x匯編支持宏語言。如果程序中需要多次執(zhí)行某段程序,可以把這段程序定義(宏定義)為一個宏,然后在需要重復執(zhí)行這段程序的地方調(diào)用這條宏。 宏定義如下: Macname .macroparameter 1,parameter n .mexit .endm,返回本節(jié),5.4 鏈接器命令文件的編寫與使用,5.4.1 MEMORY偽指令及其使用 5.4.2 SECTIONS偽指令及其使用,返回首頁,5.4.1 MEMO

12、RY偽指令及其使用,MEMORY偽指令就是用來指定目標存儲器的模型。MEMORY偽指令的一般語法為: SECTIONS name : property ,property ,property . name : property ,property ,property . name : property ,property ,property . ,返回本節(jié),5.4.2 SECTIONS偽指令及其使用,SECTIONS偽指令功能如下: 說明如何將輸入段組合成輸出段。 在可執(zhí)行程序中定義輸出段。 指定輸出段在存儲器中存放的位置。 允許對輸出段重新命名。,圖5-5 例5-6中段的定位,返回本節(jié),5.

13、5 匯編語言程序編寫方法,5.5.1 匯編語言源程序格式 5.5.2 匯編語言中的常數(shù)和字符串 5.5.3 匯編源程序中的符號 5.5.4 匯編源程序中的表達式,返回首頁,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ù)與符號構成的表達式。操作數(shù)間需用“,”

14、號隔開。 4注釋區(qū) 注釋區(qū)可以從任何一列開始,可以包含ASCII字符和空格。,返回本節(jié),5.5.2 匯編語言中的常數(shù)和字符串,表5-3 COFF常數(shù)與字符串,返回本節(jié),5.5.3 匯編源程序中的符號,1標號 2局部標號 3符號常數(shù) 4先定義的符號常數(shù) 5替代符號,表5-4 可以用在表達式中的運算符,表5-5 帶有絕對符號、可重定位符號的表達式,返回本節(jié),5.5.4 匯編源程序中的表達式,表達式可以是常數(shù)、符號或由算術運算符結合的常數(shù)和符號。表達式值的有效范圍為-3276832767。 1運算符(表5-4 所示) 2合格的表達式(表5-5所示 ),返回本節(jié),5.6 TMS320C54x C語言編

15、程,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匯編程序中

16、要將堆棧指針SP指向一塊RAM,用于保存中斷、調(diào)用時的返回地址,存放PUSH指令的壓棧內(nèi)容。 .stack定義的系統(tǒng)堆棧實現(xiàn)的功能是保護函數(shù)的返回地址,分配局部變量,在調(diào)用函數(shù)時用于傳遞參數(shù),保護臨時結果。 .stack定義的段大?。ǘ褩4笮。┛捎面溄悠鬟x項-stack size設定,鏈接器還產(chǎn)生一個全局符號_ _STACK_SIZE,并賦給它等于堆棧長度的值,以字為單位,缺省值為1K。,3存儲器分配 (1)運行時間支持函數(shù)。 (2)動態(tài)存儲器分配。 (3)靜態(tài)和全局變量的存儲器分配。 (4)位域/結構的對準。,返回本節(jié),5.6.2 寄存器規(guī)則,寄存器規(guī)則明確了編譯器如何使用寄存器以及在函數(shù)調(diào)

17、用過程中如何保護寄存器。 (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)為了使中斷程序與中斷一致,在相應的中斷矢量中必須放置一條轉移指令,可以用.sect匯編偽指令建立一個簡單的

18、跳轉指令表來完成此項功能。,(5)在匯編語言中,注意在符號名前面加上一個下劃線,例如c_int00記為_ c_int00。 (6)中斷程序使用的所有寄存器,包括狀態(tài)寄存器和程序中調(diào)用函數(shù)使用的寄存器都必須予以保護。 (7)TMS320C54x C編譯器將C語言進行了擴展,中斷可以利用interrupt關鍵字由C/C+函數(shù)直接處理。,返回本節(jié),5.6.5 表達式分析,當C程序中需要計算整型表達式時,必須注意以下幾點: (1)算術上溢和下溢。 (2)整除和取模。 (3)C代碼對16位乘法結果高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ù),都必須遵循寄存器使用規(guī)則。 (2)必須保護函數(shù)要用到的幾個特定寄存器。 (3)中斷程序必須保護所有用到的寄存器。 (4)從匯編程序調(diào)用C函數(shù)時,第一個參數(shù)(最左邊)必須放入累加器A中,剩下的參數(shù)按自右向左的順序壓入堆棧。,(5)調(diào)用C函數(shù)時,注意C函數(shù)只保護了幾個特定的寄存器

溫馨提示

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

評論

0/150

提交評論