




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第四章DSP軟件開發(fā)第四章DSP軟件開發(fā)1軟件開發(fā)過程一個DSP軟件可以使用匯編或C語言編寫源程序,通過編譯、連接工具產生DSP的執(zhí)行代碼。在調試階段,可以利用軟仿真(Simalator)在計算機上運行;也可以利用硬件調試工具(xps510)將代碼下載到DSP中,并通過計算機監(jiān)控、調試該程序。當調試完成后,可以將程序代碼固化到EPROM中,以便DSP目標系統(tǒng)脫離計算機單獨運行。軟件開發(fā)過程一個DSP軟件可以使用匯編或C語言編寫源程序,通2DSP第4章程序開發(fā)課件3代碼生成工具:1.C編譯器(CCompiler):將C源程序代碼編譯成為C54x匯編語言源代碼程序。
在編譯軟件包中包括一個外殼程序(Shellprogram)、一個優(yōu)化器(Optimizer)和一個內部列表公用程序(Interlistutility)。其中,外殼程序能自動編譯、匯編、連接源模塊。優(yōu)化器能改進代碼來提高C程序的效率。內部列表公用程序能將C源程序同匯編語言輸出相結合。代碼生成工具:42.匯編器(Assembler):將匯編語言源文件轉變?yōu)榛诠媚繕宋募袷?COFF)的機器語言目標文件。源文件中包括指令、匯編命令以及宏命令。匯編器的輸入文件為匯編語言源文件,其默認的文件擴展名為.asm。由匯編器所建立的目標文件的默認擴展名為.obj。由匯編器建立的列表文件的默認擴展名為.lst。
2.匯編器(Assembler):將匯編語言源53.連接器(Linker):將匯編生成的、可重新定位的COFF目標模塊組合成一個可執(zhí)行的COFF目標模塊。
連接器的輸入是可重新定位的COFF目標文件和目標庫文件。當連接器生成可執(zhí)行模塊時,它要調整對符號的引用,并解決外部引用的問題。它也可以接受來自文檔管理器中的目標文件,以及連接以前運行時所生成的輸出模塊。3.連接器(Linker):將匯編生成的、可重新定位的COF64.文檔管理器(Archiver):將一組文件(包括源文件或目標文件)集中歸入一個文檔文件庫。
利用文檔管理器,可以方便地替換、添加、刪除和提取文件來調整庫,其最有用的應用之一是建立目標文件庫,C編譯器自帶有目標文件庫。匯編時,可以搜索宏文件庫,并通過源文件中的宏命令來調用。例如:將若干宏歸入一個宏庫,匯編器搜索這個庫,并調用源文件中使用的宏。
4.文檔管理器(Archiver):將一組文件(包75.助記符到代數式指令翻譯器(Mnemonic-to-algbraictranslatorutility):將包含助記符指令的匯編語言源文件轉換成包含代數指令的匯編語言源文件。
6.運行支持庫公用程序(Runtime-suportutility):建立用戶的C語言運行支持庫。標準運行支持庫在rts.src里提供源代碼,在rts.lib里提供目標代碼。包含ANSI標準運行支持函數、編譯器公用程序函數、浮點算術函數和被C54x編譯器支持的C輸入/輸出函數。5.助記符到代數式指令翻譯器(Mnemonic-to-alg87.建庫實用程序(Library-buildutility):用來建立用戶自己的、C語言編寫的支持運行的庫函數。鏈接時,用rts.src中的源文件代碼和rts.lib中的目標代碼提供標準的支持運行的庫函數。8.十六進制轉換程序(Hexconversionutlity):可以很方便地將COFF目標文件轉換成TI、Intel、Motorola或Tektronix公司的目標文件格式。轉換后生成的文件可以下載到EPROM編程器,以便對用戶的EPROM進行編程。7.建庫實用程序(Library-buildut99.絕對制表程序(Absolutelister):將鏈接后的目標文件作為輸入,生成.abs輸出文件。對.abs文件匯編產生包含絕對地址而不是相對地址的清單。如果沒有絕對制表程序,所生成清單可能是冗長的,并要求進行許多人工操作。10.交叉引用制表程序(Cross-referencelister):利用目標文件生成一個交叉引用清單,列出所鏈接的源文件中的符號以及它們的定義和引用情況。
9.絕對制表程序(Absoluteliste1011.C54x調試器:接收可執(zhí)行的COFF文件作為輸入,但大多可擦除存儲器卻不支持COFF文件。
11.C54x調試器:接收可執(zhí)行的COFF文件作為輸入,但大11匯編語言程序的編寫方法
要點以.asm為擴展名每一行由4個部分組成格式
[標號][:]空格[助記符]空格[操作數]空格[;注釋]
[]中的內容為可選擇部分
供本程序的其它部分或其它程序調用。標號是任選項,標號后面可以加也可以不加冒號“:”。
匯編語言程序的編寫方法要點以.asm為擴展名格式[標號]12在編寫匯編語句時,應遵循以下規(guī)則:
語句的開頭只能是標號、空格、星號或分號。標號是可選項;如果使用,必須從第一列開始。每個域必須由一個或多個空格來分開。制表符等同于空格。注釋是可選項。開始于第一列的注釋用星號或分號(*或;)來標明,開始于其它列的注釋必須由分號開頭。在編寫匯編語句時,應遵循以下規(guī)則:13要點建議
[標號][:]空格[助記符]空格[操作數]空格[;注釋]
可以是助記符指令、匯編指令、宏指令和宏調用命令。1.助記符指令,一般用大寫;2.匯編命令和宏命令,以句號“.”
開始,且為通常用小寫。
要點建議[標號][:]空格[助記符]空格[操作數]14要點[標號][:]空格[助記符]空格[操作數]空格[;注釋]
1.指令中的操作數或匯編命令中定義的內容
2.操作數之間必須用逗號“,”分開。
1.從分號“;”開始
2.可以放在指令或匯編命令后面,也可以放在單獨的一行或數行。要點要點[標號][:]空格[助記符]空格[操作數]空格15
匯編語言程序中的數據型式有下列幾種:二進制:如1110001b或1111001B;八進制:226q或572Q;十進制:1234或+1234或-1234(缺省型)十六進制:0A40h或0A40H或0xA40浮點數:1.623e-23(僅C語言程序中能用,匯編程序不能用)字符:‘D’字符串:“thisisastring”匯編語言程序中的數據型式有下列幾種:16
匯編器和鏈接器建立的目標文件,是一個可以TMS320C54x器件上執(zhí)行的文件。這些目標文件的格式稱之為公共目標文件格式,即COFF(CommonObjectFileFormat)。COFF會使模塊編程和管理變得更加方便,因為當編寫一個匯編語言程序時,它可以按照代碼和數據段來考慮問題。匯編器和鏈接器都有一些命令建立并管理各種各樣的段。公共目標文件格式COFF匯編器和鏈接器建立的目標文件,是一個可以T17建立公共目標文件格式的目標文件匯編器和鏈接器功能的異同相同點不同點匯編器建立的是相對地址COFF文件,即.obj文件鏈接器建立的是絕對地址COFF文件,即.out文件匯編器根據匯編命令用適當的段將各部分程序代碼和數據連在一起,構成目標文件;鏈接器的一個任務就是分配存儲單元,即把各個段重新定位到目標存儲器中。建立公共目標文件格式的目標文件匯編器相同點不同點匯編器建立的18不同種類的區(qū)別COFF文件種類C54x匯編器和C編譯器建立的是COFF2文件。C54x能夠讀/寫所有形式的COFF文件,缺省值下鏈接器生成的是COFF2文件,用鏈接器-vn選項可以選擇不同形式的COFF文件。COFF0COFF1COFF2
標題格式不相同數據部分是相同不同種類的區(qū)別COFF文件種類C54x匯編器和C編譯器建立19匯編指令匯編指令(偽指令)是用來為程序提供數據和控制匯編進程的。C54x匯編器共有64條匯編命令。將代碼和數據匯編到特定的段中。為未初始化的變量保留存儲器空間。控制展開列表的形式。存儲器初始化。匯編條件塊。定義全局變量。匯編指令匯編指令(偽指令)是用來為程序提供數據和控制匯編進程20(1)段定義指令
.bass
在.bass段中為未初始化的變量保留存儲器空間
.date
確認.bass段中的代碼段。.bass段中通常包含了初始化的數據。.sect
定義初始化的帶命名的段,并將緊接著的代碼或數據并入該段。.text
該段中包含了可執(zhí)行的代碼.usect
在一個未初始化的有命名的段中保留空間(1)段定義指令21(2)常數初始化指令
.bes和
.space
在當前段保留確定數目的位。
當在.space段使用了標號時,它指向保留位的第一個字;當在.bes段使用了標號時,它指向保留位的最后一個字。.byte
把一個8位值放入當前段的連續(xù)字中。.filed
把一個數放入當前字的特定數目的位中。
(2)常數初始化指令22.float和
.xloat
計算以IEEE格式表示的單精度(32位)浮點數,并存放在當前段的連續(xù)字中,高位字先存。.int和
.word
把一個或多個16位數存放在當前段的連續(xù)字中。.long和
.xlong
把32位數存放在當前段的連續(xù)的兩個字中,高位字先存。.string和
.pstring
把8位的字符從一個或多個字符串中傳到當前段中。.float和.xloat計算以IEEE格式表示的單精23(3)段程序計數器定位指令
.align
使SPC對準1-word到128-word的邊界。保證了緊接著該指令的代碼從一個整字或頁邊界開始。
操作數:1讓SPC對準字邊界2讓SPC對準長字/偶地址邊界128讓SPC對準頁邊界不帶操作數時,確省值為128。(3)段程序計數器定位指令24(4)輸出列表格式指令
.drlist/
.drnolist.fclist/
.fcnolist.length.width.list/
.nolist.mlist/
.mnolist.option.page.title.sslist/
.ssnolist(4)輸出列表格式指令25(5)引用其他文件的指令
.copy/
.include告訴匯編器器開始從其他文件中讀源語言。.def確認一個在當前模塊中定義的且被其他模塊使用的符號。.global聲明一個外部符號,使其他模塊在連接的時候可以使用它。.mlib向匯編器提供一個包含宏定義的文檔庫的名稱。.ref確認一個在當前段中使用但在其它段中定義的符號。(5)引用其他文件的指令26(6)條件匯編指令
.if/
.elseif/.else/
.endif告訴匯編器根據表達式的值條件匯編一塊代碼。.loop/
.break/.endloop告訴匯編器按照表達式的值循環(huán)匯編一塊代碼。.loopexpression標注一塊循環(huán)代碼的開始。.breakexpression告訴匯編器當表達式為假時,繼續(xù)循環(huán)匯編;當表達式為真時,立即轉到.endloop后面懂得代碼去。(6)條件匯編指令27(7)匯編時的符號指令使有意義的符號名與常數值或字符串相等同。
.asg規(guī)定一個字符串與一個替代符號相等,并將其存放在替代符號表中。.eval計算一個表達式的值并把結果傳送到與一個替代符號等同的字符串中。.label定義一個專門的符號以表示當前段內裝入時的地址而不是運行時的地址。.set/
.equ
把一個常數值等效成一個符號,存放在符號表中且不能被清除。(7)匯編時的符號指令28(8)其他方面的匯編指令
.algebraic.end.mmregs.newblock.sblock.version
(8)其他方面的匯編指令29DSP第4章程序開發(fā)課件30匯編程序的編輯與匯編和鏈接
匯編語言源程序編好后,必須經過匯編和鏈接才能運行。匯編程序的編輯與匯編和鏈接匯編語言源程序編好31匯編語言程序的匯編匯編語言源程序要素匯編命令助記符指令宏命令匯編程序(匯編器)功能將源程序匯編成可重定位的目標文件(.obj文件);如果需要,可以生成一個列表文件(.lst文件);將程序代碼分段,每段的目標代碼都有一個SPC管理;定義和引用全局符號,可在列表后附加交叉引用表;對條件程序塊進行匯編;支持宏功能,允許定義宏命令。匯編語言程序的匯編匯編語言源程序要素匯編命令匯編程序(32段(sections)的概念
特點定義分段的優(yōu)點:在目標文件中將放置程序、數據、變量的代碼分開,便于在鏈接時作為一個單獨的部分分配存儲器。由于大多數系統(tǒng)都有好幾種形式的存儲器,通過對各個段重新定位,可以使目標存儲器得到更為有效的利用。
段是在存儲器圖中占據相鄰空間的代碼或數據塊。一個目標文件中的每一個段都是分開的和不相同的。目標文件中的段與目標存儲器之間的關系段(sections)的概念特點定義分段的優(yōu)點:在目標文33所謂段,就是在存儲器圖中占據相鄰空間的代碼或數據塊。一個目標文件中的每一個段都是分開的和不相同的。所有的COFF目標文件都包含以下3種形式的段:.text段(此段通常包含可執(zhí)行代碼).data段(此段通常包含初始化數據).bss段(此段通常為未初始化變量保留存儲空間)
所謂段,就是在存儲器圖中占據相鄰空間的代碼或數據塊。一個目標34此外,匯編器和鏈接器可以建立、命名和鏈接自定義段。這種自定義段是程序員自己定義的段,使用起來與.data、.text以及.bss段類似。它的好處是在目標文件中與.data、.text以及.bss分開匯編,鏈接時作為一個單獨的部分分配到存儲器。此外,匯編器和鏈接器可以建立、命名和鏈接自定義段。這種自定義35段有兩類:(1)未初始化段:.bss和.usect命令建立未初始化段。
未初始化段就是C54x存儲器中的保留空間,通常將它們定位到RAM區(qū)。在目標文件中,這些段中沒有確切的內容;在程序運行時,可以利用這些存儲空間存放變量。這兩條命令的句法為:
.bss符號,字數
符號.usect“段名”,字數段有兩類:36其中:符號:對應于保留的存儲空間第一個字的變量名稱。這個符號可以讓其它段引用,也可以用.global命令定義為全局符號。字數:表示在.bss段或標有名字的段中保留多少個存儲單元。段名:程序員為自定義未初始化段起的名字。
其中:符號:對應于保留的存儲空間第一個字的變量名稱。這個符號37(2)已初始化段:
.text、.data的.sect命令建立已初始化段。
已初始化段中包含有可執(zhí)行代碼或初始化數據。這些段中的內容都在目標文件中,當加載程序時再放到C54x的存儲器中。每一個已初始化段是可以重新定位的,并且可以引用其它段中所定義的符號。鏈接器在連接時會自動地處理段間的相互引用。(2)已初始化段:38這3條初始化命令的句法為:.text[段起點].data[段起點].sect“段名”[,段起點]其中,段起點是任選項,如果選用,它就是為段程序計數器(SPC)定義的一個起始值。SPC值只能定義一次,而且必須在第一次遇到這個段時定義。如果缺省,則SPC從0開始。這3條初始化命令的句法為:39段的構成要經過一個反復過程。例如,當匯編器第一次遇到.data命令時,這個.data段是空的。接著將緊跟其后的語句匯編到.data段,直到匯編器遇到一條.text或.sect命令。如果匯編器再遇到一個.data段,它就將緊跟這條命令的語句匯編后加到已經存在的.data中。這樣,就建立了單一的.data段,段內數據都是連續(xù)地安排到存儲器中的。段的構成要經過一個反復過程。40⑶子段:
子段是大段中的小段。鏈接器可以像處理段一樣處理子段。采用子段結構,可以使存儲器圖更加緊密。子段命名的句法為:基段名:子段名對于子段,可以單獨為其分配存儲單元,或者在相同的基段名下與其它段組合在一起。例如,若要在.text段內建立一個稱之為_func的子段,可以用如下的命令:.sect“.text:_func”
⑶子段:41⑷段程序計數器(SPC):
匯編器為每個段都安排了一個單獨的程序計數器,即段程序計數器(SPC)。SPC表示一個程序代碼段或數據段內的當前地址。一開始,匯編器將每個SPC置0。當匯編器將程序代碼或數據加到一個段內時,相應的SPC就增加。如果再繼續(xù)對某個段匯編,則相應的SPC就在先前的數值上繼續(xù)增加。鏈接器在鏈接時要對每個段進行重新定位。⑷段程序計數器(SPC):421.運行匯編程序
axm500[inputfile[objectfile[listingfile]]][-options]匯編器是名為asm500.exe的可執(zhí)行程序
例如axm500cjy.asm-l-s-x源程序cjy.asm經匯編后將生成一個cjy.obj目標文件、列表文件、符號表(在目標文件中)以及交叉引用表(在列表文件中)。1.運行匯編程序axm500[inputfile[o432.列表文件TMS320C54xCOFFAssemblerVersion3.70TueOct1912:42:592004Copyright(c)1996-2001TexasInstrumentsIncorporatedexample.asmPAGE11*********************************2*example.asmy=a1*x1+a2*x2+a3*x3+a4*x4*3*********************************5.mmregs;定義存儲器映象寄存器6000000STACK.usect"STACK",10h;分配10個單元的堆??臻g7000000.bssa,4;為系數a分配4個單元的空間8000004.bssx,4;為變量x分配4個單元的空間9000008.bssy,1;為結果y分配1個單元的空間10.global_c_int00;定義標號
列表文件中包括源程序語句和目標代碼
2.列表文件TMS320C54xCOFFAssembl4411000000.data;定義數據代碼段120000000001table:.word1,2,3,4;在標號table開始的8個單元中000001000200000200030000030004130000040008.word8,6,4,2;為這8個單元賦初值00000500060000060004000007000214000000.text;定義文本代碼段150000007728_c_int00STM#0,SWWSR;軟件等待狀態(tài)寄存器置0,不設等待0000010000160000027718STM#STACK+10h,SP;設置堆棧指針初值0000030010-170000047711STM#a,AR1;AR1指向a的地址0000050000-18000006EC07RPT#7;從程序存儲器向數據存儲器190000077C91MVPDtable,*AR1+;重復傳送8個數據0000080000"
源文件的每一行都會在列表文件中生成一行。包括行號、段程序計數器SPC的數值、匯編后的目標代碼、源程序語句。一條指令可以生成1或2個字的目標代碼。
第2字單獨列一行,列出了SPC的數值和目標代碼。
110000004520000009F074CALLSUM;調用SUM實現乘法累加和的子程序00000a000D'2100000bF073end:Bend;循環(huán)等待00000c000B'2200000d7713SUM:STM#a,AR3;將系數a的地址賦給AR3000007714STM#x,AR4;將變量x的地址賦給AR30000100004-24000011F071RPTZA,#3;將A清0,并重復執(zhí)行下條指令4次000012000325000013B09AMAC*AR3+,*AR4+,A;執(zhí)行乘法并累加,結果放在A中260000148008-STLA,@y;將A的低字內容送結果單元y27000015FC00RET;結束子程序28.end;結束全部程序NoAssemblyErrors,NoAssemblyWarningsField
1源程序語句的行號,用十進制數表示
Field2段程序計數器(SPC),用十六進制數表示
Field4:源程序語句
Field3目標代碼!未定義的外部引用。’.text段重新定位?!?data段重新定位。+.sect段重新定位。-.bss和.usect段重新定位。20000009F07446下例列出的是一個匯編語言程序經匯編后的.lst文件(部分)。.lst文件由4個部分組成,即:第一部分:源程序的行號;第二部分:段程序計數器;第三部分:目標代碼;第四部分:源程序。下例列出的是一個匯編語言程序經匯編后的.lst文件(部分)。47一條指令可以生成1或2個字的目標代碼。匯編器為第2字單獨列一行,列出了SPC的數值和目標代碼。目標代碼后面的一些記號,表示在連接時需要重新定位。如:
!未定義的外部引用。’.text段重新定位?!?data段重新定位。+.sect段重新定位。-.bss和.usect段重新定位。一條指令可以生成1或2個字的目標代碼。匯編器為第2字單獨列一482**************************3**Reservespacein.bssforavariable**4**************************50000.data600000011coeff.word011h,022h,033h00010022000200332*************497**************************8**Reservespacein.bssforavariable**9**************************100000.bssbuffer,1011**************************12**stillin.data**13**************************1400030123ptr.word0123h15**************************16**Assemblecodeintothe.textsection**17**************************7******50180000.text190000100fadd:ld0Fh,A200001f010aloop:SUB#1,A00020001210003f842BCaloop,AGEQ00040001’22**************************23**Anotherinitializedtableinto.data**24**************************180000.tex51250004.data26000400aaivals.word0AAh,0BBh,0CCh000500bb000600cc27**************************28**Defineanothersectionformorevariables**29**************************300000var2.usect“newvars”,1310001inbuf.usect“newvars”,732**************************33**Assemblemorecodeinto.text**34**************************25000452350005.text360005110ampy:LD0Ah,B370006f166mloop:MPY#0Ah,B0007000a380008f868BCmloop,BNOV00090006’39**************************40**Defineanamedsectionforint.vectors**41**************************420000.sect“vectors”4300000011.word011h,033h350005534400010033↓↓↓↓field1field2field3field4在此例中,一共建立了5個段:.text段內有10個字的程序代碼。.data段內有7個字的數據。vectors是一個用.sect建立的自定義段,段內有2個字的已初始化數據。.bss在存儲器中為變量保留10個存儲單元。newvars是一個用.usect命令建立的自定義段,它在存儲器中為變量保留8個存儲單元。本例的目標代碼如圖4-4所示。440001003354DSP第4章程序開發(fā)課件55目標文件的鏈接
鏈接器主要功能根據鏈接命令或鏈接命令文件(.cmd文件),將一個或多個COFF目標文件鏈接起來,生成存儲器映象文件(.map)和可執(zhí)行的輸出文件(.out)(COFF目標模塊)
目標文件的鏈接鏈接器根據鏈接命令或鏈接命令文件(.cmd文56
.cmd文件中除了指出輸入文件和輸出文件外,還說明系統(tǒng)中有哪些可用的存儲器,程序段、數據段、堆棧以及復位向量和中斷向量等安排在什么地方。鏈接后生成的.map文件中給出了存儲器的配置情況、程序文本段、數據段、堆棧段、向量段、在存儲器中的定位表,以及全局符號在存儲器中的位置。鏈接后生成的.out文件是一個可執(zhí)行文件。.cmd文件中除了指出輸入文件和輸出文件外571.運行鏈接程序
(1)鍵入命令lnk500
(2)鍵入命令lnk500file1.objfile2.obj–o(3)鍵入命令lnk500linker.cmd鏈接器是名為lnk500.exe的可執(zhí)行程序應包含如下內容:file1.objfile2.obj-olind.out2.鏈接器選項
建立一個名為a.out(默認情況)的可重新定位的輸出模塊。
1.運行鏈接程序(1)鍵入命令lnk500鏈接器是名583.鏈接器對段的處理
(1)把一個或多個COFF目標文件中的各種段作為鏈接器的輸入段,經鏈接后在一個可執(zhí)行的COFF輸出模塊中建立各個輸出段。(2)為各個輸出段選定存儲器地址。鏈接器在對段進行處理時,主要完成匯編器在需要引用重新定位的符號處都留了一個重定位入口。鏈接器對符號重定位時,利用這些入口修正對符號的引用值。
3.鏈接器對段的處理(1)把一個或多個COFF目標文件中的594.鏈接器命令文件
(1)將有多個選項的命令,寫成一個鏈接器命令文件.cmd。
(2)運行鏈接器命令文件.cmd,生成一個映象文件.map和一個可執(zhí)行的輸出文件.out
(3)進行存儲器分配主要功能
使用方法
lnk500鏈接器命令文件名.cmd
4.鏈接器命令文件(1)將有多個選項的命令,寫成一個鏈接器605.兩條鏈接器命令的使用方法MEMORY命令用來定義目標系統(tǒng)中所包含的各種形式的存儲器的存儲器配置圖,包括對存儲器各部分命名,以及規(guī)定它們的起始地址和長度。定義系統(tǒng)(1)MEMORY命令
功能5.兩條鏈接器命令的使用方法MEMORY命令用來定義目標系統(tǒng)61EMEORY{PAGE0:name1[(attr)]:origin=constant,length=constant┆PAGEn:namen[(attr)]:origin=constant,length=constant}MEMORY命令的一般句法對一個存儲空間加以標記,每一個PAGE代表一個完全獨立的地址空間。頁號n最多可規(guī)定為255,取決于目標存儲器的配置。通常PAGE0定為程序存儲器,PAGE1定為數據存儲器。如果沒有規(guī)定PAGE,則鏈接器就目標存儲器配置在PAGE0。EMEORYMEMORY命令的一般句法對一個存儲空間加以標記62EMEORY{PAGE0:name1[(attr)]:origin=constant,length=constant┆PAGEn:namen[(attr)]:origin=constant,length=constant}MEMORY命令的一般句法名字可以包含8個字符,A~Z、a~z、$、.、_均可。名字并沒有特殊的含義,用來標記存儲器的區(qū)間而已;名字都是內部記號,不需要保留在輸出文件或者符號表中。不同PAGE上的存儲器區(qū)間可以取相同的名字,但在同一PAGE內的名字不能相同,且不許重疊配置。EMEORYMEMORY命令的一般句法名字可以包含8個字符,63EMEORY{PAGE0:name1[(attr)]:origin=constant,length=constant┆PAGEn:namen[(attr)]:origin=constant,length=constant}MEMORY命令的一般句法任選項,為命名區(qū)規(guī)定1~4個屬性。如果有選項,應寫在括號內。當輸出段定位到存儲器時,可利用屬性加以限制。規(guī)定一個存儲區(qū)的起始地址。鍵入origin、org或o都可以。這個值是一個16位二進制常數,可以用十進制數、八進制數或十六進制數表示。
規(guī)定一個存儲區(qū)的長度,鍵入length、len或l都可以。
EMEORYMEMORY命令的一般句法任選項,為命名區(qū)規(guī)定164
例MEMORY命令的使用方法。/*ExamplecommandfilewithMEMORYdirective*/file1.objfile2.obj/*Inputfiles*/-oprog.out/*Options*/MEMORY{PAGE0:ROM:origin=c00h,length=1000hPAGE1:SCRTCH:origin=60h,length=20hONCHIP:origin=80h,length=200h}名為ROM的程序存儲器:4K字ROM,起始地址C00h。
名為SCRATCH的數據存儲器:32字RAM,起始地址60h。名為ONCHIP的數據存儲器:512字RAM,起始地址為80h。例MEMORY命令的使用方法。名為ROM的程序存儲器:65告訴鏈接器如何將輸入段合成輸出段在可執(zhí)行程序中定義輸出段規(guī)定輸出段在存儲器中的存放位置允許重新命名輸出項。(2)SECTIONS命令
功能在鏈接器命令文件中,SECTIONS命令用大寫字母,緊隨其后并用大括號括起來的是關于輸出段的詳細說明。每一個輸出段的說明都從段名開始。段名后面是一行說明段的內容和如何給段分配存儲單元的性能參數。
注意告訴鏈接器如何將輸入段合成輸出段(2)SECTIONS命令66SECTIONS{name:[property,property,property,…]name:[property,property,property,…]name:[property,property,property,…]}SECTIONS命令的一般句法
性能參數SECTIONSSECTIONS命令的一般句法性能參數67在鏈接器命令文件中,SECTIONS命令用大寫字母,緊隨其后并用大括號括起來的是關于輸出段的詳細說明。每一個輸出段的說明都從段名開始。段名后面是一行說明段的內容和如何給段分配存儲單元的性能參數。在鏈接器命令文件中,SECTIONS命令用大寫字母,緊隨其后68一個段可能的性能參數有:(1)loadallocation:用來定義將輸出段加載到存儲器中的什么位置。(2)Runallocation用來定義輸出段在存儲器的什么位置上開始運行。(3)Inputsections:用來定義由哪些輸入段組成輸出段。(4)Sectiontype:用它為輸出段定義特殊形式的標記。一個段可能的性能參數有:69MEMORY和SECTIONS命令的缺省算法:
如果沒有利用MEMORY和SECTIONS命令,鏈接器就按缺省算法來定位輸出段:MEMORY{PAGE0:PROG:origin=0x0080,length=0xFF00PAGE1:DATA:origin=0x0080,length=0xFF80}MEMORY和SECTIONS命令的缺省算法:70SECTIONS{.text:PAGE=0.data:PAGE=0.cinit:PAGE=0.bss:PAGE=1}SECTIONS71在缺省MEMORY和SECTIONS命令情況下,鏈接器將所有的.text輸入段,鏈接成一個.text輸出段,它是可執(zhí)行的輸出文件;所有的.data輸入段組合成.data輸出段。又將.text和.data段定位到配置為PAGE0上的存儲器,即程序存儲空間。所有的.bss輸入段則組合成一個.bss輸出段,并由鏈接器定位到配置為PAGE1上的存儲器,即數據存儲空間。
如果輸入文件中包含有自定義已初始化段(如上面的.cinit段),則鏈接器將它們定位到程序存儲器,緊隨.data段之后;如果輸入文件中包括有自定義未初始段,則鏈接器將它們定位到數據存儲器,并緊隨.bss之后。在缺省MEMORY和SECTIONS命令情況下,鏈接器將所有72匯編器處理每個段都是從地址0開始,而所有需要重新定位的符號(標號)在段內都是相對于地址0的。事實上,所有段都不可能從存儲器中地址0單元開始,因此鏈接器通過以下方法對各個段進行重新定位,即:⑴將各個段定位到存儲器圖中,這樣一來每個段都從一個恰當的地址開始。⑵將符號的數值調整到相對于新的段地址的數值。⑶調整對重新定位后符號的引用。
匯編器處理每個段都是從地址0開始,而73例:鏈接器命令文件舉例。a.objb.obj/*被連接的文件*/-oprog.out/*選項,生成一個可執(zhí)行輸出文件*/-mprog.map/*選項,生成一個映象文件*/MEMORY/*定義目標存儲器配置*/{PAGE0:ROM:origin=1000h,length=0100hPAGE1:RAM:origin=0100h,length=0100h}例:鏈接器命令文件舉例。74SECTIONS/*規(guī)定各個段放在存儲器什么位置*/{.text:>ROM.data:>ROM.bss:>RAM}SECTIONS/*規(guī)定各個段放在存儲75鏈接器命令文件都是ASCII碼文件,由上例可見,它主要包含如下內容:第一:輸入文件名,就是要鏈接的目標文件和文檔庫文件,或者是其它的命令文件。(如果要調用另一個命令文件作為輸入文件,此句一定要放在本命令文件的最后,因為鏈接器不能從新調用的命令文件返回。)第二:鏈接器選項。這些選項既可以用在鏈接器命令行,也可以編在命令文件中。第三:MEMORY和SECTIONS都是鏈接器命令。鏈接器命令文件都是ASCII碼文件,由上例可見,它主要包含如76例:編寫計算y=a1*x1+a2*x2+a3*x3+a4*x4的匯編源程序*****************************example.asmy=a1*x1+a2*x2+a3*x3+a4*x4*****************************.title“example.asm”;說明程序名稱.mmregs;定義寄存器STACK.usect“STACK”,10h;開辟堆??臻gDSP第4章程序開發(fā)課件77.bssa,4;為a預留4個字空間.bssx,4.bssy,1.defstart;確認符號.data;確認data段table:.word1,2,3,4;data段有8個數據.word8,6,4,2.text;確認程序段start:STM#0,SWWSR;軟件等待狀態(tài)寄存器置0STM#STACK+10h,SP;SP指向棧底STM#a,AR1;AR1指向a.bssa,478RPT#7;后一語句循環(huán)8次MVPDtable,*AR1+;從程序空間到數據空間CALLSUM;調用子程序end:Bend;無條件結束SUM:STM#a,AR3;AR3指向aSTM#x,AR4;AR4指向xRPTZA,#3;累加器清0,;然后后一語句循環(huán)4次MAC*AR3+,*AR4+,A;乘積放累加器STLA,@y;結果放入yRET.endRPT#779鏈接器命令文件example.cmd列于下例中。該命令文件指出只對example.obj文件進行鏈接。鏈接后生成example.out文件和example.map文件。另外,還說明了可用的程序存儲器(PAGE0)和數據存儲器(PAGE1),以及匯編語言程序中各個段(.text,.data,.bss,以及STACK)在存儲器中的配置情況。鏈接器命令文件example.cmd列于下例中。80例:example.cmd文件。example.obj;/*被連接的文件*/-oexample.out;/*生成一個可執(zhí)行輸出文件*/-mexample.map;/*生成一個映象文件*/-estart;/*程序開始時的地址*/MEMORY;/*規(guī)定各個段放在存儲器什么位置*/{PAGE0:EPROM:org=0E000h,len=100hPAGE1:SPRAM:org=0060h,len=0020hDARAM:org=0080h,len=100h}例:example.cmd文件。81SECTIONS{.text:>EPROMPAGE0.data:>EPROMPAGE0.bss:>SPRAMPAGE1STACK:>DARAMPAGE1}
鏈接后生成的.map文件中給出了存儲器的配置情況、程序文本段、數據段、堆棧段、向量段、在存儲器中的定位表,以及全局符號在存儲器中的位置。SECTIONS82鏈接后生成的example.map文件。**************************TMS320C54COFFLinkerVersion1.10**************************FriMay2809:48:59:1999OUTPUTFILENAME:<example.out>ENTRYPOINTSYMBOL:“start”address:0000e000MEMORYCONFIGURATION
Name
origin
length
attributesfillPAGE0:EPROM0000e000000000100RWIXPAGE1:SPRAM00000060000000020RWIXDARAM00000080000000100RWIX鏈接后生成的example.map文件。83SECTIONALLOCATIONMAPoutpoutattributes/section
page
origin
length
inputsections.text00000e000000000160000e00000000016example.obj(.text).data00000e016000000080000e01600000008example.obj(.data).bss10000006000000009UNINITIALIZED0000006000000009example.obj(.bss)STACK10000008000000010UNINITIALIZED0000008000000010example.obj(STACK).xref00000000000000076COPYSECTION0000000000000076example.obj(.xref)SECTIONALLOCATIONMAP84GLOBALSYMBOLSaddress
name
address
name00000060.bss00000060.bss0000e016.data00000069end0000e000.text0000e000start0000e01eedata0000e000.text00000069end0000e016etext0000e016etext0000e016.data0000e000start0000e01eedata[7symbols]鏈接后生成的.out文件是一個可執(zhí)行文件。GLOBALSYMBOLS85DSP的C語言開發(fā)與ANSIC規(guī)范完全正確兼容;具有ANSI標準運行支持庫;程序可轉化為ROM,可重定位、重入;提供與匯編語言的接口,允許對時間敏感的關鍵程序用匯編語言編寫;靈活而全面的鏈接器可以對內存重定位、內存設置、部分鏈接進行全面的控制,而且還可以對代碼進行運行時的重定位;
DSP的C語言開發(fā)與ANSIC規(guī)范完86提供了一個外殼程序(shell),允許進一步將C語言轉化為可執(zhí)行文件;快速的開發(fā)速度;可以對庫進行管理,包括對庫進行文件的增加、刪除或替換,還可以將目標文件庫用作鏈接器的輸入;提供豐富的列表文件,如源碼和匯編的交叉列表、預處理輸出文件等。提供了一個外殼程序(shell),允許進一步將C語言轉化為可87C編譯器提供了一個優(yōu)化編譯器。采用優(yōu)化編譯可以生成高效率的匯編代碼,從而提高程序的運行速度,減少目標代碼的長度。在一定程度一可以認為,C編譯器的效率主要取決于C編譯器所能進行優(yōu)化的范圍和數量。C編譯器的優(yōu)化方法可以分為兩類,即通用優(yōu)化和特定優(yōu)化。
C編譯器提供了一個優(yōu)化編譯器。采用優(yōu)化編88通用優(yōu)化主要包括:簡化表達式;優(yōu)化數據流;刪除公共子表達式和冗余分配;優(yōu)化跳轉;簡化控制流;優(yōu)化與循環(huán)有關的變量;將循環(huán)體內計算值不變的表達式移至循環(huán)體前;運行支持庫函數的行內擴展。特定優(yōu)化主要包括:有效地使用寄存器;自動增量寄存器尋址方式;使用塊重復;使用并行指令;使用延時跳轉;安排局部變量的位置;使用寄存器避免沖突。通用優(yōu)化主要包括:簡化表達式;優(yōu)化數89C語言和匯編語言的混合編程雖然C編譯器的優(yōu)化功能可以使C代碼的效率大大增加,但某些情況下,還是無法與手工編寫的匯編代碼的效率相比,如FFT程序。因為即使是最佳的C編譯器也無法在所有的情況下都能夠最佳合理地利用DSP芯片所提供的各種資源,如位倒序和循環(huán)尋址等。此外,C語言實現DSP芯片的某些硬件控制也不如匯編程序方便,有些甚至無法用C語言實現。因此,在很多情況下,DSP應用程序往往需要用C語言和匯編語言的混合編程方法來實現,以達到最佳地利用DSP芯片軟硬件資源的目的。C語言和匯編語言的混合編程雖然C編譯器的優(yōu)化功能可以使C代碼90用C語言和匯編語言的匯合編程方法主要有以下三種:第一:獨立編寫C程序和匯編程序,分開編譯或匯編形成各自的目標代碼模塊,然后用鏈接器將C模塊和匯編模塊鏈接起來。例如,FFT程序一般用匯編語言編寫,對FFT程序用匯編器進行匯編形成目標代碼模塊,與C模塊鏈接就可以在C程序中調用FFT程序。第二:直接在C語言程序的相應位置嵌入匯編語句。第三:對C程序進行編譯生成相應的匯編程序,然后對匯編程序進行手工優(yōu)化和修改。用C語言和匯編語言的匯合編程方法主要有以下三種:91在C程序中嵌入匯編語句:在C程序中嵌入匯編語句是一種直接的C和匯編接口方法。采用這種方法一方面可以在C程序中實現C語言無法實現的一些硬件控制功能,如修改中斷控制寄存器、中斷使能或無效、讀取狀態(tài)寄存器和中斷標志寄存器等。另一方面,也可以用這種方法在C程序中的關鍵部分用匯編語句代替C語句以優(yōu)化這個程序。在C程序中嵌入匯編語句:92嵌入匯編語句的方法是在匯編語句的左右加上一個雙引號,用小括弧將匯編語句括住,在括弧前加上asm標識符即可,如下所示:asm(“匯編語句”);除了硬件控制之外,匯編語句也可以嵌入在C程序中實現的其它功能。雖然TI建議不要采用這種方法改變C變量的數值,因為這容易改變C環(huán)境。但是如果程序員對C編譯器及C環(huán)境具有充分的理解,并且小心使用,用這種方法也是可以對C變量進行自由地操作。嵌入匯編語句的方法是在匯編語句的左右加上一個雙引號,用小括弧93例:在C程序中嵌入匯編語句(TMS320C2x)floatadd_sub(float,float[]);main(){inti,k;floata,b[3],result;a=1;for(i=0;i<3;i++)b[i]=i+1;result=add_sub(a,b[]);}例:在C程序中嵌入匯編語句(TMS320C2x)94addsub(inta,floatb[]){inti;floatsum;/*sum=a;*/asm(“LDF*-FP(2),R0”);/*R0=a*/asm(“LDI*-FP(3),AR0”);/*AR0=&b[]*//*for(i=0;i<3;i++)sum=sum+b[i];*/asm(“RPTS2”);asm(“ADDF*AR0++,R0,R0”);/*R0=a+b[0]+b[1]+b[2]*/asm(“STFAR0,*+FP(2)”);/*sum=R0*/return(sum);}addsub(inta,floatb[])95DSP的其它高級語言編程:在DSP的高級語言編程中,除了ANSIC語言之外,通過一定的步驟,C++,VisualC/C++,甚至MATLAB中的大部分程序都可以通過轉化為C語言而直接在DSP中運行。這可以大大縮短DSP產品開發(fā)的周期。不過這一些過程都還沒有成熟的產品,還需要進一步理順它們之間的關系,對MATLAB和C++,VisualC/C++內核要有比較深入的了解。DSP的其它高級語言編程:96第四章DSP軟件開發(fā)第四章DSP軟件開發(fā)97軟件開發(fā)過程一個DSP軟件可以使用匯編或C語言編寫源程序,通過編譯、連接工具產生DSP的執(zhí)行代碼。在調試階段,可以利用軟仿真(Simalator)在計算機上運行;也可以利用硬件調試工具(xps510)將代碼下載到DSP中,并通過計算機監(jiān)控、調試該程序。當調試完成后,可以將程序代碼固化到EPROM中,以便DSP目標系統(tǒng)脫離計算機單獨運行。軟件開發(fā)過程一個DSP軟件可以使用匯編或C語言編寫源程序,通98DSP第4章程序開發(fā)課件99代碼生成工具:1.C編譯器(CCompiler):將C源程序代碼編譯成為C54x匯編語言源代碼程序。
在編譯軟件包中包括一個外殼程序(Shellprogram)、一個優(yōu)化器(Optimizer)和一個內部列表公用程序(Interlistutility)。其中,外殼程序能自動編譯、匯編、連接源模塊。優(yōu)化器能改進代碼來提高C程序的效率。內部列表公用程序能將C源程序同匯編語言輸出相結合。代碼生成工具:1002.匯編器(Assembler):將匯編語言源文件轉變?yōu)榛诠媚繕宋募袷?COFF)的機器語言目標文件。源文件中包括指令、匯編命令以及宏命令。匯編器的輸入文件為匯編語言源文件,其默認的文件擴展名為.asm。由匯編器所建立的目標文件的默認擴展名為.obj。由匯編器建立的列表文件的默認擴展名為.lst。
2.匯編器(Assembler):將匯編語言源1013.連接器(Linker):將匯編生成的、可重新定位的COFF目
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國負壓反沖式二次濾網行業(yè)投資前景及策略咨詢研究報告
- 店鋪經營股份合同范本
- 開店咖啡采購合同范本
- 項目暗股協議合同范本
- 錢大媽社區(qū)生鮮電商供應鏈風險評價與控制研究
- 高中語文知識性讀物大單元教學研究
- 皋蘭縣農村信用合作聯社信貸風險管理優(yōu)化研究
- 2025年中秋國慶期間公共設施維護檢查情況的報告范文
- 一年級科學主題教學方案
- 2024年吉安市吉水縣自然資源局招聘考試真題
- 車間主任考核表實用文檔
- 提高領導干部的溝通能力
- 《航空公司服務質量改善研究8800字(論文)》
- GB/T 9124-2010鋼制管法蘭技術條件
- GB/T 4117-2008工業(yè)用二氯甲烷
- FZ/T 07019-2021針織印染面料單位產品能源消耗限額
- 人教PEP版英語五年級下冊第四單元全部課件
- 硬筆書法 社團教案
- 中國膿毒癥及膿毒性休克急診治療指南
- 工序標準工時及產能計算表
- 人教版體育與健康四年級-《障礙跑》教學設計
評論
0/150
提交評論