DSP原理及開發(fā)應(yīng)用課件8_第1頁
DSP原理及開發(fā)應(yīng)用課件8_第2頁
DSP原理及開發(fā)應(yīng)用課件8_第3頁
DSP原理及開發(fā)應(yīng)用課件8_第4頁
DSP原理及開發(fā)應(yīng)用課件8_第5頁
已閱讀5頁,還剩63頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 DSP原理及開發(fā)應(yīng)用 9/8/20221第5章 TMS320C54x軟件開發(fā)5.1 軟件開發(fā)過程及開發(fā)工具5.2 公共目標文件格式5.3 常用匯編偽指令5.4 鏈接器命令文件的編寫與使用5.5 匯編語言程序編寫方法5.6 TMS320C54x C語言編程5.7 用C語言和匯編語言混合編程9/8/202225.1 軟件開發(fā)過程及開發(fā)工具1建立源程序2C編譯器(C Compiler)3匯編器(Assembler)4連接器(Linker)5調(diào)試工具6十六進制轉(zhuǎn)換公用程序(Hex Conversion Utility) 返回首頁9/8/20223圖5-1 TMS320C54x DSP軟件開發(fā)流程9/

2、8/20224表5-1 TMS320C54xV3.50版代碼生成工具程序返回本節(jié)9/8/20225C編譯器 C54x的C編譯器完全支持標準C,C源程序經(jīng)過C compiler編譯生成C54x的匯編源代碼,匯編源代碼經(jīng)Assembler生成一個COFF目標文件,Linker鏈接所有的目標文件,生成可執(zhí)行的目標文件。 9/8/202269/8/202279/8/202285.2 公共目標文件格式5.2.1 COFF文件的基本單元段5.2.2 匯編器對段的處理5.2.3 鏈接器對段的處理5.2.4 重新定位5.2.5 程序裝入5.2.6 COFF文件中的符號 返回首頁9/8/202295.2.1 C

3、OFF文件的基本單元段段(sections)是COFF文件中最重要的概念。一個段就是最終在存儲器映象中占據(jù)連續(xù)空間的一個數(shù)據(jù)或代碼塊。目標文件中的每一個段都是相互獨立的。一般地,COFF目標文件包含3個缺省的段:text段、data段、bss段。段可以分為兩大類,即已初始化段和未初始化段。如圖5-2所示為目標文件中的段與目標系統(tǒng)中存儲器的關(guān)系。9/8/202210圖5-2 目標文件中的段與目標存儲器的關(guān)系返回本節(jié)9/8/2022115.2.2 匯編器對段的處理1未初始化段未初始化段主要用來在存儲器中保留空間,通常將它們定位到RAM中。這些段在目標文件中沒有實際內(nèi)容,只是保留空間而已。程序可以在

4、運行時利用這些空間建立和存儲變量。未初始化段是通過使用.bss和.usect匯編偽指令建立的,兩條偽指令的句法分別為:.bss符號,字數(shù) 符號.usect“段名”,字數(shù)9/8/2022122已初始化段已初始化段包含可執(zhí)行代碼或已初始化數(shù)據(jù)。這些段的內(nèi)容存儲在目標文件中,加載程序時再放到TMS320C54X存儲器中。三個用于建立初始化段的偽指令句法分別為: .text段起點 .data段起點 .sect“段名”,段起點9/8/2022133命名段命名段就是程序員自己定義的段,它與缺省的.text、.data和.bss段一樣使用,但與缺省段分開匯編。 data段不同的存儲器中,將未初始化的變量匯編

5、到與bss段不同的存儲器中。產(chǎn)生命名段的偽指令為: 符號.usect“段名”,字數(shù) .sect“段名”,段起點9/8/2022144子段子段(Subsections)是大段中的小段。鏈接器可以像處理段一樣處理子段。采用子段可以使存儲器圖更加緊密。子段的命名句法為: 基段名:子段名子段也有兩種,用.sect命令建立的是已初始化段,用.usect命令建立的是未初始化段。9/8/2022155段程序計數(shù)器(SPC)匯編器為每個段安排一個獨立的程序計數(shù)器,即段程序計數(shù)器(SPC)。SPC表示一個程序代碼段或數(shù)據(jù)段內(nèi)的當(dāng)前地址。開始時,匯編器將每個SPC置0,當(dāng)匯編器將程序代碼或數(shù)據(jù)加到一個段內(nèi)時,相應(yīng)

