




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第15章DSP的C語(yǔ)言編程115.1DSPC語(yǔ)言簡(jiǎn)介軟件開(kāi)發(fā)平臺(tái)為CCS。CCS提供了優(yōu)化的C編譯器,優(yōu)化編譯結(jié)果達(dá)手工編寫的90%以上。廠商和相關(guān)公司也在不斷對(duì)C優(yōu)化編譯器進(jìn)行改進(jìn). 相信C語(yǔ)言程序優(yōu)化編譯的效果會(huì)有進(jìn)一步改善。2C編譯器支持ANSIC語(yǔ)言標(biāo)準(zhǔn)。(ANSI--AmericanNationalStandardsInstitute,美國(guó)國(guó)家標(biāo)準(zhǔn)委員會(huì))ANSIC
標(biāo)準(zhǔn)具有一些受目標(biāo)處理器、運(yùn)行期環(huán)境或主機(jī)環(huán)境影響的C語(yǔ)言特性,這些特性在各種標(biāo)準(zhǔn)的C編譯器之間可能有不同。315.2DSP
C語(yǔ)言特性15.2.1TMS320C2000C語(yǔ)言的特征(1)標(biāo)識(shí)符和常數(shù)所有標(biāo)識(shí)符的前100個(gè)字符有意義,區(qū)分大小寫。字符集為ASCII碼,不存在多字節(jié)字符。具有多個(gè)字符的字符常數(shù)按序列中最后一個(gè)字符來(lái)編碼,例如: ‘a(chǎn)bc’==‘c’(2)數(shù)據(jù)轉(zhuǎn)換4浮點(diǎn)到整數(shù)的轉(zhuǎn)換,取整數(shù)部分。 指針和整數(shù)可以自由轉(zhuǎn)換。(3)表達(dá)式 當(dāng)兩個(gè)有符號(hào)整數(shù)相除時(shí),若其中一個(gè)為負(fù),則其商為負(fù),余數(shù)的符號(hào)與分子的符號(hào)相同。斜杠(/)用來(lái)求商,例如: 10/-3=-3, -10/3=-3,百分號(hào)(%)用來(lái)求余數(shù),例如:
10%-3=1, -10%3=-1
5(4)聲明 寄存器變量對(duì)所有char,short,int和指針類型有效。
關(guān)鍵字interrupt僅可用于無(wú)參量的void函數(shù)。(5)預(yù)處理預(yù)處理器忽略任何不支持的#pragma偽指令。預(yù)處理器支持的偽指令包括:CODE_SECTOINDATA_SECTIONFUNC_EXT_CALLED615.2.2TMS320C2000C語(yǔ)言的數(shù)據(jù)類型
注:在TMS320C2x/C2xx/C5xC語(yǔ)言中,字節(jié)長(zhǎng)度為16位,sizeof操作符返回的對(duì)象長(zhǎng)度是以16位為字節(jié)長(zhǎng)度的字節(jié)數(shù)。例如sizeof(int)=1。715.2.3TMS320C2000C語(yǔ)言的關(guān)鍵字const(常數(shù))ioport(I/O端口)interrupt(中斷)near(近)far(遠(yuǎn))volatile(可變的)815.2.4寄存器變量一個(gè)函數(shù)中最多可使用兩個(gè)寄存器變量。寄存器變量聲明必須在變量列表或函數(shù)的起始處進(jìn)行,在嵌套塊中聲明的寄存器變量被處理為一般的變量。編譯器使用AR6和AR7作為寄存器變量:AR6被賦給第一個(gè)寄存器變量AR7被賦給第二個(gè)寄存器變量寄存器變量的地址會(huì)被放入分配的寄存器中,這樣變量的訪問(wèn)速度會(huì)更快。916位類型變量(char、short、int和指針)都可被定義為寄存器變量。但在運(yùn)行時(shí),設(shè)置一個(gè)寄存器變量大約需要4條指令,為了更有效地使用這個(gè)功能,僅當(dāng)變量被訪問(wèn)超過(guò)2次時(shí),才使用寄存器變量。程序優(yōu)化編譯器也會(huì)定義寄存器變量,但方式不同。編譯器會(huì)自己決定哪些變量作為寄存器變量,程序中聲明的寄存器變量會(huì)全部被忽略。
寄存器變量聲明的格式為:
registertypereg;1015.2.5偽指令pragma偽指令pragma通知編譯器的預(yù)處理器如何處理函數(shù)。TMS320C2000C編譯器支持下列pragma:CODE_SECTIONDATA_SECTIONFUNC_EXT_CALLED
1.CODE_SECTION該偽指令在名稱為sectionname的命名段中為symbol分配空間。語(yǔ)法為:
11#pragmaCODE_SECTION(symbol,“sectionname”);2.DATA_SECTION 為名稱為sectionname的命名段中為symbol分配空間。語(yǔ)法為:
#pragmaDATA_SECTION(symbol,“sectionname”);3.FUNC_EXT_CALLED 當(dāng)使用-pm選項(xiàng)時(shí),編譯器將使用程序級(jí)的優(yōu)化。編譯器將刪除所有未被main函數(shù)直接或間接調(diào)用的函數(shù)。12而用戶程序里可能包含要被手工編寫的匯編語(yǔ)言程序調(diào)用而沒(méi)有被main函數(shù)調(diào)用的函數(shù),這時(shí)就應(yīng)該用FUNC_EXT_CALLED來(lái)通知編譯器保留此函數(shù)和被此函數(shù)調(diào)用到的函數(shù),這些函數(shù)將作為C程序的入口點(diǎn)。這個(gè)偽指令必須出現(xiàn)在對(duì)要保留的函數(shù)的任何聲明或引用之前,其語(yǔ)法為:
#pragmaFUNC_EXT_CALLED(func);15.2.6asm語(yǔ)句C編譯器可在編譯器輸出的匯編語(yǔ)言程序中直接輸出匯編指令或語(yǔ)句。利用asm語(yǔ)句嵌入?yún)R編語(yǔ)言程序,可實(shí)現(xiàn)一些C語(yǔ)言13實(shí)現(xiàn)起來(lái)比較麻煩的硬件控制功能。asm語(yǔ)句在語(yǔ)法上就象是調(diào)用一個(gè)函數(shù)名為asm的函數(shù),函數(shù)參數(shù)是一個(gè)字符串:
asm(“assemblertext”);編譯器會(huì)直接將“參數(shù)字符串”復(fù)制到輸出的匯編語(yǔ)言程序中,因此必須保證參數(shù)雙引號(hào)之間的字符串是一個(gè)有效的匯編語(yǔ)言指令。雙引號(hào)之間的匯編指令必須以空格、制表符(TAB)、標(biāo)記符(LABEL)或注釋開(kāi)頭,這和匯編語(yǔ)言編程的要求是一致的。14編譯器不會(huì)檢查此匯編語(yǔ)句是否合法,如果語(yǔ)句中有錯(cuò)誤,在匯編的過(guò)程中會(huì)被匯編器指出。使用asm指令應(yīng)小心不要破壞C語(yǔ)言的環(huán)境。如果C代碼中插入跳轉(zhuǎn)指令和標(biāo)記符可能會(huì)引起不可預(yù)料的操作結(jié)果。能夠改變段或其它影響C語(yǔ)言環(huán)境的指令也可能引起麻煩。對(duì)包含asm語(yǔ)句的程序使用優(yōu)化器時(shí)要特別小心。優(yōu)化器可以重新安排asm指令附近的代碼順序,這可能會(huì)引起不期望的結(jié)果。1515.2.7訪問(wèn)I/O空間讀寫I/O空間的功能是C編譯器對(duì)標(biāo)準(zhǔn)C的擴(kuò)展,是利用關(guān)鍵字ioport(I/O端口)來(lái)實(shí)現(xiàn)的。
ioporttypeporthexnum;ioport指示這是定義一個(gè)端口變量的關(guān)鍵字。type(類型)必須是char(字符)、short(短整型)、int(整型)或?qū)?yīng)的無(wú)符號(hào)類型。porthexnum為定義的端口變量,格式為“port”后面跟一個(gè)16進(jìn)制數(shù)。例如“port000A”是定義訪問(wèn)I/O空間地址0Ah的變量。16所有I/O端口的定義必須在文件級(jí)完成,不支持在函數(shù)級(jí)聲明的I/O端口變量。利用ioport關(guān)鍵字定義的I/O端口變量可以象一般變量一樣進(jìn)行賦值操作:
ioport
unsinged
port10; /*訪問(wèn)I/O空間10h的變量*/ { ......
port10=a;/*將a寫到端口10h*/ ...... b=port10;/*從端口10h讀入b*/......}17端口變量的使用不僅限于賦值操作,用ioport關(guān)鍵字定義的I/O端口變量可象其它變量一樣用在表達(dá)式中,例如:
a=port10+b;/*讀端口10h,加上b,結(jié)果賦給a*/
port10+=a;/*讀端口10h,加上a,結(jié)果寫回到端口10h*/
在進(jìn)行函數(shù)調(diào)用的時(shí)候,可以做I/O端口變量的值傳遞,而不是引用,例如:call(port10); /*讀端口10h,將其值傳遞給函數(shù)調(diào)用*/call(&port10); /*引用傳遞無(wú)效!*/1815.2.8訪問(wèn)數(shù)據(jù)空間訪問(wèn)數(shù)據(jù)空間是利用指針來(lái)實(shí)現(xiàn)的: *(unsignedint*)0x1000=a;/*將a的值寫入數(shù)據(jù)空間1000h地址*/
b=*(unsignedint*)0x1000;/*讀出數(shù)據(jù)空間1000h地址的值,賦給b*/可見(jiàn)訪問(wèn)DSP數(shù)據(jù)空間地址不需要對(duì)要訪問(wèn)的單元預(yù)先定義,利用指針直接訪問(wèn)就可以了。這樣,訪問(wèn)數(shù)據(jù)空間很容易實(shí)現(xiàn)循環(huán)結(jié)構(gòu)。例如:
19for(i=0;i<cnt;i++) {
tmp=*(unsignedint*)(org+i); *(unsignedint*)(org+offset+i)=tmp; }
15.2.9中斷服務(wù)函數(shù)同單片機(jī)中斷處理方式類似,DSP中斷的處理也有兩種方式:(1)查詢法:對(duì)中斷的處理可完全按照程序預(yù)定的方式進(jìn)行, 一般不會(huì)出現(xiàn)中斷丟失或中斷嵌套的問(wèn)題,但是20實(shí)時(shí)性不容易保證。(2)回調(diào)法:當(dāng)有中斷發(fā)生時(shí),會(huì)暫停當(dāng)前正在執(zhí)行的程序。程序的實(shí)時(shí)性可得到保證,但如果中斷處理函數(shù)使用不當(dāng)易造成中斷丟失或中斷嵌套問(wèn)題。21采用回調(diào)法處理DSP中斷需定義中斷服務(wù)函數(shù),有兩種方法:(1)用關(guān)鍵字intterupt(中斷)來(lái)實(shí)現(xiàn)。它的用法是: interruptvoidisr
(void);(2)任何具有名為c_intd
的函數(shù)(d為0到9的數(shù)),都被假定為一個(gè)中斷程序。如:
voidc_int1(void);無(wú)論用哪種方法定義中斷服務(wù)函數(shù),都須注意以下問(wèn)題: (1)中斷處理函數(shù)必須是void類型,而且不能有任何輸入?yún)?shù)。22(2)進(jìn)入中斷服務(wù)函數(shù),編譯器將自動(dòng)保護(hù)所有必要的寄存器,并在中斷服務(wù)函數(shù)結(jié)束時(shí)恢復(fù)運(yùn)行環(huán)境。(3)進(jìn)入中斷服務(wù)函數(shù),編譯器只保護(hù)與運(yùn)行上下文相關(guān)的寄存器,而不保護(hù)所有的寄存器。中斷服務(wù)函數(shù)可以任意修改不被保護(hù)的寄存器,如外設(shè)控制寄存器等。(4)要注意IMR、INTM等中斷控制量的設(shè)置。通常進(jìn)入中斷服務(wù)程序要設(shè)置相應(yīng)寄存器將總中斷屏蔽,退出中斷服務(wù)程序時(shí)再打開(kāi),避免中斷嵌套。23(5)中斷處理函數(shù)可以被其他C程序調(diào)用,但是效率較差。(6)多個(gè)中斷可以共用一個(gè)中斷服務(wù)函數(shù),除了c_int0。c_int0是DSP軟件開(kāi)發(fā)平臺(tái)CCS提供的一個(gè)保留的復(fù)位中斷處理函數(shù),不會(huì)被調(diào)用,也不需要保護(hù)任何寄存器。(7)使用中斷處理函數(shù)與一些編譯選項(xiàng)沖突,注意避免對(duì)包含中斷處理函數(shù)的C程序采用這些編譯選項(xiàng)。(8)中斷服務(wù)函數(shù)可以和一般函數(shù)一樣訪問(wèn)全局變量、分配局部變量和調(diào)用其它函數(shù)等。24(9)要利用中斷向量定義將中斷服務(wù)函數(shù)入口地址放在中斷向量處以使中斷服務(wù)函數(shù)可以被正確調(diào)用。(10)中斷服務(wù)函數(shù)要盡量短小,避免中斷丟失、中斷嵌套等問(wèn)題。15.2.10動(dòng)態(tài)分配內(nèi)存 TMS320C2000C語(yǔ)言程序中可以調(diào)用malloc、calloc或realloc函數(shù)來(lái)動(dòng)態(tài)分配內(nèi)存。25
unsignedint*data; data=(unsignedint*)malloc(100*sizeof(unsignedint));動(dòng)態(tài)分配的內(nèi)存將分配在.system段,且只能通過(guò)指針進(jìn)行訪問(wèn)。將大數(shù)組通過(guò)這種方式來(lái)分配可以節(jié)省.bss段的空間。 通過(guò)鏈接器的-heap選項(xiàng)可以定義.system段的大小。15.2.11系統(tǒng)初始化C程序開(kāi)始運(yùn)行時(shí),必須首先初始化C運(yùn)行環(huán)境,這是通過(guò)c_int0函數(shù)完成的。26c_int0函數(shù)是復(fù)位中斷的中斷服務(wù)函數(shù),此函數(shù)在運(yùn)行支持庫(kù)(rts,runtime_supportlibrary)中提供。鏈接器會(huì)將這個(gè)函數(shù)的入口地址放置在復(fù)位中斷向量處,使其可以在初始化時(shí)被調(diào)用。c_int0函數(shù)進(jìn)行以下工作來(lái)建立C運(yùn)行環(huán)境:(1)為系統(tǒng)堆棧產(chǎn)生.stack段,并初始化堆棧指針。(2)從.cinit段將初始化數(shù)據(jù)復(fù)制到.bss段中相應(yīng)的變量。(3)調(diào)用main函數(shù),開(kāi)始運(yùn)行C程序。27用戶程序可不用考慮上述問(wèn)題,認(rèn)為程序從main函數(shù)開(kāi)始執(zhí)行就可以。用戶可對(duì)c_int0函數(shù)進(jìn)行修改,但修改后的函數(shù)必須完成以上任務(wù)。15.3DSP
C語(yǔ)言與匯編語(yǔ)言混合編程
C語(yǔ)言編寫DSP程序?qū)Φ讓拥牧私庖筝^低,流程控制靈活,開(kāi)發(fā)周期短。程序可讀性、可移植性好,程序修改、升級(jí)方便。28某些硬件控制功能不如匯編語(yǔ)言靈活,程序?qū)崟r(shí)性不理想,很多核心程序可能仍然需要利用匯編語(yǔ)言來(lái)實(shí)現(xiàn)。
利用兩種語(yǔ)言進(jìn)行混合編程主要有以下四種方式: (1)C程序調(diào)用匯編函數(shù); (2)內(nèi)嵌匯編語(yǔ)句; (3)C程序訪問(wèn)匯編程序變量; (4)修改C編譯器輸出。2915.3.1程序運(yùn)行環(huán)境在C語(yǔ)言和匯編語(yǔ)言混合編程中,必須保證C程序運(yùn)行環(huán)境不會(huì)被匯編程序破壞,所有代碼必須維護(hù)該環(huán)境,否則將難以保證C程序的正常執(zhí)行。1.存儲(chǔ)器模型C編譯器將存儲(chǔ)器作為程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器兩個(gè)線性區(qū)來(lái)處理:程序存儲(chǔ)器:包含可執(zhí)行的代碼和常量、變量初值。數(shù)據(jù)存儲(chǔ)器:包含外部變量、靜態(tài)變量和系統(tǒng)堆棧。
30(1)段的存儲(chǔ)分配編譯器產(chǎn)生可重新定位的代碼段和數(shù)據(jù)段,包括:a.已初始化的段:包含數(shù)據(jù)和代碼。 包括.text、.cinit、.switch等。b.未初始化的段:為全局變量和靜態(tài)變量保留空間。 包括.bss、.stack、.system等。用戶可以利用CODE_SECTION和DATA_SECTION偽指令來(lái)創(chuàng)建另外的段。31
段的存儲(chǔ)分配和頁(yè)的指定
段存儲(chǔ)器類型頁(yè).textROM或RAM0.cinitROM或RAM0.switchROM或RAM0.constROM或RAM1.bssRAM1.stackRAM1.systemRAM132(2)系統(tǒng)堆棧 C編譯器使用軟件堆棧進(jìn)行如下工作:分配局部變量向函數(shù)傳遞參數(shù)保存處理器狀態(tài)保存函數(shù)的返回地址保存暫時(shí)的結(jié)果保存寄存器33堆棧向上生長(zhǎng),編譯器使用兩個(gè)寄存器管理堆棧:AR1:堆棧指針(SP,stackpointer),指向當(dāng)前堆棧頂。AR2:幀指針(FP,framepointer),指向當(dāng)前幀的起始點(diǎn)。每一個(gè)函數(shù)都會(huì)在堆棧頂部建立一個(gè)新的幀,用來(lái)保存局部的或臨時(shí)的變量。C語(yǔ)言環(huán)境自動(dòng)操作這兩個(gè)寄存器。如果編寫用到堆棧的匯編語(yǔ)言程序,一定要注意正確使用這兩個(gè)寄存器。用-stack連接選項(xiàng)可以指定軟件堆棧的大小,用C編寫DSP程序一定注意保留足夠的堆??臻g!34 注意:編譯器不會(huì)檢查堆棧溢出情況,堆棧溢出會(huì)破壞DSP運(yùn)行環(huán)境,導(dǎo)致程序失敗。編寫DSP程序和配置DSP存儲(chǔ)器資源要注意防止堆棧溢出的發(fā)生。2.寄存器規(guī)則TMS320DSP運(yùn)行環(huán)境對(duì)寄存器的使用有嚴(yán)格的規(guī)則,如果編寫涉及到寄存器的匯編程序,必須嚴(yán)格遵守規(guī)則,否則可能系統(tǒng)工作異常。寄存器規(guī)則規(guī)定了編譯器如何使用寄存器和寄存器在函數(shù)調(diào)用的過(guò)程中如何進(jìn)行保護(hù)。35寄存器按保護(hù)方式分為兩種:調(diào)用保存(saveoncall),調(diào)用其它函數(shù)的函數(shù)負(fù)責(zé)保存這些寄存器的內(nèi)容。入口保存(saveonentry),被調(diào)用的函數(shù)負(fù)責(zé)保存這些寄存器的內(nèi)容。注:無(wú)論是否使用優(yōu)化編譯,都必須遵守這些寄存器規(guī)則。36寄存器用途調(diào)用時(shí)保護(hù)AR0幀指針(FP)YesAR1堆棧指針(SP)YesAR2局部變量指針(LVP)NoAR3-AR5表達(dá)式運(yùn)算NoAR6-AR7寄存器變量YesAccumulator表達(dá)式運(yùn)算/返回值No
寄存器的使用和保護(hù)37
狀態(tài)寄存器(ST0、ST1)單元對(duì)于有假定值(為0或?yàn)?)的狀態(tài)寄存器單元,在進(jìn)行函數(shù)調(diào)用和函數(shù)返回時(shí)必須保證其值為假定值。單元名稱假定值A(chǔ)RP輔助寄存器指針1C進(jìn)位標(biāo)志-DP數(shù)據(jù)頁(yè)-OV溢出標(biāo)值-OVM溢出模式0PM乘法移位模式0SXM符號(hào)擴(kuò)展模式-TC測(cè)試模式-38 3個(gè)寄存器——堆棧指針(SP)、幀指針(FP)和局部變量指針(LVP)管理堆棧和局部幀。
AR6、AR7作為寄存器變量的寄存器。AR6被分配給第一個(gè)變量,AR7分配給第二個(gè)變量。
編譯器使用不用于寄存器變量的寄存器來(lái)計(jì)算表達(dá)式的值并保存臨時(shí)結(jié)果。
39當(dāng)函數(shù)的返回值是一個(gè)標(biāo)量類型(整型、指針或浮點(diǎn)型)時(shí),該值在函數(shù)返回時(shí)被放入累加器中。 16位的數(shù)據(jù)類型(字符型、短整型、整型或指針型)連同正確的符號(hào)擴(kuò)展被裝載到累加器中。3.函數(shù)結(jié)構(gòu)和調(diào)用規(guī)則 C編譯器對(duì)函數(shù)的調(diào)用有一系列嚴(yán)格的規(guī)定。除了特殊的運(yùn)行支持函數(shù)外,任何調(diào)用者函數(shù)和被調(diào)用函數(shù)都要遵守這些規(guī)則,否則可能會(huì)破壞C環(huán)境并導(dǎo)致程序失敗。
40(1)函數(shù)如何產(chǎn)生調(diào)用 一個(gè)函數(shù)(調(diào)用者函數(shù))在調(diào)用其他函數(shù)(子函數(shù))時(shí)執(zhí)行以下任務(wù)。注意,ARP必須設(shè)置為1。a.調(diào)用者函數(shù)將參數(shù)以顛倒的順序壓入堆棧(最右邊聲明的參數(shù)第一個(gè)壓入堆棧,最左邊的參數(shù)最后一個(gè)壓入堆棧)。即函數(shù)調(diào)用時(shí),最左邊的參數(shù)放在棧頂單元。b.調(diào)用者函數(shù)調(diào)用子函數(shù)。c.調(diào)用者函數(shù)假定當(dāng)子函數(shù)執(zhí)行完成返回時(shí),ARP將被置為1。d.完成調(diào)用后,調(diào)用者函數(shù)將參數(shù)彈出堆棧。41(2)被調(diào)用函數(shù)如何響應(yīng)a.將返回地址從硬件堆棧中彈出,壓入軟件堆棧。b.將FP壓入軟件堆棧。c.分配局部幀。d.如果函數(shù)修改了AR6和AR7,則將它們壓入堆棧,其他的任何寄存器可以不用保存,任意修改。42e.實(shí)現(xiàn)函數(shù)功能。f.如果函數(shù)返回標(biāo)量數(shù)據(jù),將它放入累加器。g.將ARP設(shè)定為AR1。h.如果保護(hù)了AR6、AR7,恢復(fù)這兩個(gè)寄存器。i.刪除局部幀。j.恢復(fù)FP。k.從軟件堆棧中彈出返回地址并壓入硬件堆棧。l.返回。43(3)被調(diào)用的函數(shù)的三種特殊情況
a.返回的是一個(gè)結(jié)構(gòu)體:當(dāng)函數(shù)的返回值為一個(gè)結(jié)構(gòu)時(shí),調(diào)用者函數(shù)負(fù)責(zé)分配存儲(chǔ)空間,并將存儲(chǔ)空間地址作為最后一個(gè)輸入?yún)?shù)傳遞給被調(diào)用函數(shù)。被調(diào)用函數(shù)將要返回的結(jié)構(gòu)拷貝到這個(gè)參數(shù)所指向的內(nèi)存空間。
b.不將返回地址移到軟件堆棧中:當(dāng)被調(diào)用函數(shù)不再調(diào)用其它函數(shù),或者確定調(diào)用深度不會(huì)超過(guò)8級(jí),可以不用將返回地址移動(dòng)到軟件堆棧。
c.不分配局部幀:如果函數(shù)沒(méi)有輸入?yún)?shù),不使用局部變量,就不需要修改AR0(FP),因此也不需要對(duì)其進(jìn)行保護(hù)。44調(diào)用者局部幀F(xiàn)PSP調(diào)用前調(diào)用者局部幀F(xiàn)PSP參數(shù)n...參數(shù)1返回地址壓入?yún)?shù)調(diào)用函數(shù)調(diào)用者局部幀原FP參數(shù)n..參數(shù)1返回地址分配局部幀原FP暫存單元局部幀F(xiàn)PSP4515.3.2C語(yǔ)言調(diào)用匯編函數(shù)
a.無(wú)論是C函數(shù)還是匯編語(yǔ)言的所有函數(shù),都必須遵循寄存器規(guī)則。b.必須保存被函數(shù)修改的任何專用寄存器,包括:AR0(FP)、AR1(SP)、AR6、AR7。如果正常使用堆棧,則不必明確保存SP。也就是說(shuō),用戶可以自由地使用堆棧,彈出被壓入的所有內(nèi)容。用戶可以自由使用所有其他的寄存器,而不必保留它們的內(nèi)容。46c.如果改變了任何一個(gè)寄存器位域狀態(tài)的假定值,則必須確保恢復(fù)其假定值。尤其注意ARP應(yīng)該被指定為AR1。d.中斷子程序必須保存所有使用的寄存器。e.在從匯編語(yǔ)言中調(diào)用C函數(shù)時(shí),將參數(shù)以倒序壓入堆棧,函數(shù)調(diào)用后彈出堆棧。f.調(diào)用C函數(shù)時(shí),只有專用的寄存器內(nèi)容被保留,C函數(shù)可以改變其他任何寄存器的內(nèi)容。g.函數(shù)必須返回累加器中的值。h.匯編模塊使用.cinit段只能用于全局變量的初始化。boot.c中的啟動(dòng)子程序假定.cinit段完全是由初始化表組成。在.cinit段中放入其他的信息會(huì)破壞初始化表而導(dǎo)致無(wú)法預(yù)知的后果。47編譯器將在所有的C語(yǔ)言對(duì)象標(biāo)識(shí)符的開(kāi)頭添加下劃線“_”。在C語(yǔ)言中和匯編語(yǔ)言都要訪問(wèn)的對(duì)象必須在匯編語(yǔ)言中以下劃線“_”作為前綴。例如,C語(yǔ)言中名為x的對(duì)象在匯編語(yǔ)言中為_(kāi)x。僅在匯編語(yǔ)言模塊中使用的對(duì)象可以使用不加下劃線的標(biāo)識(shí)符,不會(huì)和C語(yǔ)言中的標(biāo)識(shí)符發(fā)生沖突。j.在C中被訪問(wèn)的任何匯編語(yǔ)言對(duì)象或在C中被調(diào)用的任何匯編語(yǔ)言函數(shù)必須在匯編代碼中使用.global偽指令聲明。這將聲明該符號(hào)是外部的,允許鏈接器解決對(duì)它的引用。4815.3.3內(nèi)嵌匯編語(yǔ)句
在TMS320C2000C語(yǔ)言中,可以使用asm語(yǔ)句在編譯器產(chǎn)生的匯編語(yǔ)言文件中嵌入單行的匯編語(yǔ)句。一系列的asm語(yǔ)句可以將順序的匯編語(yǔ)句插入到編譯器的輸出代碼中。使用中的幾點(diǎn)注意事項(xiàng):a.asm語(yǔ)句使用戶可以訪問(wèn)某些用C語(yǔ)句無(wú)法訪問(wèn)的硬件特性。b.在使用asm語(yǔ)句的時(shí)候,要防止破壞C環(huán)境。編譯器不會(huì)對(duì)嵌入的代碼進(jìn)行檢查和分析。c.在asm語(yǔ)句中使用跳轉(zhuǎn)語(yǔ)句或標(biāo)記符(LABEL)可能會(huì)產(chǎn)生無(wú)法預(yù)知的結(jié)果。
49d.不要改變C變量的值,但可以安全地讀取任何變量的當(dāng)前值。e.不要使用asm語(yǔ)句嵌入?yún)R編偽指令,這會(huì)破壞匯編語(yǔ)言環(huán)境。f.在編譯器的輸出代碼中嵌入注釋時(shí),asm語(yǔ)句是很有用的??梢杂眯翘?hào)(*)作為匯編代碼的開(kāi)頭,例如:
asm(“******thisisanassemblylanguagecomment.”);50f.調(diào)用C函數(shù)時(shí),只有專用的寄存器內(nèi)容被保留,C函數(shù)可以改變其他任何寄存器的內(nèi)容。g.函數(shù)必須返回累加器中的值。h.匯編模塊使用.cinit段只能用于全局變量的初始化。boot.c中的啟動(dòng)子程序假定.cinit段完全是由初始化表組成。在.cinit段中放入其他的信息會(huì)破壞初始化表而導(dǎo)致無(wú)法預(yù)知的后果。51i編譯器將在所有的C語(yǔ)言對(duì)象標(biāo)識(shí)符的開(kāi)頭添加下劃線“_”。在C語(yǔ)言中和匯編語(yǔ)言都要訪問(wèn)的對(duì)象必須在匯編語(yǔ)言中以下劃線“_”作為前綴。例如,C語(yǔ)言中名為x的對(duì)象在匯編語(yǔ)言中為_(kāi)x。僅在匯編語(yǔ)言模塊中使用的對(duì)象可以使用不加下劃線的標(biāo)識(shí)符,不會(huì)和C語(yǔ)言中的標(biāo)識(shí)符發(fā)生沖突。j.
在C中被訪問(wèn)的任何匯編語(yǔ)言對(duì)象或在C中被調(diào)用的任何匯編語(yǔ)言函數(shù)必須在匯編代碼中使用.global偽指令聲明。這將聲明該符號(hào)是外部的,允許鏈接器解決對(duì)它的引用。5215.3.4C程序訪問(wèn)匯編程序變量有時(shí)需在C程序中訪問(wèn)匯編語(yǔ)言變量,這通常有兩種方式來(lái)訪問(wèn).bss塊中的變量:(1)將要訪問(wèn)的變量定義在.bss塊中。(2)用.golbal修飾要訪問(wèn)的變量。在匯編語(yǔ)言中以下橫線“_”為前綴聲明要訪問(wèn)的變量。在C語(yǔ)言中將變量聲明為外部變量(extern),就可以進(jìn)行正常訪問(wèn)。例如:53如何訪問(wèn)非.bss塊中的變量:要訪問(wèn)非.bss塊中的變量,通常的辦法是在匯編語(yǔ)言中定義一個(gè)查找表,然后在C語(yǔ)言中通過(guò)指針來(lái)訪問(wèn)。首先定義變量,而且最好放在獨(dú)立的初始化塊中。定義一個(gè)全局的標(biāo)識(shí)指向?qū)ο蟮钠鹗键c(diǎn),這樣對(duì)象可以分配在存儲(chǔ)器空間的任何位置。54在C程序中將這個(gè)對(duì)象定義為外部對(duì)象(extern),并且對(duì)象名稱不帶下橫線“_”前綴,就可以對(duì)其進(jìn)行正常訪問(wèn)。5515.3.5修改C編譯器的輸出
用戶可以編譯源程序,然后在匯編前對(duì)編譯輸出的匯編語(yǔ)言代碼進(jìn)行手動(dòng)檢查和修改。這種情況下,在C代碼中利用asm語(yǔ)句插入適當(dāng)?shù)淖⑨寣?duì)理解C編譯器輸出的匯編語(yǔ)言代碼是非常有幫助的。15.4運(yùn)行支持函數(shù)(rts)一個(gè)C程序所執(zhí)行的一些任務(wù)(如輸入/輸出、動(dòng)態(tài)存儲(chǔ)器配置、字符串操作以及三角函數(shù)等)。TMS320C2000C編譯器提供ANSI的標(biāo)準(zhǔn)庫(kù)。使用ANSI的標(biāo)準(zhǔn)庫(kù)可確保有一套統(tǒng)一的函數(shù)。56a.rts2xx.lib:運(yùn)行期支持目標(biāo)庫(kù),包含:
①ANSIC標(biāo)準(zhǔn)庫(kù)
②
系統(tǒng)啟動(dòng)程序_c_int0③允許C訪問(wèn)特殊指令的函數(shù)和宏b.rts.src:運(yùn)行期支持資源庫(kù)。包含:運(yùn)行期支持目標(biāo)庫(kù)的C語(yǔ)言和匯編語(yǔ)言程序源代碼。15.5常用數(shù)字信號(hào)處理程序FFT、FIR等,最好用匯編語(yǔ)言實(shí)現(xiàn),有豐富的資料可供參考。5715.6閃存編程程序編寫、調(diào)試完成后,需將編譯、鏈接所得到的可執(zhí)行文件(.out)燒寫到DSP的程序存儲(chǔ)器中,使DSP可擺脫開(kāi)發(fā)系統(tǒng)運(yùn)行。對(duì)TMS320LF2407而言,應(yīng)該可執(zhí)行文件燒寫到片內(nèi)部閃存中。58燒寫DSP程序要利用硬件仿真器實(shí)現(xiàn),仿真器制造商會(huì)提供相應(yīng)的燒寫程序。注意:不同型號(hào)DSP往往使用不同的燒寫程序,不同類型的仿真器對(duì)燒寫環(huán)境也會(huì)有不同的要求,使用前要詳細(xì)閱讀相應(yīng)說(shuō)明(readme)。MP/MC*為低,置為微計(jì)算機(jī)模式仿真RAM不被PS*信號(hào)選中59DSP燒寫步驟:
清除Flash內(nèi)容(bc0.bat,bc1.bat)將FLASH中的所有位清0。擦除Flash內(nèi)容(be0.bat,be1.bat)將Flash中的所有位置1。
把目標(biāo)程序?qū)戇M(jìn)Flash中(bp16k.bat,
bp32k.bat)將Flash中的所有選中的位清0(setto0)。60寫入程序獨(dú)立運(yùn)行的結(jié)果往往與仿真的狀態(tài)有差異,甚至可能不能正常運(yùn)行,這是由于仿真過(guò)程中的程序運(yùn)行情況和DSP獨(dú)立運(yùn)行時(shí)的程序運(yùn)行情況不同所引起。在將程序編程到DSP內(nèi)部之前,為保證正常運(yùn)行,需考慮以下問(wèn)題:(1)電路元件初始化同步問(wèn)題由于外部元件初始化可能較慢,DSP初始化完成后要延時(shí)一段時(shí)間再訪問(wèn)外部慢速器件,通常要在控制程序的主函數(shù)中添加一段循環(huán)延時(shí)程序。61(2)用仿真器調(diào)試,程序執(zhí)行較慢,循環(huán)時(shí)間比較長(zhǎng),而燒寫到DSP中可能時(shí)間較短,要對(duì)循環(huán)程序的循環(huán)次數(shù)重新考慮。(3)用仿真器調(diào)試,DSP運(yùn)行的一些資源(如堆棧等)用的是仿真器中的資源,燒寫到DSP中執(zhí)行必須利用DSP本身的資源,燒寫前必須對(duì)鏈接命令文件(.cmd文件)中定義的各種資源進(jìn)行詳細(xì)考慮。(4)浮點(diǎn)數(shù)運(yùn)算的問(wèn)題浮點(diǎn)型變量考慮使用全局變量,因?yàn)榫植孔兞慷际窃诙褩@锷傻?,過(guò)多的浮點(diǎn)數(shù)變量對(duì)軟件堆棧要求太多,容易造成堆棧溢出問(wèn)題。62(5)復(fù)位問(wèn)題利用仿真器進(jìn)行調(diào)試的時(shí)候,DSP程序通過(guò)仿真環(huán)境啟動(dòng),不需要復(fù)位信號(hào);而閃存編程后DSP的運(yùn)行中,復(fù)位要通過(guò)電路板上復(fù)位電路來(lái)實(shí)現(xiàn),如果電路板上復(fù)位電路有問(wèn)題,不能保證DSP的正常復(fù)位,會(huì)造成仿真通過(guò)的程序,編程到DSP中后完全無(wú)法正常執(zhí)行。63(6)時(shí)鐘問(wèn)題利用仿真器進(jìn)行仿真調(diào)試時(shí),時(shí)鐘由硬件仿真器提供,而閃存編程后DSP運(yùn)行時(shí)鐘由電路板時(shí)鐘電路提供,如果電路板時(shí)鐘電路有問(wèn)題,編程后的DSP將無(wú)法正常工作。閃存編程之后DSP獨(dú)立運(yùn)行的時(shí)候出現(xiàn)的很多問(wèn)題都是由于時(shí)序配合引起的,這就需要調(diào)整程序中的各種延時(shí),甚至可能要經(jīng)過(guò)反復(fù)調(diào)整來(lái)尋求最佳的延時(shí)設(shè)置,以保證系統(tǒng)功能的正常實(shí)現(xiàn)。6415.7程序設(shè)計(jì)舉例15.7.1功能要求按一定頻率控制4個(gè)發(fā)光二極管的點(diǎn)亮狀態(tài),要求如下:(1)四個(gè)發(fā)光二極管依次循環(huán)顯示0000b-1111b;(2)發(fā)光二極管顯示刷新頻率10Hz;(3)發(fā)光二極管的控制映射在I/O空間0xC的低四位,寫1點(diǎn)亮;(4)顯示刷新頻率的控制利用定時(shí)器實(shí)現(xiàn)。6515.7.2
工程組成功能要求:對(duì)發(fā)光二極管的制通過(guò)對(duì)I/O端口讀寫來(lái)實(shí)現(xiàn),而
顯示頻率的控制用定時(shí)器來(lái)控制。對(duì)定時(shí)器中斷的處理可采用回調(diào)方式處理。程序的工程中應(yīng)該包含如下文件:(1)鏈接命令文件.cmd,配置資源映射;(2)頭文件.h,定義TMS320LF2407片內(nèi)外設(shè)控制寄存器;(3)中斷向量表文件.asm,匯編語(yǔ)言編寫;(4)C程序.c。6615.7.3鏈接命令文件鏈接命令文件分為三部分:(1)設(shè)置鏈接選項(xiàng),在程序鏈接的時(shí)候加載運(yùn)行期支持庫(kù)rts2xx.lib;(2)將物理存儲(chǔ)器(程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器)分為若干存儲(chǔ)器塊;(3)將程序中的各種數(shù)據(jù)和代碼段映射到存儲(chǔ)器塊:
中斷向量、程序段和初始化數(shù)據(jù)映射在程序空間;軟件堆棧、全局變量映射在數(shù)據(jù)空
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)聚苯硫醚市場(chǎng)十三五規(guī)劃及投資風(fēng)險(xiǎn)評(píng)估報(bào)告
- 2025-2030年中國(guó)稀土磁鋼行業(yè)運(yùn)營(yíng)狀況與發(fā)展?jié)摿Ψ治鰣?bào)告
- 2025-2030年中國(guó)祛斑養(yǎng)顏保健品行業(yè)運(yùn)行狀況及前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)電腦電源市場(chǎng)運(yùn)行動(dòng)態(tài)與營(yíng)銷策略研究報(bào)告
- 2025-2030年中國(guó)電子駐車制動(dòng)器EPB市場(chǎng)運(yùn)營(yíng)狀況與發(fā)展?jié)摿Ψ治鰣?bào)告
- 邢臺(tái)學(xué)院《工程結(jié)構(gòu)抗震設(shè)計(jì)原理》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖北民族大學(xué)《數(shù)據(jù)庫(kù)原理及應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 云南師范大學(xué)《電力系統(tǒng)分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 武漢科技職業(yè)學(xué)院《動(dòng)物試驗(yàn)設(shè)計(jì)與統(tǒng)計(jì)分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川藝術(shù)職業(yè)學(xué)院《針灸學(xué)(實(shí)驗(yàn))》2023-2024學(xué)年第二學(xué)期期末試卷
- 高壓電工證考試題庫(kù)及答案(完整版)
- 精索靜脈曲張臨床路徑表單
- 2024年山東圣翰財(cái)貿(mào)職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)含答案(綜合卷)
- 委外催收機(jī)構(gòu)入圍項(xiàng)目投標(biāo)技術(shù)方案(技術(shù)標(biāo))
- 肝與膽病辨證課件
- (正式版)JBT 2930-2024 低壓電器產(chǎn)品型號(hào)編制方法
- 工程機(jī)械作業(yè)安全培訓(xùn)
- 部編版語(yǔ)文七年級(jí)下冊(cè)第三單元大單元整體教學(xué)設(shè)計(jì)
- 塑料件外觀檢驗(yàn)規(guī)范
- 消費(fèi)者行為學(xué)教案-消費(fèi)群體與消費(fèi)者行為教案
- 《經(jīng)營(yíng)模式淺談》課件
評(píng)論
0/150
提交評(píng)論