版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、1第第15章章 DSP的的C語言編程語言編程215.1 DSP C語言簡介語言簡介 軟件開發(fā)平臺為軟件開發(fā)平臺為CCS。CCS提供了提供了優(yōu)化的優(yōu)化的C編譯器編譯器,優(yōu)化編譯結(jié)果達(dá)手工編寫的,優(yōu)化編譯結(jié)果達(dá)手工編寫的90%以上。以上。廠商和相關(guān)公司也在廠商和相關(guān)公司也在不斷對不斷對C優(yōu)化編譯器優(yōu)化編譯器進行改進進行改進.相信相信C語言程序優(yōu)化編譯的效果語言程序優(yōu)化編譯的效果會有進一步會有進一步改善。改善。3C C編譯器編譯器支持支持ANSI CANSI C語言標(biāo)準(zhǔn)。(語言標(biāo)準(zhǔn)。(ANSI-ANSI-American National American National Standards In
2、stituteStandards Institute,美國國家標(biāo)準(zhǔn)委員會),美國國家標(biāo)準(zhǔn)委員會)ANSIANSIC C 標(biāo)準(zhǔn)具有一些標(biāo)準(zhǔn)具有一些受目標(biāo)處理器、運行期環(huán)境或主機環(huán)境影受目標(biāo)處理器、運行期環(huán)境或主機環(huán)境影響的響的C C語言特性語言特性,這些特性,這些特性在各種標(biāo)準(zhǔn)的在各種標(biāo)準(zhǔn)的C C編譯器編譯器之間可能有之間可能有不同不同。 415.2 DSP C語言特性語言特性 15.2.1 TMS320C2000 C語言的特征語言的特征(1)標(biāo)識符和常數(shù))標(biāo)識符和常數(shù)所有標(biāo)識符的所有標(biāo)識符的前前100個字符有意義個字符有意義,區(qū)分區(qū)分大小寫大小寫。字符集為。字符集為ASCII碼,不存在多字節(jié)字
3、符。碼,不存在多字節(jié)字符。具有具有多個字符的多個字符的字符常數(shù)字符常數(shù)按序列中最后一個字符來編碼,例如:按序列中最后一個字符來編碼,例如:abc = = c(2)數(shù)據(jù)轉(zhuǎn)換)數(shù)據(jù)轉(zhuǎn)換5浮點到整數(shù)浮點到整數(shù)的的轉(zhuǎn)換,轉(zhuǎn)換,取整數(shù)取整數(shù)部分。部分。指針和整數(shù)可以自由轉(zhuǎn)換。指針和整數(shù)可以自由轉(zhuǎn)換。(3 3)表達(dá)式)表達(dá)式當(dāng)兩個有符號整數(shù)相除時,若其中一個為負(fù),則其商為負(fù),當(dāng)兩個有符號整數(shù)相除時,若其中一個為負(fù),則其商為負(fù),余數(shù)的符號與分子的符號相同余數(shù)的符號與分子的符號相同。n斜杠(斜杠(/)用來)用來求商求商,例如:,例如:10/-3 = -3,-10/3 = -3,n百分號(百分號(%)用來求)用
4、來求余數(shù)余數(shù),例如:,例如:10%-3 = 1,-10%3 = -16(4)聲明)聲明寄存器變量對所有寄存器變量對所有char,short,int和指針類型有效。和指針類型有效。關(guān)鍵字關(guān)鍵字interrupt僅可用于僅可用于無參量的無參量的void函數(shù)函數(shù)。(5)預(yù)處理)預(yù)處理 預(yù)處理器預(yù)處理器忽略忽略任何不支持的任何不支持的#pragma偽指令偽指令。 預(yù)處理器支持的預(yù)處理器支持的偽指令偽指令包括:包括:n CODE_SECTOINn DATA_SECTIONn FUNC_EXT_CALLED715.2.2 TMS320C2000 C15.2.2 TMS320C2000 C語言的數(shù)據(jù)類型語言
5、的數(shù)據(jù)類型注:在注:在TMS320C2x/C2xx/C5x CTMS320C2x/C2xx/C5x C語言中,字節(jié)長度為語言中,字節(jié)長度為1616位,位,sizeofsizeof操作符返回操作符返回的對象長度是以的對象長度是以1616位為字節(jié)長度的字節(jié)數(shù)。例如位為字節(jié)長度的字節(jié)數(shù)。例如sizeof(intsizeof(int) = 1) = 1。815.2.3 TMS320C2000 C語言的語言的關(guān)鍵字關(guān)鍵字lconst(常數(shù))(常數(shù))lioport(I/O端口)端口)linterrupt(中斷)(中斷)lnear(近)(近)lfar(遠(yuǎn))(遠(yuǎn))lvolatile(可變的)(可變的)915.
6、2.4 15.2.4 寄存器變量寄存器變量一個函數(shù)一個函數(shù)中中最多可使用最多可使用兩個兩個寄存器變量寄存器變量。寄存器變量寄存器變量聲明聲明必須必須在在變量列表變量列表或或函數(shù)函數(shù)的起始處的起始處進行,在嵌套進行,在嵌套塊中聲明的寄存器變量被處理為塊中聲明的寄存器變量被處理為一般的變量一般的變量。編譯器編譯器使用使用AR6AR6和和AR7AR7作為寄存器變量:作為寄存器變量:AR6AR6被賦給被賦給第一個寄存器變量第一個寄存器變量AR7AR7被賦給被賦給第二個寄存器變量第二個寄存器變量寄存器變量寄存器變量的地址的地址會被放入分配的寄存器中,這樣會被放入分配的寄存器中,這樣變量的訪問變量的訪問速
7、度會更快速度會更快。101616位類型變量位類型變量(charchar、shortshort、intint和指針)都可被和指針)都可被定義定義為為寄存寄存器變量器變量。但在運行時,但在運行時,設(shè)置一個寄存器變量設(shè)置一個寄存器變量大約需要大約需要4 4條指令條指令,為了更,為了更有效地使用這個功能,有效地使用這個功能,僅當(dāng)變量僅當(dāng)變量被訪問被訪問超過超過2 2次次時時,才使用,才使用寄存器變量。寄存器變量。程序優(yōu)化編譯器程序優(yōu)化編譯器也會也會定義寄存器變量定義寄存器變量,但方式不同。編譯器會,但方式不同。編譯器會自己決定自己決定哪些變量哪些變量作為寄存器變量作為寄存器變量,程序中聲明的寄存器變,
8、程序中聲明的寄存器變量會全部量會全部被忽略被忽略。寄存器變量寄存器變量聲明的格式為:聲明的格式為:register register type type regreg; ;1115.2.5 15.2.5 偽指令偽指令pragmapragma偽指令偽指令pragmapragma通知編譯器的預(yù)處理器通知編譯器的預(yù)處理器如何處理函數(shù)如何處理函數(shù)。TMS320C2000 CTMS320C2000 C編譯器支持下列編譯器支持下列pragmapragma:n CODE_SECTION CODE_SECTIONn DATA_SECTION DATA_SECTIONn FUNC_EXT_CALLED FUNC
9、_EXT_CALLED 1. CODE_SECTION1. CODE_SECTION 該偽指令在名稱為該偽指令在名稱為section namesection name的的命名段命名段中中為為symbolsymbol分分配空間配空間。語法為。語法為:12 # #pragmapragma CODE_SECTION (symbol, “section name”); CODE_SECTION (symbol, “section name”);2. DATA_SECTION2. DATA_SECTION為名稱為為名稱為section namesection name的的命名段命名段中為中為symbol
10、symbol分配空間分配空間。語語法為:法為: # #pragmapragma DATA_SECTION (symbol, “section name”); DATA_SECTION (symbol, “section name”);3. FUNC_EXT_CALLED3. FUNC_EXT_CALLED當(dāng)使用當(dāng)使用-pm-pm選項選項時,編譯器將時,編譯器將使用使用程序級的優(yōu)化程序級的優(yōu)化。編譯器將。編譯器將刪除刪除所有所有未被未被mainmain函數(shù)函數(shù)直接或直接或間接調(diào)用間接調(diào)用的函數(shù)的函數(shù)。13而用戶程序里而用戶程序里可能包含可能包含要被手工編寫的匯編語言程序調(diào)用而沒要被手工編寫的匯編
11、語言程序調(diào)用而沒有被有被mainmain函數(shù)調(diào)用的函數(shù)函數(shù)調(diào)用的函數(shù),這時就應(yīng)該用,這時就應(yīng)該用FUNC_EXT_CALLEDFUNC_EXT_CALLED來來通知通知編譯器編譯器保留此函數(shù)和被此函數(shù)調(diào)用到的函數(shù)保留此函數(shù)和被此函數(shù)調(diào)用到的函數(shù),這些函,這些函數(shù)將作為數(shù)將作為C C程序的入口點。程序的入口點。這個偽指令必須出現(xiàn)在對這個偽指令必須出現(xiàn)在對要保留的函數(shù)要保留的函數(shù)的任何聲明或引用之前,的任何聲明或引用之前,其其語法為語法為:# #pragmapragma FUNC_EXT_CALLED ( FUNC_EXT_CALLED (funcfunc););15.2.6 15.2.6 asm
12、asm語句語句C C編譯器可在編譯器輸出的匯編語言程序中編譯器可在編譯器輸出的匯編語言程序中直接輸出匯編指令或直接輸出匯編指令或語句語句。利用。利用asmasm語句語句嵌入嵌入?yún)R編語言程序匯編語言程序,可實現(xiàn)一些,可實現(xiàn)一些C C語言語言14實現(xiàn)起來比較麻煩的實現(xiàn)起來比較麻煩的硬件控制功能硬件控制功能。asmasm語句語句在語法上在語法上就象是就象是調(diào)用一個函數(shù)名為調(diào)用一個函數(shù)名為asmasm的函數(shù)的函數(shù),函數(shù)參,函數(shù)參數(shù)是一個字符串:數(shù)是一個字符串:asmasm (“assembler text”); (“assembler text”);編譯器編譯器會直接將會直接將“參數(shù)字符串參數(shù)字符串”
13、復(fù)制到輸出的匯編語言程序中,復(fù)制到輸出的匯編語言程序中,因此必須保證參數(shù)因此必須保證參數(shù)雙引號之間雙引號之間的字符串是一個的字符串是一個有效的匯編語有效的匯編語言指令言指令。雙引號之間雙引號之間的的匯編指令匯編指令必須以空格、制表符(必須以空格、制表符(TABTAB)、標(biāo)記符)、標(biāo)記符(LABELLABEL)或注釋開頭,這和匯編語言編程的要求是一致的。)或注釋開頭,這和匯編語言編程的要求是一致的。15編譯器編譯器不會檢查不會檢查此匯編語句是否合法,此匯編語句是否合法,如果語句中有錯誤,在如果語句中有錯誤,在匯匯編的過程編的過程中中會被匯編器指出會被匯編器指出。使用使用asmasm指令指令應(yīng)小心
14、應(yīng)小心不要破壞不要破壞C C語言的環(huán)境語言的環(huán)境。如果如果C C代碼中插入代碼中插入跳跳轉(zhuǎn)指令轉(zhuǎn)指令和和標(biāo)記符標(biāo)記符可能會引起不可預(yù)料的操作結(jié)果??赡軙鸩豢深A(yù)料的操作結(jié)果。能夠改變能夠改變段或其它影響段或其它影響C C語言環(huán)境的指令也可能引起麻煩。語言環(huán)境的指令也可能引起麻煩。對包含對包含asmasm語句的程序語句的程序使用使用優(yōu)化器優(yōu)化器時要特別小心。時要特別小心。優(yōu)化器優(yōu)化器可以重可以重新安排新安排asmasm指令指令附近的代碼順序附近的代碼順序,這可能會引起不期望的結(jié)果。,這可能會引起不期望的結(jié)果。1615.2.7 15.2.7 訪問訪問I/OI/O空間空間讀寫讀寫I/O空間的功能是
15、空間的功能是 C編譯器編譯器對標(biāo)準(zhǔn)對標(biāo)準(zhǔn)C的擴展,的擴展,是利用是利用關(guān)鍵字關(guān)鍵字ioport(I/O端口)端口)來實現(xiàn)的。來實現(xiàn)的。 ioport type porthexnum;ioport指示這是定義一個端口變量的關(guān)鍵字。指示這是定義一個端口變量的關(guān)鍵字。type(類型)必須是(類型)必須是char(字符)、(字符)、short(短整型)、(短整型)、int(整型)或?qū)?yīng)的無符號類型。(整型)或?qū)?yīng)的無符號類型。porthexnum為定義的為定義的端口變量端口變量,格式為,格式為“port”后后面面跟一個跟一個16進制數(shù)進制數(shù)。例如例如“port000A”是定義訪問是定義訪問I/O空間地
16、址空間地址0Ah的變量。的變量。17所有所有I/O端口端口的的定義必須在定義必須在文件級文件級完成完成,不支持在不支持在函數(shù)級聲明函數(shù)級聲明的的I/O端口變量。端口變量。利用利用ioport關(guān)鍵字關(guān)鍵字定義的定義的I/O端口變量端口變量可以象可以象一般變量一樣一般變量一樣進行進行賦值賦值操作:操作:ioport unsinged port10;/*訪問訪問I/O空間空間10h的變量的變量*/.port10 = a; /*將將a寫到寫到端口端口10h*/ .b = port10; /*從端口從端口10h讀入讀入b*/.18 端口變量的使用端口變量的使用不僅限于不僅限于賦值賦值操作,用操作,用io
17、port關(guān)鍵字定義關(guān)鍵字定義的的I/O端口變量端口變量可象其它變量一樣用在可象其它變量一樣用在表達(dá)式表達(dá)式中中,例如:例如: a = port10 + b; /*讀端口讀端口10h,加上,加上b,結(jié)果賦給,結(jié)果賦給a*/ port10 += a;/*讀端口讀端口10h,加上,加上a,結(jié)果寫回到端口,結(jié)果寫回到端口10h*/ 在進行函數(shù)調(diào)用的時候,可以做在進行函數(shù)調(diào)用的時候,可以做I/O端口變量的值傳遞,而端口變量的值傳遞,而不是引用,不是引用,例如:例如:call (port10); /*讀端口讀端口10h,將其值傳遞給函數(shù)調(diào)用,將其值傳遞給函數(shù)調(diào)用*/call (&port10);
18、/*引用傳遞無效!引用傳遞無效!*/1915.2.8 訪訪問數(shù)據(jù)空間問數(shù)據(jù)空間訪問數(shù)據(jù)空間是訪問數(shù)據(jù)空間是利用指針利用指針來實現(xiàn)的:來實現(xiàn)的:*(unsigned int *)0 x1000 = a; /* 將將a的值寫入數(shù)據(jù)空間的值寫入數(shù)據(jù)空間 1000h地址地址 */b = *(unsigned int *)0 x1000; /* 讀出數(shù)據(jù)空間讀出數(shù)據(jù)空間1000h地址地址 的值,賦給的值,賦給b */可見訪問可見訪問DSP數(shù)據(jù)空間地址數(shù)據(jù)空間地址不需要不需要對要訪問的單元對要訪問的單元預(yù)先定義預(yù)先定義,利用利用指針指針直接訪問直接訪問就可以了。這樣,訪問數(shù)據(jù)空間就可以了。這樣,訪問數(shù)據(jù)空
19、間很容易實很容易實現(xiàn)循環(huán)結(jié)構(gòu)現(xiàn)循環(huán)結(jié)構(gòu)。例如:。例如:20for (i=0; icnt; i+)tmp = *(unsigned int *) (org + i);*(unsigned int *) (org + offset +i) = tmp; 15.2.9 15.2.9 中斷服務(wù)函數(shù)中斷服務(wù)函數(shù)同單片機中斷處理方式類似,同單片機中斷處理方式類似,DSP中斷的處理中斷的處理也有也有兩種兩種方式:方式:(1)查詢法:)查詢法:對中斷的處理可對中斷的處理可完全按照程序預(yù)定的方式完全按照程序預(yù)定的方式進行進行,一般不會出現(xiàn)中斷丟失或中斷嵌套的問題,但是一般不會出現(xiàn)中斷丟失或中斷嵌套的問題,但是2
20、1實時性實時性不容易保證不容易保證。 (2)回調(diào)法:)回調(diào)法:當(dāng)有中斷發(fā)生時,會暫停當(dāng)前正在執(zhí)行的程序。當(dāng)有中斷發(fā)生時,會暫停當(dāng)前正在執(zhí)行的程序。程序的程序的實時性實時性可得到保證,但如果中斷處理函數(shù)使用不當(dāng)易可得到保證,但如果中斷處理函數(shù)使用不當(dāng)易造成中斷丟失或中斷嵌套問題。造成中斷丟失或中斷嵌套問題。22采用采用回調(diào)法回調(diào)法處理處理DSP中斷中斷需定義中斷服務(wù)函數(shù)需定義中斷服務(wù)函數(shù),有,有兩種兩種方法:方法:(1)用關(guān)鍵字)用關(guān)鍵字intterupt(中斷)(中斷)來實現(xiàn)。它的用法是:來實現(xiàn)。它的用法是:interrupt void isr (void);(2)任何具有名為)任何具有名為c
21、_intd 的函數(shù)(的函數(shù)(d為為0到到9的數(shù)),都被的數(shù)),都被假定假定為一個中斷程序為一個中斷程序。如:。如:void c_int1 (void); 無論用哪種方法定義中斷服務(wù)函數(shù),都須注意以下問題:無論用哪種方法定義中斷服務(wù)函數(shù),都須注意以下問題:(1)中斷處理函數(shù)必須是)中斷處理函數(shù)必須是void類型類型,而且不能有任何輸入,而且不能有任何輸入?yún)?shù)。參數(shù)。23(2 2)進入中斷服務(wù)函數(shù),)進入中斷服務(wù)函數(shù),編譯器編譯器將自動保護將自動保護所有必要的寄存器,所有必要的寄存器,并在中斷服務(wù)函數(shù)結(jié)束時恢復(fù)運行環(huán)境。并在中斷服務(wù)函數(shù)結(jié)束時恢復(fù)運行環(huán)境。(3 3)進入中斷服務(wù)函數(shù),編譯器)進入中
22、斷服務(wù)函數(shù),編譯器只保護只保護與運行上下文相關(guān)與運行上下文相關(guān)的寄的寄存器存器,而,而不保護不保護所有的所有的寄存器寄存器。中斷服務(wù)函數(shù)。中斷服務(wù)函數(shù)可以任意修改可以任意修改不被保護的寄存器,如外設(shè)控制寄存器等。不被保護的寄存器,如外設(shè)控制寄存器等。(4 4)要注意)要注意IMRIMR、INTMINTM等中斷控制量的設(shè)置。通常等中斷控制量的設(shè)置。通常進入進入中斷服中斷服務(wù)程序要設(shè)置相應(yīng)寄存器務(wù)程序要設(shè)置相應(yīng)寄存器將將總中斷總中斷屏蔽屏蔽,退出退出中斷服務(wù)程序中斷服務(wù)程序時時再打開再打開,避免中斷嵌套。,避免中斷嵌套。24(5)中斷處理函數(shù))中斷處理函數(shù)可以被其他可以被其他C程序調(diào)用程序調(diào)用,但
23、是,但是效率較差。效率較差。(6)多個中斷可以多個中斷可以共用共用一個中斷服務(wù)函數(shù)一個中斷服務(wù)函數(shù),除了除了c_int0。c_int0是是DSP軟件開發(fā)平臺軟件開發(fā)平臺CCS提供的一個提供的一個保留的復(fù)位中斷保留的復(fù)位中斷處理函數(shù),處理函數(shù),不會被調(diào)用,不會被調(diào)用,也不需要保護任何寄存器。也不需要保護任何寄存器。(7)使用中斷處理函數(shù)與)使用中斷處理函數(shù)與一些一些編譯選項編譯選項沖突沖突,注意注意避免對包含中避免對包含中斷處理函數(shù)的斷處理函數(shù)的C程序采用這些編譯選項。程序采用這些編譯選項。(8)中斷服務(wù)函數(shù)中斷服務(wù)函數(shù)可以和可以和一般函數(shù)一般函數(shù)一樣訪問全局變量、分配局部一樣訪問全局變量、分配
24、局部變量和調(diào)用其它函數(shù)等。變量和調(diào)用其它函數(shù)等。25(9)要利用)要利用中斷向量定義中斷向量定義將中斷服務(wù)函數(shù)入口地址放在中斷將中斷服務(wù)函數(shù)入口地址放在中斷向量處以使中斷服務(wù)函數(shù)可以被正確調(diào)用。向量處以使中斷服務(wù)函數(shù)可以被正確調(diào)用。(10)中斷服務(wù)函數(shù)要)中斷服務(wù)函數(shù)要盡量短小盡量短小,避免中斷丟失、中斷嵌套等,避免中斷丟失、中斷嵌套等問題。問題。15.2.10 15.2.10 動態(tài)分配內(nèi)存動態(tài)分配內(nèi)存TMS320C2000 C語言程序中可以調(diào)用語言程序中可以調(diào)用malloc、calloc或或realloc函數(shù)來函數(shù)來動態(tài)分配內(nèi)存動態(tài)分配內(nèi)存。26unsigned int *data;data
25、 =(unsigned int *) malloc (100 * sizeof (unsigned int);動態(tài)分配的內(nèi)存將分配在動態(tài)分配的內(nèi)存將分配在.system段,且只能通過指針進行訪段,且只能通過指針進行訪問。將大數(shù)組通過這種方式來分配可以節(jié)省問。將大數(shù)組通過這種方式來分配可以節(jié)省.bss段的空間。段的空間。通過鏈接器的通過鏈接器的-heap選項選項可以可以定義定義.system段段的大小的大小。15.2.11 15.2.11 系統(tǒng)初始化系統(tǒng)初始化C程序開始運行時,必須首先程序開始運行時,必須首先初始化初始化C運行環(huán)境運行環(huán)境,這是通過,這是通過c_int0函數(shù)函數(shù)完成的。完成的。2
26、7c_int0函數(shù)函數(shù)是復(fù)位中斷的是復(fù)位中斷的中斷服務(wù)函數(shù)中斷服務(wù)函數(shù),此函數(shù)在,此函數(shù)在運行支持庫運行支持庫(rts, runtime_support library)中)中提供提供。鏈接器鏈接器會將這個會將這個函數(shù)的入口地址函數(shù)的入口地址放置在復(fù)位中斷向量處放置在復(fù)位中斷向量處,使其可以在,使其可以在初始化初始化時被調(diào)用時被調(diào)用。c_int0函數(shù)函數(shù)進行以下工作來進行以下工作來建立建立C運行環(huán)境運行環(huán)境:(1)為系統(tǒng)堆棧產(chǎn)生為系統(tǒng)堆棧產(chǎn)生.stack段段,并初始化堆棧指針。,并初始化堆棧指針。(2)從)從.cinit段段將將初始化數(shù)據(jù)復(fù)制到初始化數(shù)據(jù)復(fù)制到.bss段段中相應(yīng)的變量。中相應(yīng)的
27、變量。(3)調(diào)用調(diào)用main函數(shù)函數(shù),開始運行,開始運行C程序。程序。28用戶程序可不用考慮上述問題,用戶程序可不用考慮上述問題,認(rèn)為程序從認(rèn)為程序從main函數(shù)開始執(zhí)行函數(shù)開始執(zhí)行就可以。就可以。用戶用戶可對可對c_int0函數(shù)函數(shù)進行修改進行修改,但修改后的函數(shù)必須完成以上,但修改后的函數(shù)必須完成以上任務(wù)。任務(wù)。15.3 DSP15.3 DSP C C語言與匯編語言混合編程語言與匯編語言混合編程 C語言編寫語言編寫DSP程序?qū)Φ讓拥牧私庖筝^低,流程控制靈活,程序?qū)Φ讓拥牧私庖筝^低,流程控制靈活,開發(fā)周期短。程序可讀性、可移植性好,程序修改、升級方開發(fā)周期短。程序可讀性、可移植性好,程序
28、修改、升級方便。便。29某些硬件控制功能不如匯編語言靈活,某些硬件控制功能不如匯編語言靈活,程序程序?qū)崟r性不理想實時性不理想,很,很多核心程序可能仍然需要利用匯編語言來實現(xiàn)。多核心程序可能仍然需要利用匯編語言來實現(xiàn)。利用兩種語言進行利用兩種語言進行混合編程混合編程主要有以下主要有以下四種方式四種方式:(1)C程序程序調(diào)用匯編函數(shù)調(diào)用匯編函數(shù);(2)內(nèi)嵌匯編語句內(nèi)嵌匯編語句;(3)C程序程序訪問訪問匯編程序變量匯編程序變量; (4)修改修改C編譯器輸出編譯器輸出。3015.3.1 程序運行環(huán)境程序運行環(huán)境 在在C語言和匯編語言混合編程中,語言和匯編語言混合編程中,必須保證必須保證C程序運行環(huán)境不
29、程序運行環(huán)境不會被會被匯編程序匯編程序破壞破壞,所有代碼必須維護該環(huán)境,否則將難,所有代碼必須維護該環(huán)境,否則將難以保證以保證C程序的正常執(zhí)行。程序的正常執(zhí)行。1. 存儲器模型存儲器模型C編譯器將存儲器作為編譯器將存儲器作為程序存儲器程序存儲器和和數(shù)據(jù)存儲器數(shù)據(jù)存儲器兩個線性區(qū)兩個線性區(qū)來來處理:處理:程序存儲器程序存儲器:包含可執(zhí)行的代碼和常量、變量初值。:包含可執(zhí)行的代碼和常量、變量初值。數(shù)據(jù)存儲器數(shù)據(jù)存儲器:包含外部變量、靜態(tài)變量和系統(tǒng)堆棧。:包含外部變量、靜態(tài)變量和系統(tǒng)堆棧。 31(1)段的存儲分配)段的存儲分配編譯器產(chǎn)生可重新定位的代碼段和數(shù)據(jù)段,包括:編譯器產(chǎn)生可重新定位的代碼段和
30、數(shù)據(jù)段,包括:a. 已初始化的段已初始化的段:包含數(shù)據(jù)和代碼。:包含數(shù)據(jù)和代碼。包括包括.text、.cinit、.switch等等 。b. 未初始化的段未初始化的段:為全局變量和靜態(tài)變量保留空間。:為全局變量和靜態(tài)變量保留空間。包括包括.bss、.stack、.system等。等。用戶可以利用用戶可以利用CODE_SECTION和和DATA_SECTION偽指令偽指令來來創(chuàng)創(chuàng)建另外的段建另外的段。32段的存儲分配和頁的指定段的存儲分配和頁的指定段段存儲器類型存儲器類型頁頁.text.textROMROM或或RAMRAM0 0. .cinitcinitROMROM或或RAMRAM0 0.swi
31、tch.switchROMROM或或RAMRAM0 0.const.constROMROM或或RAMRAM1 1. .bssbssRAMRAM1 1.stack.stackRAMRAM1 1.system.systemRAMRAM1 133(2 2)系統(tǒng)堆棧)系統(tǒng)堆棧C編譯器編譯器使用軟件堆棧進行如下工作:使用軟件堆棧進行如下工作:n分配局部變量分配局部變量n向函數(shù)傳遞參數(shù)向函數(shù)傳遞參數(shù)n保存處理器狀態(tài)保存處理器狀態(tài)n保存函數(shù)的返回地址保存函數(shù)的返回地址n保存暫時的結(jié)果保存暫時的結(jié)果n保存寄存器保存寄存器34堆棧向上生長堆棧向上生長,編譯器使,編譯器使用用兩個寄存器兩個寄存器管理堆棧管理堆棧:
32、AR1:堆棧指針(堆棧指針(SP, stack pointer),指向當(dāng)前堆),指向當(dāng)前堆棧頂。棧頂。AR2:幀指針(幀指針(FP, frame pointer),指向當(dāng)前幀的),指向當(dāng)前幀的起始點。起始點。每一個函數(shù)每一個函數(shù)都會在堆棧頂部都會在堆棧頂部建立建立一個新的一個新的幀,用來幀,用來保存局部的或臨時的變量。保存局部的或臨時的變量。C語言環(huán)境語言環(huán)境自動操作自動操作這這兩個寄存器兩個寄存器。如果。如果編寫編寫用到堆棧用到堆棧的匯的匯編語言程序編語言程序,一定要,一定要注意注意正確使用這兩個寄存器正確使用這兩個寄存器。用用-stack連接選項連接選項可以可以指定軟件堆棧的大小指定軟件堆
33、棧的大小,用用C編寫編寫DSP程序程序一定注意保留足夠的堆??臻g!一定注意保留足夠的堆棧空間!35注意:注意:編譯器編譯器不會檢查不會檢查堆棧溢出情況,堆棧溢出情況,堆棧溢出會破壞堆棧溢出會破壞DSP運行環(huán)境,導(dǎo)致程序失敗。編寫運行環(huán)境,導(dǎo)致程序失敗。編寫DSP程序和配置程序和配置DSP存儲器存儲器資源要注意防止堆棧溢出的發(fā)生。資源要注意防止堆棧溢出的發(fā)生。2. 2. 寄存器規(guī)則寄存器規(guī)則TMS320 DSP 運行環(huán)境對寄存器的使用有運行環(huán)境對寄存器的使用有嚴(yán)格的規(guī)則嚴(yán)格的規(guī)則,如果編,如果編寫寫涉及到寄存器的匯編程序涉及到寄存器的匯編程序,必須嚴(yán)格遵守規(guī)則,否則可能,必須嚴(yán)格遵守規(guī)則,否則可
34、能系統(tǒng)工作異常。系統(tǒng)工作異常。寄存器規(guī)則寄存器規(guī)則規(guī)定了編譯器規(guī)定了編譯器如何使用寄存器和寄存器在函數(shù)調(diào)用如何使用寄存器和寄存器在函數(shù)調(diào)用的過程中如何進行保護。的過程中如何進行保護。36寄存器按保護方式寄存器按保護方式分為兩種分為兩種:n 調(diào)用保存調(diào)用保存(save on call),),調(diào)用其它函數(shù)的調(diào)用其它函數(shù)的函數(shù)函數(shù)負(fù)責(zé)負(fù)責(zé)保存這些寄存器的內(nèi)容。保存這些寄存器的內(nèi)容。n 入口保存入口保存(save on entry),),被調(diào)用的函數(shù)負(fù)責(zé)保存被調(diào)用的函數(shù)負(fù)責(zé)保存這些寄存器的內(nèi)容。這些寄存器的內(nèi)容。注:注:無論是否使用優(yōu)化編譯,都必須遵守這些寄存器規(guī)無論是否使用優(yōu)化編譯,都必須遵守這些寄
35、存器規(guī)則。則。37寄存器寄存器用途用途調(diào)用時保護調(diào)用時保護AR0幀指針(幀指針(FP)YesAR1堆棧指針(堆棧指針(SP)YesAR2局部變量指針(局部變量指針(LVP)NoAR3-AR5表達(dá)式運算表達(dá)式運算NoAR6-AR7寄存器變量寄存器變量YesAccumulator表達(dá)式運算返回值表達(dá)式運算返回值No 寄存器的使用和保護寄存器的使用和保護38 狀態(tài)寄存器(狀態(tài)寄存器(ST0、ST1)單元單元對于有假定值(為0或為1)的狀態(tài)寄存器單元,在進行函數(shù)調(diào)用和函數(shù)返回時必須保證其值為假定值。單元單元名稱名稱假定值假定值A(chǔ)RP輔助寄存器指針輔助寄存器指針1C進位標(biāo)志進位標(biāo)志-DP數(shù)據(jù)頁數(shù)據(jù)頁-O
36、V溢出標(biāo)值溢出標(biāo)值-OVM溢出模式溢出模式0PM乘法移位模式乘法移位模式0SXM符號擴展模式符號擴展模式-TC測試模式測試模式-393個寄存器個寄存器堆棧指針(堆棧指針(SP)、幀指針()、幀指針(FP)和局部變)和局部變量指針(量指針(LVP)管理堆棧和局部幀。)管理堆棧和局部幀。AR6、AR7作為寄存器變量的寄存器。作為寄存器變量的寄存器。AR6被分配給第一被分配給第一個變量,個變量,AR7分配給第二個變量。分配給第二個變量。 編譯器使用不用于寄存器變量的寄存器來計算表達(dá)式的值編譯器使用不用于寄存器變量的寄存器來計算表達(dá)式的值并保存臨時結(jié)果。并保存臨時結(jié)果。 40當(dāng)函數(shù)的返回值是一個標(biāo)量類
37、型(整型、指針或浮點型)時,當(dāng)函數(shù)的返回值是一個標(biāo)量類型(整型、指針或浮點型)時,該值在函數(shù)返回時被放入累加器中。該值在函數(shù)返回時被放入累加器中。16位的數(shù)據(jù)類型(字符型、短整型、整型或指針型)連同正位的數(shù)據(jù)類型(字符型、短整型、整型或指針型)連同正確的符號擴展被裝載到累加器中。確的符號擴展被裝載到累加器中。3. 函數(shù)結(jié)構(gòu)和調(diào)用規(guī)則函數(shù)結(jié)構(gòu)和調(diào)用規(guī)則C編譯器對函數(shù)的調(diào)用有一系列嚴(yán)格的規(guī)定。編譯器對函數(shù)的調(diào)用有一系列嚴(yán)格的規(guī)定。除了除了特殊的運特殊的運行支持函數(shù)外,任何調(diào)用者函數(shù)和被調(diào)用函數(shù)行支持函數(shù)外,任何調(diào)用者函數(shù)和被調(diào)用函數(shù)都要遵守這些都要遵守這些規(guī)則規(guī)則,否則,否則可能會破壞可能會破壞C
38、環(huán)境并導(dǎo)致程序失敗環(huán)境并導(dǎo)致程序失敗。 41(1)函數(shù)如何產(chǎn)生調(diào)用)函數(shù)如何產(chǎn)生調(diào)用一個函數(shù)(調(diào)用者函數(shù))在調(diào)用其他函數(shù)(子函數(shù))時一個函數(shù)(調(diào)用者函數(shù))在調(diào)用其他函數(shù)(子函數(shù))時執(zhí)行以下任務(wù)。注意,執(zhí)行以下任務(wù)。注意,ARP必須設(shè)置為必須設(shè)置為1。a. 調(diào)用者函數(shù)將參數(shù)以調(diào)用者函數(shù)將參數(shù)以顛倒的順序顛倒的順序壓入堆棧(最右邊聲明的壓入堆棧(最右邊聲明的參數(shù)第一個壓入堆棧,最左邊的參數(shù)最后一個壓入堆參數(shù)第一個壓入堆棧,最左邊的參數(shù)最后一個壓入堆棧)。即函數(shù)調(diào)用時,最左邊的參數(shù)放在棧頂單元。棧)。即函數(shù)調(diào)用時,最左邊的參數(shù)放在棧頂單元。b. 調(diào)用者函數(shù)調(diào)用子函數(shù)。調(diào)用者函數(shù)調(diào)用子函數(shù)。c. 調(diào)用
39、者函數(shù)假定當(dāng)子函數(shù)執(zhí)行完成返回時,調(diào)用者函數(shù)假定當(dāng)子函數(shù)執(zhí)行完成返回時,ARP將被置為將被置為1。d. 完成調(diào)用后,調(diào)用者函數(shù)將參數(shù)彈出堆棧。完成調(diào)用后,調(diào)用者函數(shù)將參數(shù)彈出堆棧。42(2)被調(diào)用函數(shù)如何響應(yīng))被調(diào)用函數(shù)如何響應(yīng) a. 將返回地址從硬件堆棧中彈出,壓入軟件堆棧。將返回地址從硬件堆棧中彈出,壓入軟件堆棧。 b. 將將FP壓入軟件堆棧。壓入軟件堆棧。 c. 分配局部幀。分配局部幀。 d. 如果函數(shù)修改了如果函數(shù)修改了AR6和和AR7,則將它們壓入堆棧,其他的,則將它們壓入堆棧,其他的任何寄存器可以不用保存,任意修改。任何寄存器可以不用保存,任意修改。43e. 實現(xiàn)函數(shù)功能。實現(xiàn)函數(shù)
40、功能。f. 如果函數(shù)返回標(biāo)量數(shù)據(jù),將它放入累加器。如果函數(shù)返回標(biāo)量數(shù)據(jù),將它放入累加器。g. 將將ARP設(shè)定為設(shè)定為AR1。h. 如果保護了如果保護了AR6、AR7,恢復(fù)這兩個寄存器。,恢復(fù)這兩個寄存器。i. 刪除局部幀。刪除局部幀。j. 恢復(fù)恢復(fù)FP。k. 從軟件堆棧中彈出返回地址并壓入硬件堆棧。從軟件堆棧中彈出返回地址并壓入硬件堆棧。l. 返回。返回。44(3 3)被調(diào)用的函數(shù)的)被調(diào)用的函數(shù)的三種三種特殊情況特殊情況 a. a. 返回的是一個結(jié)構(gòu)體:當(dāng)函數(shù)的返回值為一個結(jié)構(gòu)返回的是一個結(jié)構(gòu)體:當(dāng)函數(shù)的返回值為一個結(jié)構(gòu)時,調(diào)用者函數(shù)負(fù)責(zé)分配存儲空間,并將存儲空間地址作為時,調(diào)用者函數(shù)負(fù)責(zé)分
41、配存儲空間,并將存儲空間地址作為最后一個輸入?yún)?shù)傳遞給被調(diào)用函數(shù)。被調(diào)用函數(shù)將要返回最后一個輸入?yún)?shù)傳遞給被調(diào)用函數(shù)。被調(diào)用函數(shù)將要返回的結(jié)構(gòu)拷貝到這個參數(shù)所指向的內(nèi)存空間。的結(jié)構(gòu)拷貝到這個參數(shù)所指向的內(nèi)存空間。 b. b. 不將返回地址移到軟件堆棧中:當(dāng)被調(diào)用函數(shù)不再不將返回地址移到軟件堆棧中:當(dāng)被調(diào)用函數(shù)不再調(diào)用其它函數(shù),或者確定調(diào)用深度不會超過調(diào)用其它函數(shù),或者確定調(diào)用深度不會超過8 8級,可以不用將級,可以不用將返回地址移動到軟件堆棧。返回地址移動到軟件堆棧。 c.c.不分配局部幀:如果函數(shù)沒有輸入?yún)?shù),不使用局部不分配局部幀:如果函數(shù)沒有輸入?yún)?shù),不使用局部變量,就不需要修改變量,就
42、不需要修改AR0AR0(FPFP),因此也不需要對其進行保),因此也不需要對其進行保護。護。45調(diào)用者調(diào)用者局部幀局部幀F(xiàn)PSP調(diào)用前調(diào)用前調(diào)用者調(diào)用者局部幀局部幀F(xiàn)PSP參數(shù)參數(shù)n.參數(shù)參數(shù)1返回地址返回地址壓入?yún)?shù)壓入?yún)?shù)調(diào)用函數(shù)調(diào)用函數(shù)調(diào)用者調(diào)用者局部幀局部幀原原FP參數(shù)參數(shù)n.參數(shù)參數(shù)1返回地址返回地址分配局部幀分配局部幀原原FP暫存單元暫存單元局部幀局部幀F(xiàn)PSP4615.3.2 C15.3.2 C語言調(diào)用匯編函數(shù)語言調(diào)用匯編函數(shù) a. 無論是無論是C函數(shù)還是匯編語言的所有函數(shù),都函數(shù)還是匯編語言的所有函數(shù),都必須遵循寄存器必須遵循寄存器規(guī)則規(guī)則。b. 必須保存被函數(shù)修改的任何專用寄
43、存器,包括:必須保存被函數(shù)修改的任何專用寄存器,包括:AR0(FP)、)、AR1(SP)、)、AR6、AR7。如果正常使用堆棧,如果正常使用堆棧,則不必明確保存則不必明確保存SP。也就是說,用戶可以自由地使用堆也就是說,用戶可以自由地使用堆棧,彈出被壓入的所有內(nèi)容。用戶可以自由使用所有其他棧,彈出被壓入的所有內(nèi)容。用戶可以自由使用所有其他的寄存器,而不必保留它們的內(nèi)容。的寄存器,而不必保留它們的內(nèi)容。47c. 如果改變了任何一個寄存器位域狀態(tài)的假定值,則必須確保如果改變了任何一個寄存器位域狀態(tài)的假定值,則必須確保恢復(fù)其假定值。尤其注意恢復(fù)其假定值。尤其注意ARP應(yīng)該被指定為應(yīng)該被指定為AR1。
44、d. 中斷子程序必須保存所有使用的寄存器。中斷子程序必須保存所有使用的寄存器。e. 在從匯編語言中調(diào)用在從匯編語言中調(diào)用C函數(shù)時,將參數(shù)以倒序壓入堆棧,函數(shù)函數(shù)時,將參數(shù)以倒序壓入堆棧,函數(shù)調(diào)用后彈出堆棧。調(diào)用后彈出堆棧。f. 調(diào)用調(diào)用C函數(shù)時,只有專用的寄存器內(nèi)容被保留,函數(shù)時,只有專用的寄存器內(nèi)容被保留,C函數(shù)可以改函數(shù)可以改變其他任何寄存器的內(nèi)容。變其他任何寄存器的內(nèi)容。g. 函數(shù)必須返回累加器中的值。函數(shù)必須返回累加器中的值。h. 匯編模塊使用匯編模塊使用.cinit段只能用于全局變量的初始化。段只能用于全局變量的初始化。boot.c中中的啟動子程序假定的啟動子程序假定.cinit段完
45、全是由初始化表組成。在段完全是由初始化表組成。在.cinit段段中放入其他的信息會破壞初始化表而導(dǎo)致無法預(yù)知的后果。中放入其他的信息會破壞初始化表而導(dǎo)致無法預(yù)知的后果。48i.編譯器將在所有的編譯器將在所有的C語言對象標(biāo)識符的開頭語言對象標(biāo)識符的開頭添加下劃線添加下劃線“_”。在。在C語言中和匯編語言都要語言中和匯編語言都要訪問的對象訪問的對象必須在匯編必須在匯編語言中以語言中以下劃線下劃線“_”作為前綴。作為前綴。例如,例如,C語言中名為語言中名為x的對象在匯編語言中為的對象在匯編語言中為_x。僅在。僅在匯編語匯編語言言模塊中使用的對象模塊中使用的對象可以使用不加下劃線可以使用不加下劃線的標(biāo)
46、識符,不會的標(biāo)識符,不會和和C語言中的標(biāo)識符發(fā)生沖突。語言中的標(biāo)識符發(fā)生沖突。j. 在在C中被訪問的任何匯編語言對象或在中被訪問的任何匯編語言對象或在C中被調(diào)用的任何匯編中被調(diào)用的任何匯編語言函數(shù)必須在匯編代碼中使用語言函數(shù)必須在匯編代碼中使用.global偽指令聲明偽指令聲明。這。這將聲明該符號是外部的,允許鏈接器解決對它的引用。將聲明該符號是外部的,允許鏈接器解決對它的引用。4915.3.3 15.3.3 內(nèi)嵌匯編語句內(nèi)嵌匯編語句 在在TMS320C2000 C語言中,可以語言中,可以使用使用asm語句語句在編譯器產(chǎn)生在編譯器產(chǎn)生的匯編語言文件中嵌入單行的匯編語句。的匯編語言文件中嵌入單行
47、的匯編語句。一系列的一系列的asm語語句句可以將順序的匯編語句插入到編譯器的輸出代碼中可以將順序的匯編語句插入到編譯器的輸出代碼中。使用中的幾點注意事項:使用中的幾點注意事項:a. asm語句語句使用戶可以訪問某些用使用戶可以訪問某些用C語句無法訪問語句無法訪問的硬件特性。的硬件特性。b. 在使用在使用asm語句的時候,語句的時候,要防止破壞要防止破壞C環(huán)境環(huán)境。編譯器不會對。編譯器不會對嵌入的代碼嵌入的代碼進行檢查和分析。進行檢查和分析。c. 在在asm語句中語句中使用跳轉(zhuǎn)語句使用跳轉(zhuǎn)語句或或標(biāo)記符標(biāo)記符(LABEL)可能會產(chǎn))可能會產(chǎn)生生無法預(yù)知的結(jié)果無法預(yù)知的結(jié)果。50d. 不要改變不要
48、改變C變量的值,但可以安全地讀取任何變量的當(dāng)前值。變量的值,但可以安全地讀取任何變量的當(dāng)前值。e. 不要使用不要使用asm語句嵌入語句嵌入?yún)R編匯編偽指令偽指令,這會,這會破壞破壞匯編語言環(huán)境。匯編語言環(huán)境。f. 在編譯器的輸出代碼中在編譯器的輸出代碼中嵌入注釋嵌入注釋時,時,asm語句是很有用的語句是很有用的??梢杂眯翘枺梢杂眯翘枺?)作為匯編代碼的開頭,)作為匯編代碼的開頭,例如:例如:asm (“ * this is an assembly language comment.”);51f. f. 調(diào)用調(diào)用C C函數(shù)時,只有專用的寄存器內(nèi)容被保留,函數(shù)時,只有專用的寄存器內(nèi)容被保留,C C
49、函數(shù)可以函數(shù)可以改變其他任何寄存器的內(nèi)容。改變其他任何寄存器的內(nèi)容。g. g. 函數(shù)必須返回累加器中的值函數(shù)必須返回累加器中的值。h. h. 匯編模塊使用匯編模塊使用. .cinitcinit段段只能用于全局變量的初始化。只能用于全局變量的初始化。boot.cboot.c中的啟動子程序假定中的啟動子程序假定. .cinitcinit段完全是由初始化表組段完全是由初始化表組成。在成。在. .cinitcinit段中放入其他的信息會破壞初始化表而導(dǎo)致段中放入其他的信息會破壞初始化表而導(dǎo)致無法預(yù)知的后果。無法預(yù)知的后果。52i i 編譯器將在所有的編譯器將在所有的C C語言對象標(biāo)識符的開頭添加下劃線
50、語言對象標(biāo)識符的開頭添加下劃線“_”_”。在。在C C語言中和匯編語言語言中和匯編語言都要訪問的對象都要訪問的對象必須在匯必須在匯編語言中以下劃線編語言中以下劃線“_”_”作為前綴作為前綴。例如,例如,C C語言中名為語言中名為x x的對象在匯編語言中為的對象在匯編語言中為_x_x。僅在匯編語僅在匯編語言模塊中使用的對象可以使用不加下劃線的標(biāo)識符,不言模塊中使用的對象可以使用不加下劃線的標(biāo)識符,不會和會和C C語言中的標(biāo)識符發(fā)生沖突。語言中的標(biāo)識符發(fā)生沖突。j.j. 在在C C中被訪問的任何匯編語言對象或中被訪問的任何匯編語言對象或在在C C中被調(diào)用的任何匯中被調(diào)用的任何匯編語言函數(shù)編語言函數(shù)
51、必須在匯編代碼中使用必須在匯編代碼中使用.global.global偽指令聲明偽指令聲明。這將聲明該符號是外部的,允許鏈接器解決對它的引用。這將聲明該符號是外部的,允許鏈接器解決對它的引用。5315.3.4 C15.3.4 C程序訪問匯編程序變量程序訪問匯編程序變量 有時需在有時需在C程序中訪問匯編語言變量,這通常有兩種方式來程序中訪問匯編語言變量,這通常有兩種方式來訪問訪問.bss塊中的變量:塊中的變量:(1)將要訪問的變量定義在)將要訪問的變量定義在.bss塊中。塊中。(2)用)用.golbal修飾要訪問的變量。修飾要訪問的變量。在在匯編語言匯編語言中以下中以下橫線橫線“_”為前綴為前綴聲
52、明要訪問的變量。聲明要訪問的變量。在在C語言中語言中將將變量聲明變量聲明為外部變量(為外部變量(extern),),就可以進就可以進行正常訪問。行正常訪問。例如:例如:54如何訪問非如何訪問非.bss塊中的變量:塊中的變量: 要訪問要訪問非非.bss塊塊中的變量,通常的辦法是在匯編語言中中的變量,通常的辦法是在匯編語言中定義一個查找表定義一個查找表,然后在,然后在C語言中語言中通過指針通過指針來訪問來訪問。 首先首先定義變量定義變量,而且,而且最好放在獨立的初始化塊中。最好放在獨立的初始化塊中。定義定義一個全局的標(biāo)識指向?qū)ο蟮钠鹗键c,這樣對象可以分配在一個全局的標(biāo)識指向?qū)ο蟮钠鹗键c,這樣對象可
53、以分配在存儲器空間的任何位置。存儲器空間的任何位置。55 在在C C程序中將這個對象程序中將這個對象定義為定義為外部對象(外部對象(externextern),),并并且對象名稱且對象名稱不帶下橫線不帶下橫線“_”“_”前綴前綴,就可以對其進行正常訪,就可以對其進行正常訪問。問。5615.3.5 15.3.5 修改修改C C編譯器的輸出編譯器的輸出 用戶可以編譯源程序,然后在匯編前對編譯輸出的匯編語言代用戶可以編譯源程序,然后在匯編前對編譯輸出的匯編語言代碼進行手動檢查和修改。碼進行手動檢查和修改。這種情況下,在這種情況下,在C代碼中利用代碼中利用asm語句語句插入適當(dāng)?shù)淖⑨尣迦脒m當(dāng)?shù)淖⑨寣?/p>
54、理解理解C編譯器編譯器輸出的匯編語言代碼輸出的匯編語言代碼是非常有幫助的。是非常有幫助的。15.4 15.4 運行支持函數(shù)(運行支持函數(shù)(rtsrts)一個一個C程序所執(zhí)行的一些任務(wù)(如輸入輸出、動態(tài)存儲器配程序所執(zhí)行的一些任務(wù)(如輸入輸出、動態(tài)存儲器配置、字符串操作以及三角函數(shù)等)。置、字符串操作以及三角函數(shù)等)。TMS320C2000 C編譯器提供編譯器提供ANSI的的標(biāo)準(zhǔn)庫標(biāo)準(zhǔn)庫。使用。使用ANSI的標(biāo)的標(biāo)準(zhǔn)庫可準(zhǔn)庫可確保有一套統(tǒng)一的函數(shù)確保有一套統(tǒng)一的函數(shù)。57a. rts2xx.lib:運行期支持目標(biāo)庫:運行期支持目標(biāo)庫,包含:,包含: ANSI C ANSI C標(biāo)準(zhǔn)庫標(biāo)準(zhǔn)庫 系統(tǒng)啟
55、動程序系統(tǒng)啟動程序_c_int0_c_int0 允許允許C C訪問特殊指令的函數(shù)和宏訪問特殊指令的函數(shù)和宏b. rts.src:運行期支持資源庫:運行期支持資源庫。包含:包含: 運行期支持目標(biāo)庫的運行期支持目標(biāo)庫的C語言和匯編語言程序源代碼。語言和匯編語言程序源代碼。15.5 15.5 常用數(shù)字信號處理程序常用數(shù)字信號處理程序FFT、FIR等,最好用匯編語言實現(xiàn),有豐富的資料可供參考。等,最好用匯編語言實現(xiàn),有豐富的資料可供參考。5815.6 15.6 閃存編程閃存編程程序編寫、調(diào)試完成后,需程序編寫、調(diào)試完成后,需將編譯、鏈接將編譯、鏈接所得到的所得到的可執(zhí)行文可執(zhí)行文件(件(.out)燒寫
56、到燒寫到DSP的程序存儲器中,使的程序存儲器中,使DSP可可擺脫擺脫開發(fā)系統(tǒng)運行開發(fā)系統(tǒng)運行。對對TMS320LF2407而言,應(yīng)該而言,應(yīng)該可執(zhí)行文件可執(zhí)行文件燒寫到片內(nèi)部閃存燒寫到片內(nèi)部閃存中。中。59燒寫燒寫DSPDSP程序要程序要利用利用硬件仿真器硬件仿真器實現(xiàn)實現(xiàn),仿真器制造商會提供,仿真器制造商會提供相相應(yīng)的燒寫程序應(yīng)的燒寫程序。注意注意: :不同型號不同型號DSPDSP往往使用往往使用不同不同的燒寫程序,不同類型的仿真的燒寫程序,不同類型的仿真器對器對燒寫環(huán)境燒寫環(huán)境也會有不同的要求也會有不同的要求,使用前要詳細(xì)閱讀相應(yīng),使用前要詳細(xì)閱讀相應(yīng)說明(說明(readmereadme)
57、。)。MP/MCMP/MC* *為低,置為為低,置為微計算機微計算機模式模式仿真仿真RAMRAM不被不被PSPS* *信號選中信號選中60DSP燒寫步驟:燒寫步驟:n 清除清除Flash內(nèi)容內(nèi)容(bc0.bat, bc1.bat)將將FLASH中的中的所有所有 位位清清0。n 擦除擦除Flash內(nèi)容內(nèi)容(be0.bat, be1.bat) 將將Flash中的中的所有位所有位 置置1。n 把目標(biāo)程序?qū)戇M把目標(biāo)程序?qū)戇MFlash中中(bp16k.bat, bp32k.bat)將將 Flash中的中的所有所有選中選中的位的位清清0(set to 0)。)。61寫入程序?qū)懭氤绦颡毩⑦\行獨立運行的結(jié)果往
58、往與仿真的狀態(tài)的結(jié)果往往與仿真的狀態(tài)有差異有差異,甚至可能,甚至可能不能正常運行,這是由于不能正常運行,這是由于仿真過程中的程序運行情況仿真過程中的程序運行情況和和DSP獨立運行時的程序運行情況獨立運行時的程序運行情況不同不同所引起。所引起。在將程序編程到在將程序編程到DSP內(nèi)部之前,為保證正常運行,需考慮以下內(nèi)部之前,為保證正常運行,需考慮以下問題:問題:(1 1)電路元件初始化同步問題)電路元件初始化同步問題由于外部元件初始化可能較慢,由于外部元件初始化可能較慢,DSP初始化完成后要延時一段初始化完成后要延時一段時間再訪問外部慢速器件,通常要在控制程序的時間再訪問外部慢速器件,通常要在控制
59、程序的主函數(shù)主函數(shù)中中添添加一段循環(huán)延時程序加一段循環(huán)延時程序。62(2)用仿真器調(diào)試,程序執(zhí)行較慢,)用仿真器調(diào)試,程序執(zhí)行較慢,循環(huán)時間循環(huán)時間比較長,而燒寫比較長,而燒寫到到DSP中可能時間較短,要中可能時間較短,要對循環(huán)程序的對循環(huán)程序的循環(huán)次數(shù)循環(huán)次數(shù)重新考慮。重新考慮。(3)用仿真器調(diào)試,)用仿真器調(diào)試,DSP運行的一些資源(如堆棧等)用的是運行的一些資源(如堆棧等)用的是仿真器中的資源,燒寫到仿真器中的資源,燒寫到DSP中執(zhí)行必須利用中執(zhí)行必須利用DSP本身的資本身的資源,源,燒寫前燒寫前必須對必須對鏈接命令文件(鏈接命令文件(.cmd文件)文件)中定義的中定義的各種各種資源資源
60、進行詳細(xì)考慮。進行詳細(xì)考慮。(4)浮點數(shù)運算的問題)浮點數(shù)運算的問題 浮點型變量浮點型變量考慮使用全局變量考慮使用全局變量,因為,因為局部變量局部變量都是都是在堆棧在堆棧里生成的里生成的,過多的浮點數(shù)變量過多的浮點數(shù)變量對對軟件堆棧要求太多軟件堆棧要求太多,容易造,容易造成成堆棧溢出堆棧溢出問題。問題。63(5)復(fù)位問題)復(fù)位問題利用仿真器進行調(diào)試的時候,利用仿真器進行調(diào)試的時候,DSP程序通過程序通過仿真環(huán)境啟動,不仿真環(huán)境啟動,不需要復(fù)位信號需要復(fù)位信號;而而閃存編程后閃存編程后DSP的運行中,的運行中,復(fù)位復(fù)位要通過電路板上要通過電路板上復(fù)位電路復(fù)位電路來來實現(xiàn),實現(xiàn),如果如果電路板上復(fù)位電路有
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度地質(zhì)災(zāi)害防治安全承包合同范本2篇
- 2025年度老舊廠房拆除重建項目轉(zhuǎn)讓合同3篇
- 二零二五版UPS不間斷電源系統(tǒng)在數(shù)據(jù)中心節(jié)能改造中的應(yīng)用合同3篇
- 二零二五年度食品安全樣本檢驗合同2篇
- 2025年度物業(yè)管理委托合同(住宅小區(qū))3篇
- 三方監(jiān)理服務(wù)協(xié)議:2024年度工程監(jiān)管協(xié)議版B版
- 二零二五版公司銷售業(yè)務(wù)員合同協(xié)議書含虛擬貨幣交易業(yè)務(wù)合作3篇
- 2024年轎車物流服務(wù)協(xié)議模板版B版
- 2024煙花爆竹行業(yè)信用風(fēng)險防范購銷合同管理3篇
- 二零二五版廠房轉(zhuǎn)租及物業(yè)管理合同6篇
- 2025年山東光明電力服務(wù)公司招聘筆試參考題庫含答案解析
- 《神經(jīng)發(fā)展障礙 兒童社交溝通障礙康復(fù)規(guī)范》
- 詩詞接龍(飛花令)PPT
- 子宮內(nèi)膜癌(課堂PPT)
- 澳大利亞公司法1-30
- 海上試油測試技術(shù)0327
- 中國地圖標(biāo)準(zhǔn)版(可編輯顏色)
- 瑪氏銷售常用術(shù)語中英對照
- (完整)貓咪上門喂養(yǎng)服務(wù)協(xié)議書
- 上海牛津版三年級英語3B期末試卷及答案(共5頁)
- 行為疼痛量表BPS
評論
0/150
提交評論