6、的SPC增加。如果匯編器再次遇到相同段名的段,繼續(xù)匯編至相應(yīng)的段,且相應(yīng)的SPC在先前的基礎(chǔ)上繼續(xù)增加。9/8/202216圖5-3 例5-1產(chǎn)生的目標代碼返回本節(jié)9/8/2022175.2.3 鏈接器對段的處理鏈接器對段的處理有兩個功能。首先,它將匯編器產(chǎn)生的COFF目標文件(.obj文件)中的各種段作為輸入段,當(dāng)有多個文件進行鏈接時,它將輸入段組合起來,在可執(zhí)行的COFF輸出模塊中建立各個輸出段。其次,鏈接器為輸出段選擇存儲器地址。9/8/202218鏈接器有兩個命令完成上述功能,即:MEMORY 命令定義目標系統(tǒng)的存儲器配置圖,包括對存儲器各部分的命名,以及規(guī)定它們的起始地址和長度。SE

7、CTIONS命令告訴鏈接器如何將輸入段組合成輸出段,以及在存儲器何處存放輸出段。子段可以用來更精確地編排段,可用鏈接器SECTIONS命令指定子段。 9/8/202219圖5-4 鏈接器默認的存儲器分配返回本節(jié)9/8/2022205.2.4 重新定位1鏈接時重新定位將各個段定位到存儲器中,每個段都從合適的地址開始。將符號值調(diào)整到相對于新的段地址的數(shù)值。調(diào)整對重新定位后符號的引用。9/8/2022212運行時重新定位將代碼裝入存儲器的一個地方,而運行在另一個地方。利用SECTIONS命令選項讓鏈接器定位兩次。一些關(guān)鍵的執(zhí)行代碼必須裝入在系統(tǒng)的ROM中,但希望在較快的RAM中運行。鏈接器提供了一個

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

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

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

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

12、放置到存儲器中(從當(dāng)前段指針開始)。.word 數(shù)1,數(shù)2 指定的各數(shù)(十六進制)連續(xù)放置到存儲器中。.space n 以位為單位,空出n位存儲空間。.end 程序塊結(jié)束。9/8/2022304宏定義和宏調(diào)用TMS320C54x匯編支持宏語言。如果程序中需要多次執(zhí)行某段程序,可以把這段程序定義(宏定義)為一個宏,然后在需要重復(fù)執(zhí)行這段程序的地方調(diào)用這條宏。宏定義如下:Macname .macroparameter 1,parameter n .mexit .endm 返回本節(jié)9/8/2022315.4 鏈接器命令文件的編寫與使用鏈接命令文件通過段定位控制命令,分配程序代碼、數(shù)據(jù)運行存儲空間。鏈

13、接命令文件有兩個重要的指令:MEMORY和SECTIONS。 返回首頁9/8/2022325.4.1 MEMORY偽指令及其使用MEMORY偽指令就是用來指定目標存儲器的模型。MEMORY指出目標系統(tǒng)中物理上存在的存儲空間的范圍,即可供程序使用的存儲空間范圍。在默認狀態(tài)下,PAGE0代表程序空間,PAGE1代表數(shù)據(jù)空間。 返回本節(jié)9/8/202233MEMORY偽指令的一般語法為: SECTIONS name : property ,property ,property . name : property ,property ,property . name : property ,prope

14、rty ,property . 9/8/2022345.4.2 SECTIONS偽指令及其使用SECTIONS偽指令功能如下: 說明如何將輸入段組合成輸出段。在可執(zhí)行程序中定義輸出段。指定輸出段在存儲器中存放的位置。允許對輸出段重新命名。9/8/202235圖5-5 例5-6中段的定位返回本節(jié)9/8/2022365.5 匯編語言程序編寫方法5.5.1 匯編語言源程序格式5.5.2 匯編語言中的常數(shù)和字符串5.5.3 匯編源程序中的符號5.5.4 匯編源程序中的表達式 返回首頁9/8/202237MEMORYPAGE 0: EPROG: origin = 0 x1400, len = 0 x2c

15、00 ;第0頁程序空間開始地址0 x1400,空間長度0 x2c00 VECT: origin = 0 x0080, len = 0 x80 ;第0頁中斷向量開始地址0 x0080,空間長度0 x80PAGE 1: REGS: origin = 0 x60, len = 0 x1c ;第1頁寄存器空間開始地址0 x60,空間長度0 x1c IDATA: origin = 0 x80, len = 0 x1380 ;第1頁數(shù)據(jù)空間開始地址0 x80,空間長度0 x1380 EDATA: origin = 0 x1400,len = 0 x8000 ;第1頁擴展數(shù)據(jù)空間開始地址0 x1400,空間

16、長度0 x8000 EDATA1: origin = 0 x9400,len = 0 x4c00 ;第1頁擴展數(shù)據(jù)空間開始地址0 x9400,空間長度0 x4c009/8/202238SECTIONS .vectors: VECT PAGE 0 ;中斷向量在第0頁(PAGE 0) .text: EPROG PAGE 0 ;程序代碼在第0頁(PAGE 0) .cinit: EPROG PAGE 0 ;初始化變量在第0頁(PAGE 0) .pinit: EPROG PAGE 0 ;初始化參數(shù)在第0頁(PAGE 0) .bss: IDATA PAGE 1 ;非初始化變量在第1頁(PAGE1) .fa

17、r: IDATA PAGE 1 ;長調(diào)函數(shù)在第1頁(PAGE1) .const: IDATA PAGE1 ;常數(shù)在第1頁(PAGE1) .switch: IDATA PAGE 1 ;數(shù)據(jù)交換空間在第1頁(PAGE1) .sysmem: IDATA PAGE 1 ; .cio: IDATA PAGE 1 ;c語言輸入/輸出調(diào)用在第1頁(PAGE1) .stack: IDATA PAGE 1 ;堆棧在第1頁(PAGE1) .csldata: IDATA PAGE 1 ;c語言宏調(diào)用在第1頁(PAGE1)9/8/2022395.5 匯編語言程序編寫方法5.5.1 匯編語言源程序格式5.5.2 匯編語

18、言中的常數(shù)和字符串5.5.3 匯編源程序中的符號5.5.4 匯編源程序中的表達式 9/8/2022405.5.1 匯編語言源程序格式助記符指令一般包含4個部分,其一般組成形式為:標號: 助記符 操作數(shù) ;注釋1標號區(qū)所有匯編指令和大多數(shù)匯編偽指令前面都可以帶有標號,標號可以長達32個字符,由AZ、az、09、_、和$符號組成,且第一個字符不能是數(shù)字,區(qū)分大小寫。 9/8/2022412助記符區(qū)助記符區(qū)不能從第一列開始,否則被認為是標號。3操作數(shù)區(qū)操作數(shù)區(qū)是一個操作數(shù)列表,可以是常數(shù)、符號或常數(shù)與符號構(gòu)成的表達式。操作數(shù)間需用“,”號隔開。4注釋區(qū)注釋區(qū)可以從任何一列開始,可以包含ASCII字符

19、和空格。 返回本節(jié)9/8/2022425.5.2 匯編語言中的常數(shù)和字符串表5-3 COFF常數(shù)與字符串返回本節(jié)9/8/2022435.5.3 匯編源程序中的符號1標號2局部標號3符號常數(shù)4先定義的符號常數(shù)5替代符號9/8/202244表5-4 可以用在表達式中的運算符9/8/202245表5-5 帶有絕對符號、可重定位符號的表達式返回本節(jié)9/8/2022465.5.4 匯編源程序中的表達式表達式可以是常數(shù)、符號或由算術(shù)運算符結(jié)合的常數(shù)和符號。表達式值的有效范圍為-3276832767。1運算符(表5-4 所示)2合格的表達式(表5-5所示 )返回本節(jié)9/8/2022475.6 TMS320C

20、54x C語言編程5.6.1 存儲器模式5.6.2 寄存器規(guī)則5.6.3 函數(shù)調(diào)用規(guī)則5.6.4 中斷處理5.6.5 表達式分析 返回首頁9/8/2022485.6.1 存儲器模式1段C54x將存儲器處理為程序存儲器和數(shù)據(jù)存儲器兩個線性塊。程序存儲器包含可執(zhí)行代碼;數(shù)據(jù)存儲器主要包含外部變量、靜態(tài)變量和系統(tǒng)堆棧。編譯器的任務(wù)是產(chǎn)生可重定位的代碼,允許鏈接器將代碼和數(shù)據(jù)定位進合適的存儲空間。C編譯器對C語言編譯后除了生成3個基本段,即.text、.data、.bss外,還生成.cinit、.const、.stack、.sysmem段。9/8/2022492C/C+系統(tǒng)堆棧.stack不同于DSP

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

22、2 寄存器規(guī)則寄存器規(guī)則明確了編譯器如何使用寄存器以及在函數(shù)調(diào)用過程中如何保護寄存器。(1)輔助寄存器 (2)堆棧指針SP (3)ARP (4)在默認情況下,編譯器總是假定ST1中的OVM在硬件復(fù)位時被清0。若在匯編代碼中對OVM置位為1,返回到C環(huán)境時必須復(fù)位。(5)寄存器變量 返回本節(jié)9/8/2022525.6.3 函數(shù)調(diào)用規(guī)則(1)局部幀的產(chǎn)生 (2)參數(shù)傳遞 (3)函數(shù)的返回 返回本節(jié)9/8/2022535.6.4 中斷處理(1)中斷的使能和屏蔽必須由程序員自己來設(shè)置。 (2)中斷程序沒有參數(shù)傳遞,即使說明,也會被忽略(3)中斷處理程序不能被正常的C程序調(diào)用。(4)為了使中斷程序與中斷

23、一致,在相應(yīng)的中斷矢量中必須放置一條轉(zhuǎn)移指令,可以用.sect匯編偽指令建立一個簡單的跳轉(zhuǎn)指令表來完成此項功能。9/8/202254(5)在匯編語言中,注意在符號名前面加上一個下劃線,例如c_int00記為_ c_int00。(6)中斷程序使用的所有寄存器,包括狀態(tài)寄存器和程序中調(diào)用函數(shù)使用的寄存器都必須予以保護。(7)TMS320C54x C編譯器將C語言進行了擴展,中斷可以利用interrupt關(guān)鍵字由C/C+函數(shù)直接處理。返回本節(jié)9/8/2022555.6.5 表達式分析當(dāng)C程序中需要計算整型表達式時,必須注意以下幾點:(1)算術(shù)上溢和下溢。 (2)整除和取模。 (3)C代碼對16位乘法

24、結(jié)果高16位的訪問。 返回本節(jié)9/8/202256關(guān)鍵詞 (1)constconst關(guān)鍵詞定義常量,用于限定變量或數(shù)組數(shù)值不變。如果一個變量或數(shù)組定義為const,這個變量或數(shù)組的存儲空間將分配到const段。利用const關(guān)鍵詞,可以將大常數(shù)表分配到系統(tǒng)ROM中。例如:const int digits = 0,1,2,3,4,5,6,7,8,9;定義整型數(shù)組int digits 為一個常數(shù)表。9/8/202257關(guān)鍵詞(2)ioportioport關(guān)鍵詞定義I/O端口,用于訪問C54x的I/O空間,其格式如下:ioport type porthex_num其中:ioport是關(guān)鍵詞,指出這是

25、一個I/O端口變量。 type只能是char、short、int或unsigned這幾種數(shù)據(jù)類型。 porthex_num是端口變量,hex_num是一個16進制數(shù),表示I/O空間的地址。9/8/202258(3)interruptinterrupt關(guān)鍵詞定義中斷服務(wù)函數(shù),用于指定一個函數(shù)為中斷服務(wù)函數(shù)。中斷服務(wù)函數(shù)要求特殊的寄存器保護和返回順序。當(dāng)用interrupt關(guān)鍵字指定一個函數(shù)后,編譯器會按照中斷服務(wù)函數(shù)的特殊要求處理寄存器保護和返回順序。 9/8/202259(4)near和farnear和far關(guān)鍵詞定義函數(shù)調(diào)用方式,用于指定一個函數(shù)如何被調(diào)用。 near關(guān)鍵詞指定一個函數(shù),編譯

26、器會用CALL指令來調(diào)用該函數(shù)。 far關(guān)鍵詞指定一個函數(shù),編譯器會用FCALL指令來調(diào)用該函數(shù)。9/8/202260芯片支持庫(CSL) C54x系列CSL(Chip Support Library)是一組C語言可調(diào)用的函數(shù)、宏和符號,用于配置和控制DSP的片上外設(shè)。CSL具有如下的優(yōu)點: 為各種片上外設(shè)編程提供一套標準協(xié)議。 通過open和close函數(shù),進行基本的資源管理。 用符號對片上外設(shè)的寄存器和寄存器位進行描述,可讀性強。便于代碼在不同型號DSP之間移植。 便于代碼在不同型號DSP之間移植。 9/8/202261CSL由一組模塊組成,每個模塊對應(yīng)一個片上外設(shè),所有模塊都封裝在一個.lib文件里(C5402對應(yīng)csl5402.lib,Device Support Symbol為CHIP_5402)。CSL的每個模塊對應(yīng)一個.h文件,在程序文件中將.h文件包含,就可以調(diào)用對應(yīng)模塊的API函數(shù)了。 9/8/202262 用C語言和匯編語言混合編程在進行一些大計算量編程的時候,C代碼的效率往往不如匯編代碼的效率,但是完全用匯編語言編程幾乎是不可能的。比較合適的方法是在對代碼效率要求不高的地方用C語言編程,在對代碼效率要求嚴格的地方用匯編語言編程。一般來講,是在C語言的架構(gòu)下嵌套匯編算法程序。有四種方法實現(xiàn)

溫馨提示

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

最新文檔

評論

0/150

提交評論