![DSP的C語(yǔ)言編程技術(shù)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-7/4/9d5128a3-15e1-4d27-8fc4-1deefe3257c3/9d5128a3-15e1-4d27-8fc4-1deefe3257c31.gif)
![DSP的C語(yǔ)言編程技術(shù)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-7/4/9d5128a3-15e1-4d27-8fc4-1deefe3257c3/9d5128a3-15e1-4d27-8fc4-1deefe3257c32.gif)
![DSP的C語(yǔ)言編程技術(shù)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-7/4/9d5128a3-15e1-4d27-8fc4-1deefe3257c3/9d5128a3-15e1-4d27-8fc4-1deefe3257c33.gif)
![DSP的C語(yǔ)言編程技術(shù)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-7/4/9d5128a3-15e1-4d27-8fc4-1deefe3257c3/9d5128a3-15e1-4d27-8fc4-1deefe3257c34.gif)
![DSP的C語(yǔ)言編程技術(shù)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-7/4/9d5128a3-15e1-4d27-8fc4-1deefe3257c3/9d5128a3-15e1-4d27-8fc4-1deefe3257c35.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1第第15章章 DSP的的C語(yǔ)言編程語(yǔ)言編程215.1 DSP C語(yǔ)言簡(jiǎn)介語(yǔ)言簡(jiǎn)介 軟件開(kāi)發(fā)平臺(tái)為軟件開(kāi)發(fā)平臺(tái)為CCS。CCS提供了提供了優(yōu)化的優(yōu)化的C編譯器編譯器,優(yōu)化編譯結(jié)果達(dá)手工編寫(xiě)的,優(yōu)化編譯結(jié)果達(dá)手工編寫(xiě)的90%以上。以上。廠商和相關(guān)公司也在廠商和相關(guān)公司也在不斷對(duì)不斷對(duì)C優(yōu)化編譯器優(yōu)化編譯器進(jìn)行改進(jìn)進(jìn)行改進(jìn).相信相信C語(yǔ)言程序優(yōu)化編譯的效果語(yǔ)言程序優(yōu)化編譯的效果會(huì)有進(jìn)一步會(huì)有進(jìn)一步改善。改善。3C C編譯器編譯器支持支持ANSI CANSI C語(yǔ)言標(biāo)準(zhǔn)。(語(yǔ)言標(biāo)準(zhǔn)。(ANSI-ANSI-American National American National Standards In
2、stituteStandards Institute,美國(guó)國(guó)家標(biāo)準(zhǔn)委員會(huì)),美國(guó)國(guó)家標(biāo)準(zhǔn)委員會(huì))ANSIANSIC C 標(biāo)準(zhǔn)具有一些標(biāo)準(zhǔn)具有一些受目標(biāo)處理器、運(yùn)行期環(huán)境或主機(jī)環(huán)境影受目標(biāo)處理器、運(yùn)行期環(huán)境或主機(jī)環(huán)境影響的響的C C語(yǔ)言特性語(yǔ)言特性,這些特性,這些特性在各種標(biāo)準(zhǔn)的在各種標(biāo)準(zhǔn)的C C編譯器編譯器之間可能有之間可能有不同不同。 415.2 DSP C語(yǔ)言特性語(yǔ)言特性 15.2.1 TMS320C2000 C語(yǔ)言的特征語(yǔ)言的特征(1)標(biāo)識(shí)符和常數(shù))標(biāo)識(shí)符和常數(shù)所有標(biāo)識(shí)符的所有標(biāo)識(shí)符的前前100個(gè)字符有意義個(gè)字符有意義,區(qū)分區(qū)分大小寫(xiě)大小寫(xiě)。字符集為。字符集為ASCII碼,不存在多字節(jié)字
3、符。碼,不存在多字節(jié)字符。具有具有多個(gè)字符的多個(gè)字符的字符常數(shù)字符常數(shù)按序列中最后一個(gè)字符來(lái)編碼,例如:按序列中最后一個(gè)字符來(lái)編碼,例如:abc = = c(2)數(shù)據(jù)轉(zhuǎn)換)數(shù)據(jù)轉(zhuǎn)換5浮點(diǎn)到整數(shù)浮點(diǎn)到整數(shù)的的轉(zhuǎn)換,轉(zhuǎn)換,取整數(shù)取整數(shù)部分。部分。指針和整數(shù)可以自由轉(zhuǎn)換。指針和整數(shù)可以自由轉(zhuǎn)換。(3 3)表達(dá)式)表達(dá)式當(dāng)兩個(gè)有符號(hào)整數(shù)相除時(shí),若其中一個(gè)為負(fù),則其商為負(fù),當(dāng)兩個(gè)有符號(hào)整數(shù)相除時(shí),若其中一個(gè)為負(fù),則其商為負(fù),余數(shù)的符號(hào)與分子的符號(hào)相同余數(shù)的符號(hào)與分子的符號(hào)相同。n斜杠(斜杠(/)用來(lái))用來(lái)求商求商,例如:,例如:10/-3 = -3,-10/3 = -3,n百分號(hào)(百分號(hào)(%)用來(lái)求)用
4、來(lái)求余數(shù)余數(shù),例如:,例如:10%-3 = 1,-10%3 = -16(4)聲明)聲明寄存器變量對(duì)所有寄存器變量對(duì)所有char,short,int和指針類(lèi)型有效。和指針類(lèi)型有效。關(guān)鍵字關(guān)鍵字interrupt僅可用于僅可用于無(wú)參量的無(wú)參量的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語(yǔ)言的數(shù)據(jù)類(lèi)型語(yǔ)言
5、的數(shù)據(jù)類(lèi)型注:在注:在TMS320C2x/C2xx/C5x CTMS320C2x/C2xx/C5x C語(yǔ)言中,字節(jié)長(zhǎng)度為語(yǔ)言中,字節(jié)長(zhǎng)度為1616位,位,sizeofsizeof操作符返回操作符返回的對(duì)象長(zhǎng)度是以的對(duì)象長(zhǎng)度是以1616位為字節(jié)長(zhǎng)度的字節(jié)數(shù)。例如位為字節(jié)長(zhǎng)度的字節(jié)數(shù)。例如sizeof(intsizeof(int) = 1) = 1。815.2.3 TMS320C2000 C語(yǔ)言的語(yǔ)言的關(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 寄存器變量寄存器變量一個(gè)函數(shù)一個(gè)函數(shù)中中最多可使用最多可使用兩個(gè)兩個(gè)寄存器變量寄存器變量。寄存器變量寄存器變量聲明聲明必須必須在在變量列表變量列表或或函數(shù)函數(shù)的起始處的起始處進(jìn)行,在嵌套進(jìn)行,在嵌套塊中聲明的寄存器變量被處理為塊中聲明的寄存器變量被處理為一般的變量一般的變量。編譯器編譯器使用使用AR6AR6和和AR7AR7作為寄存器變量:作為寄存器變量:AR6AR6被賦給被賦給第一個(gè)寄存器變量第一個(gè)寄存器變量AR7AR7被賦給被賦給第二個(gè)寄存器變量第二個(gè)寄存器變量寄存器變量寄存器變量的地址的地址會(huì)被放入分配的寄存器中,這樣會(huì)被放入分配的寄存器中,這樣變量的訪(fǎng)問(wèn)變量的訪(fǎng)問(wèn)速
7、度會(huì)更快速度會(huì)更快。101616位類(lèi)型變量位類(lèi)型變量(charchar、shortshort、intint和指針)都可被和指針)都可被定義定義為為寄存寄存器變量器變量。但在運(yùn)行時(shí),但在運(yùn)行時(shí),設(shè)置一個(gè)寄存器變量設(shè)置一個(gè)寄存器變量大約需要大約需要4 4條指令條指令,為了更,為了更有效地使用這個(gè)功能,有效地使用這個(gè)功能,僅當(dāng)變量?jī)H當(dāng)變量被訪(fǎng)問(wèn)被訪(fǎng)問(wèn)超過(guò)超過(guò)2 2次次時(shí)時(shí),才使用,才使用寄存器變量。寄存器變量。程序優(yōu)化編譯器程序優(yōu)化編譯器也會(huì)也會(huì)定義寄存器變量定義寄存器變量,但方式不同。編譯器會(huì),但方式不同。編譯器會(huì)自己決定自己決定哪些變量哪些變量作為寄存器變量作為寄存器變量,程序中聲明的寄存器變,
8、程序中聲明的寄存器變量會(huì)全部量會(huì)全部被忽略被忽略。寄存器變量寄存器變量聲明的格式為:聲明的格式為: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 該偽指令在名稱(chēng)為該偽指令在名稱(chēng)為section namesection name的的命名段命名段中中為為symbolsymbol分分配空間配空間。語(yǔ)法為。語(yǔ)法為:12 # #pragmapragma CODE_SECTION (symbol, “section name”); CODE_SECTION (symbol, “section name”);2. DATA_SECTION2. DATA_SECTION為名稱(chēng)為為名稱(chēng)為section namesection name的的命名段命名段中為中為symbol
10、symbol分配空間分配空間。語(yǔ)語(yǔ)法為:法為: # #pragmapragma DATA_SECTION (symbol, “section name”); DATA_SECTION (symbol, “section name”);3. FUNC_EXT_CALLED3. FUNC_EXT_CALLED當(dāng)使用當(dāng)使用-pm-pm選項(xiàng)選項(xiàng)時(shí),編譯器將時(shí),編譯器將使用使用程序級(jí)的優(yōu)化程序級(jí)的優(yōu)化。編譯器將。編譯器將刪除刪除所有所有未被未被mainmain函數(shù)函數(shù)直接或直接或間接調(diào)用間接調(diào)用的函數(shù)的函數(shù)。13而用戶(hù)程序里而用戶(hù)程序里可能包含可能包含要被手工編寫(xiě)的匯編語(yǔ)言程序調(diào)用而沒(méi)要被手工編寫(xiě)的匯編
11、語(yǔ)言程序調(diào)用而沒(méi)有被有被mainmain函數(shù)調(diào)用的函數(shù)函數(shù)調(diào)用的函數(shù),這時(shí)就應(yīng)該用,這時(shí)就應(yīng)該用FUNC_EXT_CALLEDFUNC_EXT_CALLED來(lái)來(lái)通知通知編譯器編譯器保留此函數(shù)和被此函數(shù)調(diào)用到的函數(shù)保留此函數(shù)和被此函數(shù)調(diào)用到的函數(shù),這些函,這些函數(shù)將作為數(shù)將作為C C程序的入口點(diǎn)。程序的入口點(diǎn)。這個(gè)偽指令必須出現(xiàn)在對(duì)這個(gè)偽指令必須出現(xiàn)在對(duì)要保留的函數(shù)要保留的函數(shù)的任何聲明或引用之前,的任何聲明或引用之前,其其語(yǔ)法為語(yǔ)法為:# #pragmapragma FUNC_EXT_CALLED ( FUNC_EXT_CALLED (funcfunc););15.2.6 15.2.6 asm
12、asm語(yǔ)句語(yǔ)句C C編譯器可在編譯器輸出的匯編語(yǔ)言程序中編譯器可在編譯器輸出的匯編語(yǔ)言程序中直接輸出匯編指令或直接輸出匯編指令或語(yǔ)句語(yǔ)句。利用。利用asmasm語(yǔ)句語(yǔ)句嵌入嵌入?yún)R編語(yǔ)言程序匯編語(yǔ)言程序,可實(shí)現(xiàn)一些,可實(shí)現(xiàn)一些C C語(yǔ)言語(yǔ)言14實(shí)現(xiàn)起來(lái)比較麻煩的實(shí)現(xiàn)起來(lái)比較麻煩的硬件控制功能硬件控制功能。asmasm語(yǔ)句語(yǔ)句在語(yǔ)法上在語(yǔ)法上就象是就象是調(diào)用一個(gè)函數(shù)名為調(diào)用一個(gè)函數(shù)名為asmasm的函數(shù)的函數(shù),函數(shù)參,函數(shù)參數(shù)是一個(gè)字符串:數(shù)是一個(gè)字符串:asmasm (“assembler text”); (“assembler text”);編譯器編譯器會(huì)直接將會(huì)直接將“參數(shù)字符串參數(shù)字符串”
13、復(fù)制到輸出的匯編語(yǔ)言程序中,復(fù)制到輸出的匯編語(yǔ)言程序中,因此必須保證參數(shù)因此必須保證參數(shù)雙引號(hào)之間雙引號(hào)之間的字符串是一個(gè)的字符串是一個(gè)有效的匯編語(yǔ)有效的匯編語(yǔ)言指令言指令。雙引號(hào)之間雙引號(hào)之間的的匯編指令匯編指令必須以空格、制表符(必須以空格、制表符(TABTAB)、標(biāo)記符)、標(biāo)記符(LABELLABEL)或注釋開(kāi)頭,這和匯編語(yǔ)言編程的要求是一致的。)或注釋開(kāi)頭,這和匯編語(yǔ)言編程的要求是一致的。15編譯器編譯器不會(huì)檢查不會(huì)檢查此匯編語(yǔ)句是否合法,此匯編語(yǔ)句是否合法,如果語(yǔ)句中有錯(cuò)誤,在如果語(yǔ)句中有錯(cuò)誤,在匯匯編的過(guò)程編的過(guò)程中中會(huì)被匯編器指出會(huì)被匯編器指出。使用使用asmasm指令指令應(yīng)小心
14、應(yīng)小心不要破壞不要破壞C C語(yǔ)言的環(huán)境語(yǔ)言的環(huán)境。如果如果C C代碼中插入代碼中插入跳跳轉(zhuǎn)指令轉(zhuǎn)指令和和標(biāo)記符標(biāo)記符可能會(huì)引起不可預(yù)料的操作結(jié)果??赡軙?huì)引起不可預(yù)料的操作結(jié)果。能夠改變能夠改變段或其它影響段或其它影響C C語(yǔ)言環(huán)境的指令也可能引起麻煩。語(yǔ)言環(huán)境的指令也可能引起麻煩。對(duì)包含對(duì)包含asmasm語(yǔ)句的程序語(yǔ)句的程序使用使用優(yōu)化器優(yōu)化器時(shí)要特別小心。時(shí)要特別小心。優(yōu)化器優(yōu)化器可以重可以重新安排新安排asmasm指令指令附近的代碼順序附近的代碼順序,這可能會(huì)引起不期望的結(jié)果。,這可能會(huì)引起不期望的結(jié)果。1615.2.7 15.2.7 訪(fǎng)問(wèn)訪(fǎng)問(wèn)I/OI/O空間空間讀寫(xiě)讀寫(xiě)I/O空間的功能是
15、空間的功能是 C編譯器編譯器對(duì)標(biāo)準(zhǔn)對(duì)標(biāo)準(zhǔn)C的擴(kuò)展,的擴(kuò)展,是利用是利用關(guān)鍵字關(guān)鍵字ioport(I/O端口)端口)來(lái)實(shí)現(xiàn)的。來(lái)實(shí)現(xiàn)的。 ioport type porthexnum;ioport指示這是定義一個(gè)端口變量的關(guān)鍵字。指示這是定義一個(gè)端口變量的關(guān)鍵字。type(類(lèi)型)必須是(類(lèi)型)必須是char(字符)、(字符)、short(短整型)、(短整型)、int(整型)或?qū)?yīng)的無(wú)符號(hào)類(lèi)型。(整型)或?qū)?yīng)的無(wú)符號(hào)類(lèi)型。porthexnum為定義的為定義的端口變量端口變量,格式為,格式為“port”后后面面跟一個(gè)跟一個(gè)16進(jìn)制數(shù)進(jìn)制數(shù)。例如例如“port000A”是定義訪(fǎng)問(wèn)是定義訪(fǎng)問(wèn)I/O空間地
16、址空間地址0Ah的變量。的變量。17所有所有I/O端口端口的的定義必須在定義必須在文件級(jí)文件級(jí)完成完成,不支持在不支持在函數(shù)級(jí)聲明函數(shù)級(jí)聲明的的I/O端口變量。端口變量。利用利用ioport關(guān)鍵字關(guān)鍵字定義的定義的I/O端口變量端口變量可以象可以象一般變量一樣一般變量一樣進(jìn)行進(jìn)行賦值賦值操作:操作:ioport unsinged port10;/*訪(fǎng)問(wèn)訪(fǎng)問(wèn)I/O空間空間10h的變量的變量*/.port10 = a; /*將將a寫(xiě)到寫(xiě)到端口端口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é)果寫(xiě)回到端口,結(jié)果寫(xiě)回到端口10h*/ 在進(jìn)行函數(shù)調(diào)用的時(shí)候,可以做在進(jìn)行函數(shù)調(diào)用的時(shí)候,可以做I/O端口變量的值傳遞,而端口變量的值傳遞,而不是引用,不是引用,例如:例如:call (port10); /*讀端口讀端口10h,將其值傳遞給函數(shù)調(diào)用,將其值傳遞給函數(shù)調(diào)用*/call (&port10);
18、/*引用傳遞無(wú)效!引用傳遞無(wú)效!*/1915.2.8 訪(fǎng)訪(fǎng)問(wèn)數(shù)據(jù)空間問(wèn)數(shù)據(jù)空間訪(fǎng)問(wèn)數(shù)據(jù)空間是訪(fǎng)問(wèn)數(shù)據(jù)空間是利用指針利用指針來(lái)實(shí)現(xiàn)的:來(lái)實(shí)現(xiàn)的:*(unsigned int *)0 x1000 = a; /* 將將a的值寫(xiě)入數(shù)據(jù)空間的值寫(xiě)入數(shù)據(jù)空間 1000h地址地址 */b = *(unsigned int *)0 x1000; /* 讀出數(shù)據(jù)空間讀出數(shù)據(jù)空間1000h地址地址 的值,賦給的值,賦給b */可見(jiàn)訪(fǎng)問(wèn)可見(jiàn)訪(fǎng)問(wèn)DSP數(shù)據(jù)空間地址數(shù)據(jù)空間地址不需要不需要對(duì)要訪(fǎng)問(wèn)的單元對(duì)要訪(fǎng)問(wèn)的單元預(yù)先定義預(yù)先定義,利用利用指針指針直接訪(fǎng)問(wèn)直接訪(fǎng)問(wèn)就可以了。這樣,訪(fǎng)問(wèn)數(shù)據(jù)空間就可以了。這樣,訪(fǎng)問(wèn)數(shù)據(jù)空
19、間很容易實(shí)很容易實(shí)現(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ù)同單片機(jī)中斷處理方式類(lèi)似,同單片機(jī)中斷處理方式類(lèi)似,DSP中斷的處理中斷的處理也有也有兩種兩種方式:方式:(1)查詢(xún)法:)查詢(xún)法:對(duì)中斷的處理可對(duì)中斷的處理可完全按照程序預(yù)定的方式完全按照程序預(yù)定的方式進(jìn)行進(jìn)行,一般不會(huì)出現(xiàn)中斷丟失或中斷嵌套的問(wèn)題,但是一般不會(huì)出現(xiàn)中斷丟失或中斷嵌套的問(wèn)題,但是2
20、1實(shí)時(shí)性實(shí)時(shí)性不容易保證不容易保證。 (2)回調(diào)法:)回調(diào)法:當(dāng)有中斷發(fā)生時(shí),會(huì)暫停當(dāng)前正在執(zhí)行的程序。當(dāng)有中斷發(fā)生時(shí),會(huì)暫停當(dāng)前正在執(zhí)行的程序。程序的程序的實(shí)時(shí)性實(shí)時(shí)性可得到保證,但如果中斷處理函數(shù)使用不當(dāng)易可得到保證,但如果中斷處理函數(shù)使用不當(dāng)易造成中斷丟失或中斷嵌套問(wèn)題。造成中斷丟失或中斷嵌套問(wèn)題。22采用采用回調(diào)法回調(diào)法處理處理DSP中斷中斷需定義中斷服務(wù)函數(shù)需定義中斷服務(wù)函數(shù),有,有兩種兩種方法:方法:(1)用關(guān)鍵字)用關(guān)鍵字intterupt(中斷)(中斷)來(lái)實(shí)現(xiàn)。它的用法是:來(lái)實(shí)現(xiàn)。它的用法是:interrupt void isr (void);(2)任何具有名為)任何具有名為c
21、_intd 的函數(shù)(的函數(shù)(d為為0到到9的數(shù)),都被的數(shù)),都被假定假定為一個(gè)中斷程序?yàn)橐粋€(gè)中斷程序。如:。如:void c_int1 (void); 無(wú)論用哪種方法定義中斷服務(wù)函數(shù),都須注意以下問(wèn)題:無(wú)論用哪種方法定義中斷服務(wù)函數(shù),都須注意以下問(wèn)題:(1)中斷處理函數(shù)必須是)中斷處理函數(shù)必須是void類(lèi)型類(lèi)型,而且不能有任何輸入,而且不能有任何輸入?yún)?shù)。參數(shù)。23(2 2)進(jìn)入中斷服務(wù)函數(shù),)進(jìn)入中斷服務(wù)函數(shù),編譯器編譯器將自動(dòng)保護(hù)將自動(dòng)保護(hù)所有必要的寄存器,所有必要的寄存器,并在中斷服務(wù)函數(shù)結(jié)束時(shí)恢復(fù)運(yùn)行環(huán)境。并在中斷服務(wù)函數(shù)結(jié)束時(shí)恢復(fù)運(yùn)行環(huán)境。(3 3)進(jìn)入中斷服務(wù)函數(shù),編譯器)進(jìn)入中
22、斷服務(wù)函數(shù),編譯器只保護(hù)只保護(hù)與運(yùn)行上下文相關(guān)與運(yùn)行上下文相關(guān)的寄的寄存器存器,而,而不保護(hù)不保護(hù)所有的所有的寄存器寄存器。中斷服務(wù)函數(shù)。中斷服務(wù)函數(shù)可以任意修改可以任意修改不被保護(hù)的寄存器,如外設(shè)控制寄存器等。不被保護(hù)的寄存器,如外設(shè)控制寄存器等。(4 4)要注意)要注意IMRIMR、INTMINTM等中斷控制量的設(shè)置。通常等中斷控制量的設(shè)置。通常進(jìn)入進(jìn)入中斷服中斷服務(wù)程序要設(shè)置相應(yīng)寄存器務(wù)程序要設(shè)置相應(yīng)寄存器將將總中斷總中斷屏蔽屏蔽,退出退出中斷服務(wù)程序中斷服務(wù)程序時(shí)時(shí)再打開(kāi)再打開(kāi),避免中斷嵌套。,避免中斷嵌套。24(5)中斷處理函數(shù))中斷處理函數(shù)可以被其他可以被其他C程序調(diào)用程序調(diào)用,但
23、是,但是效率較差。效率較差。(6)多個(gè)中斷可以多個(gè)中斷可以共用共用一個(gè)中斷服務(wù)函數(shù)一個(gè)中斷服務(wù)函數(shù),除了除了c_int0。c_int0是是DSP軟件開(kāi)發(fā)平臺(tái)軟件開(kāi)發(fā)平臺(tái)CCS提供的一個(gè)提供的一個(gè)保留的復(fù)位中斷保留的復(fù)位中斷處理函數(shù),處理函數(shù),不會(huì)被調(diào)用,不會(huì)被調(diào)用,也不需要保護(hù)任何寄存器。也不需要保護(hù)任何寄存器。(7)使用中斷處理函數(shù)與)使用中斷處理函數(shù)與一些一些編譯選項(xiàng)編譯選項(xiàng)沖突沖突,注意注意避免對(duì)包含中避免對(duì)包含中斷處理函數(shù)的斷處理函數(shù)的C程序采用這些編譯選項(xiàng)。程序采用這些編譯選項(xiàng)。(8)中斷服務(wù)函數(shù)中斷服務(wù)函數(shù)可以和可以和一般函數(shù)一般函數(shù)一樣訪(fǎng)問(wèn)全局變量、分配局部一樣訪(fǎng)問(wèn)全局變量、分配
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ù)要盡量短小盡量短小,避免中斷丟失、中斷嵌套等,避免中斷丟失、中斷嵌套等問(wèn)題。問(wèn)題。15.2.10 15.2.10 動(dòng)態(tài)分配內(nèi)存動(dòng)態(tài)分配內(nèi)存TMS320C2000 C語(yǔ)言程序中可以調(diào)用語(yǔ)言程序中可以調(diào)用malloc、calloc或或realloc函數(shù)來(lái)函數(shù)來(lái)動(dòng)態(tài)分配內(nèi)存動(dòng)態(tài)分配內(nèi)存。26unsigned int *data;data
25、 =(unsigned int *) malloc (100 * sizeof (unsigned int);動(dòng)態(tài)分配的內(nèi)存將分配在動(dòng)態(tài)分配的內(nèi)存將分配在.system段,且只能通過(guò)指針進(jìn)行訪(fǎng)段,且只能通過(guò)指針進(jìn)行訪(fǎng)問(wèn)。將大數(shù)組通過(guò)這種方式來(lái)分配可以節(jié)省問(wèn)。將大數(shù)組通過(guò)這種方式來(lái)分配可以節(jié)省.bss段的空間。段的空間。通過(guò)鏈接器的通過(guò)鏈接器的-heap選項(xiàng)選項(xiàng)可以可以定義定義.system段段的大小的大小。15.2.11 15.2.11 系統(tǒng)初始化系統(tǒng)初始化C程序開(kāi)始運(yùn)行時(shí),必須首先程序開(kāi)始運(yùn)行時(shí),必須首先初始化初始化C運(yùn)行環(huán)境運(yùn)行環(huán)境,這是通過(guò),這是通過(guò)c_int0函數(shù)函數(shù)完成的。完成的。2
26、7c_int0函數(shù)函數(shù)是復(fù)位中斷的是復(fù)位中斷的中斷服務(wù)函數(shù)中斷服務(wù)函數(shù),此函數(shù)在,此函數(shù)在運(yùn)行支持庫(kù)運(yùn)行支持庫(kù)(rts, runtime_support library)中)中提供提供。鏈接器鏈接器會(huì)將這個(gè)會(huì)將這個(gè)函數(shù)的入口地址函數(shù)的入口地址放置在復(fù)位中斷向量處放置在復(fù)位中斷向量處,使其可以在,使其可以在初始化初始化時(shí)被調(diào)用時(shí)被調(diào)用。c_int0函數(shù)函數(shù)進(jìn)行以下工作來(lái)進(jìn)行以下工作來(lái)建立建立C運(yùn)行環(huán)境運(yù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ù),開(kāi)始運(yùn)行,開(kāi)始運(yùn)行C程序。程序。28用戶(hù)程序可不用考慮上述問(wèn)題,用戶(hù)程序可不用考慮上述問(wèn)題,認(rèn)為程序從認(rèn)為程序從main函數(shù)開(kāi)始執(zhí)行函數(shù)開(kāi)始執(zhí)行就可以。就可以。用戶(hù)用戶(hù)可對(duì)可對(duì)c_int0函數(shù)函數(shù)進(jìn)行修改進(jìn)行修改,但修改后的函數(shù)必須完成以上,但修改后的函數(shù)必須完成以上任務(wù)。任務(wù)。15.3 DSP15.3 DSP C C語(yǔ)言與匯編語(yǔ)言混合編程語(yǔ)言與匯編語(yǔ)言混合編程 C語(yǔ)言編寫(xiě)語(yǔ)言編寫(xiě)DSP程序?qū)Φ讓拥牧私庖筝^低,流程控制靈活,程序?qū)Φ讓拥牧私庖筝^低,流程控制靈活,開(kāi)發(fā)周期短。程序可讀性、可移植性好,程序修改、升級(jí)方開(kāi)發(fā)周期短。程序可讀性、可移植性好,程序
28、修改、升級(jí)方便。便。29某些硬件控制功能不如匯編語(yǔ)言靈活,某些硬件控制功能不如匯編語(yǔ)言靈活,程序程序?qū)崟r(shí)性不理想實(shí)時(shí)性不理想,很,很多核心程序可能仍然需要利用匯編語(yǔ)言來(lái)實(shí)現(xiàn)。多核心程序可能仍然需要利用匯編語(yǔ)言來(lái)實(shí)現(xiàn)。利用兩種語(yǔ)言進(jìn)行利用兩種語(yǔ)言進(jìn)行混合編程混合編程主要有以下主要有以下四種方式四種方式:(1)C程序程序調(diào)用匯編函數(shù)調(diào)用匯編函數(shù);(2)內(nèi)嵌匯編語(yǔ)句內(nèi)嵌匯編語(yǔ)句;(3)C程序程序訪(fǎng)問(wèn)訪(fǎng)問(wèn)匯編程序變量匯編程序變量; (4)修改修改C編譯器輸出編譯器輸出。3015.3.1 程序運(yùn)行環(huán)境程序運(yùn)行環(huán)境 在在C語(yǔ)言和匯編語(yǔ)言混合編程中,語(yǔ)言和匯編語(yǔ)言混合編程中,必須保證必須保證C程序運(yùn)行環(huán)境不
29、程序運(yùn)行環(huán)境不會(huì)被會(huì)被匯編程序匯編程序破壞破壞,所有代碼必須維護(hù)該環(huán)境,否則將難,所有代碼必須維護(hù)該環(huán)境,否則將難以保證以保證C程序的正常執(zhí)行。程序的正常執(zhí)行。1. 存儲(chǔ)器模型存儲(chǔ)器模型C編譯器將存儲(chǔ)器作為編譯器將存儲(chǔ)器作為程序存儲(chǔ)器程序存儲(chǔ)器和和數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器兩個(gè)線(xiàn)性區(qū)兩個(gè)線(xiàn)性區(qū)來(lái)來(lái)處理:處理:程序存儲(chǔ)器程序存儲(chǔ)器:包含可執(zhí)行的代碼和常量、變量初值。:包含可執(zhí)行的代碼和常量、變量初值。數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器:包含外部變量、靜態(tài)變量和系統(tǒng)堆棧。:包含外部變量、靜態(tài)變量和系統(tǒng)堆棧。 31(1)段的存儲(chǔ)分配)段的存儲(chǔ)分配編譯器產(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等。等。用戶(hù)可以利用用戶(hù)可以利用CODE_SECTION和和DATA_SECTION偽指令偽指令來(lái)來(lái)創(chuàng)創(chuàng)建另外的段建另外的段。32段的存儲(chǔ)分配和頁(yè)的指定段的存儲(chǔ)分配和頁(yè)的指定段段存儲(chǔ)器類(lèi)型存儲(chǔ)器類(lèi)型頁(yè)頁(yè).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編譯器編譯器使用軟件堆棧進(jìn)行如下工作:使用軟件堆棧進(jìn)行如下工作:n分配局部變量分配局部變量n向函數(shù)傳遞參數(shù)向函數(shù)傳遞參數(shù)n保存處理器狀態(tài)保存處理器狀態(tài)n保存函數(shù)的返回地址保存函數(shù)的返回地址n保存暫時(shí)的結(jié)果保存暫時(shí)的結(jié)果n保存寄存器保存寄存器34堆棧向上生長(zhǎng)堆棧向上生長(zhǎng),編譯器使,編譯器使用用兩個(gè)寄存器兩個(gè)寄存器管理堆棧管理堆棧:
32、AR1:堆棧指針(堆棧指針(SP, stack pointer),指向當(dāng)前堆),指向當(dāng)前堆棧頂。棧頂。AR2:幀指針(幀指針(FP, frame pointer),指向當(dāng)前幀的),指向當(dāng)前幀的起始點(diǎn)。起始點(diǎn)。每一個(gè)函數(shù)每一個(gè)函數(shù)都會(huì)在堆棧頂部都會(huì)在堆棧頂部建立建立一個(gè)新的一個(gè)新的幀,用來(lái)幀,用來(lái)保存局部的或臨時(shí)的變量。保存局部的或臨時(shí)的變量。C語(yǔ)言環(huán)境語(yǔ)言環(huán)境自動(dòng)操作自動(dòng)操作這這兩個(gè)寄存器兩個(gè)寄存器。如果。如果編寫(xiě)編寫(xiě)用到堆棧用到堆棧的匯的匯編語(yǔ)言程序編語(yǔ)言程序,一定要,一定要注意注意正確使用這兩個(gè)寄存器正確使用這兩個(gè)寄存器。用用-stack連接選項(xiàng)連接選項(xiàng)可以可以指定軟件堆棧的大小指定軟件堆
33、棧的大小,用用C編寫(xiě)編寫(xiě)DSP程序程序一定注意保留足夠的堆棧空間!一定注意保留足夠的堆??臻g!35注意:注意:編譯器編譯器不會(huì)檢查不會(huì)檢查堆棧溢出情況,堆棧溢出情況,堆棧溢出會(huì)破壞堆棧溢出會(huì)破壞DSP運(yùn)行環(huán)境,導(dǎo)致程序失敗。編寫(xiě)運(yùn)行環(huán)境,導(dǎo)致程序失敗。編寫(xiě)DSP程序和配置程序和配置DSP存儲(chǔ)器存儲(chǔ)器資源要注意防止堆棧溢出的發(fā)生。資源要注意防止堆棧溢出的發(fā)生。2. 2. 寄存器規(guī)則寄存器規(guī)則TMS320 DSP 運(yùn)行環(huán)境對(duì)寄存器的使用有運(yùn)行環(huán)境對(duì)寄存器的使用有嚴(yán)格的規(guī)則嚴(yán)格的規(guī)則,如果編,如果編寫(xiě)寫(xiě)涉及到寄存器的匯編程序涉及到寄存器的匯編程序,必須嚴(yán)格遵守規(guī)則,否則可能,必須嚴(yán)格遵守規(guī)則,否則可
34、能系統(tǒng)工作異常。系統(tǒng)工作異常。寄存器規(guī)則寄存器規(guī)則規(guī)定了編譯器規(guī)定了編譯器如何使用寄存器和寄存器在函數(shù)調(diào)用如何使用寄存器和寄存器在函數(shù)調(diào)用的過(guò)程中如何進(jìn)行保護(hù)。的過(guò)程中如何進(jìn)行保護(hù)。36寄存器按保護(hù)方式寄存器按保護(hù)方式分為兩種分為兩種: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)容。注:注:無(wú)論是否使用優(yōu)化編譯,都必須遵守這些寄存器規(guī)無(wú)論是否使用優(yōu)化編譯,都必須遵守這些寄
35、存器規(guī)則。則。37寄存器寄存器用途用途調(diào)用時(shí)保護(hù)調(diào)用時(shí)保護(hù)AR0幀指針(幀指針(FP)YesAR1堆棧指針(堆棧指針(SP)YesAR2局部變量指針(局部變量指針(LVP)NoAR3-AR5表達(dá)式運(yùn)算表達(dá)式運(yùn)算NoAR6-AR7寄存器變量寄存器變量YesAccumulator表達(dá)式運(yùn)算返回值表達(dá)式運(yùn)算返回值No 寄存器的使用和保護(hù)寄存器的使用和保護(hù)38 狀態(tài)寄存器(狀態(tài)寄存器(ST0、ST1)單元單元對(duì)于有假定值(為0或?yàn)?)的狀態(tài)寄存器單元,在進(jìn)行函數(shù)調(diào)用和函數(shù)返回時(shí)必須保證其值為假定值。單元單元名稱(chēng)名稱(chēng)假定值假定值A(chǔ)RP輔助寄存器指針輔助寄存器指針1C進(jìn)位標(biāo)志進(jìn)位標(biāo)志-DP數(shù)據(jù)頁(yè)數(shù)據(jù)頁(yè)-O
36、V溢出標(biāo)值溢出標(biāo)值-OVM溢出模式溢出模式0PM乘法移位模式乘法移位模式0SXM符號(hào)擴(kuò)展模式符號(hào)擴(kuò)展模式-TC測(cè)試模式測(cè)試模式-393個(gè)寄存器個(gè)寄存器堆棧指針(堆棧指針(SP)、幀指針()、幀指針(FP)和局部變)和局部變量指針(量指針(LVP)管理堆棧和局部幀。)管理堆棧和局部幀。AR6、AR7作為寄存器變量的寄存器。作為寄存器變量的寄存器。AR6被分配給第一被分配給第一個(gè)變量,個(gè)變量,AR7分配給第二個(gè)變量。分配給第二個(gè)變量。 編譯器使用不用于寄存器變量的寄存器來(lái)計(jì)算表達(dá)式的值編譯器使用不用于寄存器變量的寄存器來(lái)計(jì)算表達(dá)式的值并保存臨時(shí)結(jié)果。并保存臨時(shí)結(jié)果。 40當(dāng)函數(shù)的返回值是一個(gè)標(biāo)量類(lèi)
37、型(整型、指針或浮點(diǎn)型)時(shí),當(dāng)函數(shù)的返回值是一個(gè)標(biāo)量類(lèi)型(整型、指針或浮點(diǎn)型)時(shí),該值在函數(shù)返回時(shí)被放入累加器中。該值在函數(shù)返回時(shí)被放入累加器中。16位的數(shù)據(jù)類(lèi)型(字符型、短整型、整型或指針型)連同正位的數(shù)據(jù)類(lèi)型(字符型、短整型、整型或指針型)連同正確的符號(hào)擴(kuò)展被裝載到累加器中。確的符號(hào)擴(kuò)展被裝載到累加器中。3. 函數(shù)結(jié)構(gòu)和調(diào)用規(guī)則函數(shù)結(jié)構(gòu)和調(diào)用規(guī)則C編譯器對(duì)函數(shù)的調(diào)用有一系列嚴(yán)格的規(guī)定。編譯器對(duì)函數(shù)的調(diào)用有一系列嚴(yán)格的規(guī)定。除了除了特殊的運(yùn)特殊的運(yùn)行支持函數(shù)外,任何調(diào)用者函數(shù)和被調(diào)用函數(shù)行支持函數(shù)外,任何調(diào)用者函數(shù)和被調(diào)用函數(shù)都要遵守這些都要遵守這些規(guī)則規(guī)則,否則,否則可能會(huì)破壞可能會(huì)破壞C
38、環(huán)境并導(dǎo)致程序失敗環(huán)境并導(dǎo)致程序失敗。 41(1)函數(shù)如何產(chǎn)生調(diào)用)函數(shù)如何產(chǎn)生調(diào)用一個(gè)函數(shù)(調(diào)用者函數(shù))在調(diào)用其他函數(shù)(子函數(shù))時(shí)一個(gè)函數(shù)(調(diào)用者函數(shù))在調(diào)用其他函數(shù)(子函數(shù))時(shí)執(zhí)行以下任務(wù)。注意,執(zhí)行以下任務(wù)。注意,ARP必須設(shè)置為必須設(shè)置為1。a. 調(diào)用者函數(shù)將參數(shù)以調(diào)用者函數(shù)將參數(shù)以顛倒的順序顛倒的順序壓入堆棧(最右邊聲明的壓入堆棧(最右邊聲明的參數(shù)第一個(gè)壓入堆棧,最左邊的參數(shù)最后一個(gè)壓入堆參數(shù)第一個(gè)壓入堆棧,最左邊的參數(shù)最后一個(gè)壓入堆棧)。即函數(shù)調(diào)用時(shí),最左邊的參數(shù)放在棧頂單元。棧)。即函數(shù)調(diào)用時(shí),最左邊的參數(shù)放在棧頂單元。b. 調(diào)用者函數(shù)調(diào)用子函數(shù)。調(diào)用者函數(shù)調(diào)用子函數(shù)。c. 調(diào)用
39、者函數(shù)假定當(dāng)子函數(shù)執(zhí)行完成返回時(shí),調(diào)用者函數(shù)假定當(dāng)子函數(shù)執(zhí)行完成返回時(shí),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. 實(shí)現(xiàn)函數(shù)功能。實(shí)現(xiàn)函數(shù)
40、功能。f. 如果函數(shù)返回標(biāo)量數(shù)據(jù),將它放入累加器。如果函數(shù)返回標(biāo)量數(shù)據(jù),將它放入累加器。g. 將將ARP設(shè)定為設(shè)定為AR1。h. 如果保護(hù)了如果保護(hù)了AR6、AR7,恢復(fù)這兩個(gè)寄存器。,恢復(fù)這兩個(gè)寄存器。i. 刪除局部幀。刪除局部幀。j. 恢復(fù)恢復(fù)FP。k. 從軟件堆棧中彈出返回地址并壓入硬件堆棧。從軟件堆棧中彈出返回地址并壓入硬件堆棧。l. 返回。返回。44(3 3)被調(diào)用的函數(shù)的)被調(diào)用的函數(shù)的三種三種特殊情況特殊情況 a. a. 返回的是一個(gè)結(jié)構(gòu)體:當(dāng)函數(shù)的返回值為一個(gè)結(jié)構(gòu)返回的是一個(gè)結(jié)構(gòu)體:當(dāng)函數(shù)的返回值為一個(gè)結(jié)構(gòu)時(shí),調(diào)用者函數(shù)負(fù)責(zé)分配存儲(chǔ)空間,并將存儲(chǔ)空間地址作為時(shí),調(diào)用者函數(shù)負(fù)責(zé)分
41、配存儲(chǔ)空間,并將存儲(chǔ)空間地址作為最后一個(gè)輸入?yún)?shù)傳遞給被調(diào)用函數(shù)。被調(diào)用函數(shù)將要返回最后一個(gè)輸入?yún)?shù)傳遞給被調(diào)用函數(shù)。被調(diào)用函數(shù)將要返回的結(jié)構(gòu)拷貝到這個(gè)參數(shù)所指向的內(nèi)存空間。的結(jié)構(gòu)拷貝到這個(gè)參數(shù)所指向的內(nèi)存空間。 b. b. 不將返回地址移到軟件堆棧中:當(dāng)被調(diào)用函數(shù)不再不將返回地址移到軟件堆棧中:當(dāng)被調(diào)用函數(shù)不再調(diào)用其它函數(shù),或者確定調(diào)用深度不會(huì)超過(guò)調(diào)用其它函數(shù),或者確定調(diào)用深度不會(huì)超過(guò)8 8級(jí),可以不用將級(jí),可以不用將返回地址移動(dòng)到軟件堆棧。返回地址移動(dòng)到軟件堆棧。 c.c.不分配局部幀:如果函數(shù)沒(méi)有輸入?yún)?shù),不使用局部不分配局部幀:如果函數(shù)沒(méi)有輸入?yún)?shù),不使用局部變量,就不需要修改變量,就
42、不需要修改AR0AR0(FPFP),因此也不需要對(duì)其進(jìn)行保),因此也不需要對(duì)其進(jìn)行保護(hù)。護(hù)。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語(yǔ)言調(diào)用匯編函數(shù)語(yǔ)言調(diào)用匯編函數(shù) a. 無(wú)論是無(wú)論是C函數(shù)還是匯編語(yǔ)言的所有函數(shù),都函數(shù)還是匯編語(yǔ)言的所有函數(shù),都必須遵循寄存器必須遵循寄存器規(guī)則規(guī)則。b. 必須保存被函數(shù)修改的任何專(zhuān)用寄
43、存器,包括:必須保存被函數(shù)修改的任何專(zhuān)用寄存器,包括:AR0(FP)、)、AR1(SP)、)、AR6、AR7。如果正常使用堆棧,如果正常使用堆棧,則不必明確保存則不必明確保存SP。也就是說(shuō),用戶(hù)可以自由地使用堆也就是說(shuō),用戶(hù)可以自由地使用堆棧,彈出被壓入的所有內(nèi)容。用戶(hù)可以自由使用所有其他棧,彈出被壓入的所有內(nèi)容。用戶(hù)可以自由使用所有其他的寄存器,而不必保留它們的內(nèi)容。的寄存器,而不必保留它們的內(nèi)容。47c. 如果改變了任何一個(gè)寄存器位域狀態(tài)的假定值,則必須確保如果改變了任何一個(gè)寄存器位域狀態(tài)的假定值,則必須確保恢復(fù)其假定值。尤其注意恢復(fù)其假定值。尤其注意ARP應(yīng)該被指定為應(yīng)該被指定為AR1。
44、d. 中斷子程序必須保存所有使用的寄存器。中斷子程序必須保存所有使用的寄存器。e. 在從匯編語(yǔ)言中調(diào)用在從匯編語(yǔ)言中調(diào)用C函數(shù)時(shí),將參數(shù)以倒序壓入堆棧,函數(shù)函數(shù)時(shí),將參數(shù)以倒序壓入堆棧,函數(shù)調(diào)用后彈出堆棧。調(diào)用后彈出堆棧。f. 調(diào)用調(diào)用C函數(shù)時(shí),只有專(zhuān)用的寄存器內(nèi)容被保留,函數(shù)時(shí),只有專(zhuān)用的寄存器內(nèi)容被保留,C函數(shù)可以改函數(shù)可以改變其他任何寄存器的內(nèi)容。變其他任何寄存器的內(nèi)容。g. 函數(shù)必須返回累加器中的值。函數(shù)必須返回累加器中的值。h. 匯編模塊使用匯編模塊使用.cinit段只能用于全局變量的初始化。段只能用于全局變量的初始化。boot.c中中的啟動(dòng)子程序假定的啟動(dòng)子程序假定.cinit段完
45、全是由初始化表組成。在段完全是由初始化表組成。在.cinit段段中放入其他的信息會(huì)破壞初始化表而導(dǎo)致無(wú)法預(yù)知的后果。中放入其他的信息會(huì)破壞初始化表而導(dǎo)致無(wú)法預(yù)知的后果。48i.編譯器將在所有的編譯器將在所有的C語(yǔ)言對(duì)象標(biāo)識(shí)符的開(kāi)頭語(yǔ)言對(duì)象標(biāo)識(shí)符的開(kāi)頭添加下劃線(xiàn)添加下劃線(xiàn)“_”。在。在C語(yǔ)言中和匯編語(yǔ)言都要語(yǔ)言中和匯編語(yǔ)言都要訪(fǎng)問(wèn)的對(duì)象訪(fǎng)問(wèn)的對(duì)象必須在匯編必須在匯編語(yǔ)言中以語(yǔ)言中以下劃線(xiàn)下劃線(xiàn)“_”作為前綴。作為前綴。例如,例如,C語(yǔ)言中名為語(yǔ)言中名為x的對(duì)象在匯編語(yǔ)言中為的對(duì)象在匯編語(yǔ)言中為_(kāi)x。僅在。僅在匯編語(yǔ)匯編語(yǔ)言言模塊中使用的對(duì)象模塊中使用的對(duì)象可以使用不加下劃線(xiàn)可以使用不加下劃線(xiàn)的標(biāo)
46、識(shí)符,不會(huì)的標(biāo)識(shí)符,不會(huì)和和C語(yǔ)言中的標(biāo)識(shí)符發(fā)生沖突。語(yǔ)言中的標(biāo)識(shí)符發(fā)生沖突。j. 在在C中被訪(fǎng)問(wèn)的任何匯編語(yǔ)言對(duì)象或在中被訪(fǎng)問(wèn)的任何匯編語(yǔ)言對(duì)象或在C中被調(diào)用的任何匯編中被調(diào)用的任何匯編語(yǔ)言函數(shù)必須在匯編代碼中使用語(yǔ)言函數(shù)必須在匯編代碼中使用.global偽指令聲明偽指令聲明。這。這將聲明該符號(hào)是外部的,允許鏈接器解決對(duì)它的引用。將聲明該符號(hào)是外部的,允許鏈接器解決對(duì)它的引用。4915.3.3 15.3.3 內(nèi)嵌匯編語(yǔ)句內(nèi)嵌匯編語(yǔ)句 在在TMS320C2000 C語(yǔ)言中,可以語(yǔ)言中,可以使用使用asm語(yǔ)句語(yǔ)句在編譯器產(chǎn)生在編譯器產(chǎn)生的匯編語(yǔ)言文件中嵌入單行的匯編語(yǔ)句。的匯編語(yǔ)言文件中嵌入單行
47、的匯編語(yǔ)句。一系列的一系列的asm語(yǔ)語(yǔ)句句可以將順序的匯編語(yǔ)句插入到編譯器的輸出代碼中可以將順序的匯編語(yǔ)句插入到編譯器的輸出代碼中。使用中的幾點(diǎn)注意事項(xiàng):使用中的幾點(diǎn)注意事項(xiàng):a. asm語(yǔ)句語(yǔ)句使用戶(hù)可以訪(fǎng)問(wèn)某些用使用戶(hù)可以訪(fǎng)問(wèn)某些用C語(yǔ)句無(wú)法訪(fǎng)問(wèn)語(yǔ)句無(wú)法訪(fǎng)問(wèn)的硬件特性。的硬件特性。b. 在使用在使用asm語(yǔ)句的時(shí)候,語(yǔ)句的時(shí)候,要防止破壞要防止破壞C環(huán)境環(huán)境。編譯器不會(huì)對(duì)。編譯器不會(huì)對(duì)嵌入的代碼嵌入的代碼進(jìn)行檢查和分析。進(jìn)行檢查和分析。c. 在在asm語(yǔ)句中語(yǔ)句中使用跳轉(zhuǎn)語(yǔ)句使用跳轉(zhuǎn)語(yǔ)句或或標(biāo)記符標(biāo)記符(LABEL)可能會(huì)產(chǎn))可能會(huì)產(chǎn)生生無(wú)法預(yù)知的結(jié)果無(wú)法預(yù)知的結(jié)果。50d. 不要改變不要
48、改變C變量的值,但可以安全地讀取任何變量的當(dāng)前值。變量的值,但可以安全地讀取任何變量的當(dāng)前值。e. 不要使用不要使用asm語(yǔ)句嵌入語(yǔ)句嵌入?yún)R編匯編偽指令偽指令,這會(huì),這會(huì)破壞破壞匯編語(yǔ)言環(huán)境。匯編語(yǔ)言環(huán)境。f. 在編譯器的輸出代碼中在編譯器的輸出代碼中嵌入注釋嵌入注釋時(shí),時(shí),asm語(yǔ)句是很有用的語(yǔ)句是很有用的。可以用星號(hào)(可以用星號(hào)(*)作為匯編代碼的開(kāi)頭,)作為匯編代碼的開(kāi)頭,例如:例如:asm (“ * this is an assembly language comment.”);51f. f. 調(diào)用調(diào)用C C函數(shù)時(shí),只有專(zhuān)用的寄存器內(nèi)容被保留,函數(shù)時(shí),只有專(zhuān)用的寄存器內(nèi)容被保留,C C
49、函數(shù)可以函數(shù)可以改變其他任何寄存器的內(nèi)容。改變其他任何寄存器的內(nèi)容。g. g. 函數(shù)必須返回累加器中的值函數(shù)必須返回累加器中的值。h. h. 匯編模塊使用匯編模塊使用. .cinitcinit段段只能用于全局變量的初始化。只能用于全局變量的初始化。boot.cboot.c中的啟動(dòng)子程序假定中的啟動(dòng)子程序假定. .cinitcinit段完全是由初始化表組段完全是由初始化表組成。在成。在. .cinitcinit段中放入其他的信息會(huì)破壞初始化表而導(dǎo)致段中放入其他的信息會(huì)破壞初始化表而導(dǎo)致無(wú)法預(yù)知的后果。無(wú)法預(yù)知的后果。52i i 編譯器將在所有的編譯器將在所有的C C語(yǔ)言對(duì)象標(biāo)識(shí)符的開(kāi)頭添加下劃線(xiàn)
50、語(yǔ)言對(duì)象標(biāo)識(shí)符的開(kāi)頭添加下劃線(xiàn)“_”_”。在。在C C語(yǔ)言中和匯編語(yǔ)言語(yǔ)言中和匯編語(yǔ)言都要訪(fǎng)問(wèn)的對(duì)象都要訪(fǎng)問(wèn)的對(duì)象必須在匯必須在匯編語(yǔ)言中以下劃線(xiàn)編語(yǔ)言中以下劃線(xiàn)“_”_”作為前綴作為前綴。例如,例如,C C語(yǔ)言中名為語(yǔ)言中名為x x的對(duì)象在匯編語(yǔ)言中為的對(duì)象在匯編語(yǔ)言中為_(kāi)x_x。僅在匯編語(yǔ)僅在匯編語(yǔ)言模塊中使用的對(duì)象可以使用不加下劃線(xiàn)的標(biāo)識(shí)符,不言模塊中使用的對(duì)象可以使用不加下劃線(xiàn)的標(biāo)識(shí)符,不會(huì)和會(huì)和C C語(yǔ)言中的標(biāo)識(shí)符發(fā)生沖突。語(yǔ)言中的標(biāo)識(shí)符發(fā)生沖突。j.j. 在在C C中被訪(fǎng)問(wèn)的任何匯編語(yǔ)言對(duì)象或中被訪(fǎng)問(wèn)的任何匯編語(yǔ)言對(duì)象或在在C C中被調(diào)用的任何匯中被調(diào)用的任何匯編語(yǔ)言函數(shù)編語(yǔ)言函數(shù)
51、必須在匯編代碼中使用必須在匯編代碼中使用.global.global偽指令聲明偽指令聲明。這將聲明該符號(hào)是外部的,允許鏈接器解決對(duì)它的引用。這將聲明該符號(hào)是外部的,允許鏈接器解決對(duì)它的引用。5315.3.4 C15.3.4 C程序訪(fǎng)問(wèn)匯編程序變量程序訪(fǎng)問(wèn)匯編程序變量 有時(shí)需在有時(shí)需在C程序中訪(fǎng)問(wèn)匯編語(yǔ)言變量,這通常有兩種方式來(lái)程序中訪(fǎng)問(wèn)匯編語(yǔ)言變量,這通常有兩種方式來(lái)訪(fǎng)問(wèn)訪(fǎng)問(wèn).bss塊中的變量:塊中的變量:(1)將要訪(fǎng)問(wèn)的變量定義在)將要訪(fǎng)問(wèn)的變量定義在.bss塊中。塊中。(2)用)用.golbal修飾要訪(fǎng)問(wèn)的變量。修飾要訪(fǎng)問(wèn)的變量。在在匯編語(yǔ)言匯編語(yǔ)言中以下中以下橫線(xiàn)橫線(xiàn)“_”為前綴為前綴聲
52、明要訪(fǎng)問(wèn)的變量。聲明要訪(fǎng)問(wèn)的變量。在在C語(yǔ)言中語(yǔ)言中將將變量聲明變量聲明為外部變量(為外部變量(extern),),就可以進(jìn)就可以進(jìn)行正常訪(fǎng)問(wèn)。行正常訪(fǎng)問(wèn)。例如:例如:54如何訪(fǎng)問(wèn)非如何訪(fǎng)問(wèn)非.bss塊中的變量:塊中的變量: 要訪(fǎng)問(wèn)要訪(fǎng)問(wèn)非非.bss塊塊中的變量,通常的辦法是在匯編語(yǔ)言中中的變量,通常的辦法是在匯編語(yǔ)言中定義一個(gè)查找表定義一個(gè)查找表,然后在,然后在C語(yǔ)言中語(yǔ)言中通過(guò)指針通過(guò)指針來(lái)訪(fǎng)問(wèn)來(lái)訪(fǎng)問(wèn)。 首先首先定義變量定義變量,而且,而且最好放在獨(dú)立的初始化塊中。最好放在獨(dú)立的初始化塊中。定義定義一個(gè)全局的標(biāo)識(shí)指向?qū)ο蟮钠鹗键c(diǎn),這樣對(duì)象可以分配在一個(gè)全局的標(biāo)識(shí)指向?qū)ο蟮钠鹗键c(diǎn),這樣對(duì)象可
53、以分配在存儲(chǔ)器空間的任何位置。存儲(chǔ)器空間的任何位置。55 在在C C程序中將這個(gè)對(duì)象程序中將這個(gè)對(duì)象定義為定義為外部對(duì)象(外部對(duì)象(externextern),),并并且對(duì)象名稱(chēng)且對(duì)象名稱(chēng)不帶下橫線(xiàn)不帶下橫線(xiàn)“_”“_”前綴前綴,就可以對(duì)其進(jìn)行正常訪(fǎng),就可以對(duì)其進(jìn)行正常訪(fǎng)問(wèn)。問(wèn)。5615.3.5 15.3.5 修改修改C C編譯器的輸出編譯器的輸出 用戶(hù)可以編譯源程序,然后在匯編前對(duì)編譯輸出的匯編語(yǔ)言代用戶(hù)可以編譯源程序,然后在匯編前對(duì)編譯輸出的匯編語(yǔ)言代碼進(jìn)行手動(dòng)檢查和修改。碼進(jìn)行手動(dòng)檢查和修改。這種情況下,在這種情況下,在C代碼中利用代碼中利用asm語(yǔ)句語(yǔ)句插入適當(dāng)?shù)淖⑨尣迦脒m當(dāng)?shù)淖⑨寣?duì)對(duì)
54、理解理解C編譯器編譯器輸出的匯編語(yǔ)言代碼輸出的匯編語(yǔ)言代碼是非常有幫助的。是非常有幫助的。15.4 15.4 運(yùn)行支持函數(shù)(運(yùn)行支持函數(shù)(rtsrts)一個(gè)一個(gè)C程序所執(zhí)行的一些任務(wù)(如輸入輸出、動(dòng)態(tài)存儲(chǔ)器配程序所執(zhí)行的一些任務(wù)(如輸入輸出、動(dòng)態(tài)存儲(chǔ)器配置、字符串操作以及三角函數(shù)等)。置、字符串操作以及三角函數(shù)等)。TMS320C2000 C編譯器提供編譯器提供ANSI的的標(biāo)準(zhǔn)庫(kù)標(biāo)準(zhǔn)庫(kù)。使用。使用ANSI的標(biāo)的標(biāo)準(zhǔn)庫(kù)可準(zhǔn)庫(kù)可確保有一套統(tǒng)一的函數(shù)確保有一套統(tǒng)一的函數(shù)。57a. rts2xx.lib:運(yùn)行期支持目標(biāo)庫(kù):運(yùn)行期支持目標(biāo)庫(kù),包含:,包含: ANSI C ANSI C標(biāo)準(zhǔn)庫(kù)標(biāo)準(zhǔn)庫(kù) 系統(tǒng)啟
55、動(dòng)程序系統(tǒng)啟動(dòng)程序_c_int0_c_int0 允許允許C C訪(fǎng)問(wèn)特殊指令的函數(shù)和宏訪(fǎng)問(wèn)特殊指令的函數(shù)和宏b. rts.src:運(yùn)行期支持資源庫(kù):運(yùn)行期支持資源庫(kù)。包含:包含: 運(yùn)行期支持目標(biāo)庫(kù)的運(yùn)行期支持目標(biāo)庫(kù)的C語(yǔ)言和匯編語(yǔ)言程序源代碼。語(yǔ)言和匯編語(yǔ)言程序源代碼。15.5 15.5 常用數(shù)字信號(hào)處理程序常用數(shù)字信號(hào)處理程序FFT、FIR等,最好用匯編語(yǔ)言實(shí)現(xiàn),有豐富的資料可供參考。等,最好用匯編語(yǔ)言實(shí)現(xiàn),有豐富的資料可供參考。5815.6 15.6 閃存編程閃存編程程序編寫(xiě)、調(diào)試完成后,需程序編寫(xiě)、調(diào)試完成后,需將編譯、鏈接將編譯、鏈接所得到的所得到的可執(zhí)行文可執(zhí)行文件(件(.out)燒寫(xiě)
56、到燒寫(xiě)到DSP的程序存儲(chǔ)器中,使的程序存儲(chǔ)器中,使DSP可可擺脫擺脫開(kāi)發(fā)系統(tǒng)運(yùn)行開(kāi)發(fā)系統(tǒng)運(yùn)行。對(duì)對(duì)TMS320LF2407而言,應(yīng)該而言,應(yīng)該可執(zhí)行文件可執(zhí)行文件燒寫(xiě)到片內(nèi)部閃存燒寫(xiě)到片內(nèi)部閃存中。中。59燒寫(xiě)燒寫(xiě)DSPDSP程序要程序要利用利用硬件仿真器硬件仿真器實(shí)現(xiàn)實(shí)現(xiàn),仿真器制造商會(huì)提供,仿真器制造商會(huì)提供相相應(yīng)的燒寫(xiě)程序應(yīng)的燒寫(xiě)程序。注意注意: :不同型號(hào)不同型號(hào)DSPDSP往往使用往往使用不同不同的燒寫(xiě)程序,不同類(lèi)型的仿真的燒寫(xiě)程序,不同類(lèi)型的仿真器對(duì)器對(duì)燒寫(xiě)環(huán)境燒寫(xiě)環(huán)境也會(huì)有不同的要求也會(huì)有不同的要求,使用前要詳細(xì)閱讀相應(yīng),使用前要詳細(xì)閱讀相應(yīng)說(shuō)明(說(shuō)明(readmereadme)
57、。)。MP/MCMP/MC* *為低,置為為低,置為微計(jì)算機(jī)微計(jì)算機(jī)模式模式仿真仿真RAMRAM不被不被PSPS* *信號(hào)選中信號(hào)選中60DSP燒寫(xiě)步驟:燒寫(xiě)步驟: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(jìn)把目標(biāo)程序?qū)戇M(jìn)Flash中中(bp16k.bat, bp32k.bat)將將 Flash中的中的所有所有選中選中的位的位清清0(set to 0)。)。61寫(xiě)入程序?qū)懭氤绦颡?dú)立運(yùn)行獨(dú)立運(yùn)行的結(jié)果往
58、往與仿真的狀態(tài)的結(jié)果往往與仿真的狀態(tài)有差異有差異,甚至可能,甚至可能不能正常運(yùn)行,這是由于不能正常運(yùn)行,這是由于仿真過(guò)程中的程序運(yùn)行情況仿真過(guò)程中的程序運(yùn)行情況和和DSP獨(dú)立運(yùn)行時(shí)的程序運(yùn)行情況獨(dú)立運(yùn)行時(shí)的程序運(yùn)行情況不同不同所引起。所引起。在將程序編程到在將程序編程到DSP內(nèi)部之前,為保證正常運(yùn)行,需考慮以下內(nèi)部之前,為保證正常運(yùn)行,需考慮以下問(wèn)題:?jiǎn)栴}:(1 1)電路元件初始化同步問(wèn)題)電路元件初始化同步問(wèn)題由于外部元件初始化可能較慢,由于外部元件初始化可能較慢,DSP初始化完成后要延時(shí)一段初始化完成后要延時(shí)一段時(shí)間再訪(fǎng)問(wèn)外部慢速器件,通常要在控制程序的時(shí)間再訪(fǎng)問(wèn)外部慢速器件,通常要在控制
59、程序的主函數(shù)主函數(shù)中中添添加一段循環(huán)延時(shí)程序加一段循環(huán)延時(shí)程序。62(2)用仿真器調(diào)試,程序執(zhí)行較慢,)用仿真器調(diào)試,程序執(zhí)行較慢,循環(huán)時(shí)間循環(huán)時(shí)間比較長(zhǎng),而燒寫(xiě)比較長(zhǎng),而燒寫(xiě)到到DSP中可能時(shí)間較短,要中可能時(shí)間較短,要對(duì)循環(huán)程序的對(duì)循環(huán)程序的循環(huán)次數(shù)循環(huán)次數(shù)重新考慮。重新考慮。(3)用仿真器調(diào)試,)用仿真器調(diào)試,DSP運(yùn)行的一些資源(如堆棧等)用的是運(yùn)行的一些資源(如堆棧等)用的是仿真器中的資源,燒寫(xiě)到仿真器中的資源,燒寫(xiě)到DSP中執(zhí)行必須利用中執(zhí)行必須利用DSP本身的資本身的資源,源,燒寫(xiě)前燒寫(xiě)前必須對(duì)必須對(duì)鏈接命令文件(鏈接命令文件(.cmd文件)文件)中定義的中定義的各種各種資源資源
60、進(jìn)行詳細(xì)考慮。進(jìn)行詳細(xì)考慮。(4)浮點(diǎn)數(shù)運(yùn)算的問(wèn)題)浮點(diǎn)數(shù)運(yùn)算的問(wèn)題 浮點(diǎn)型變量浮點(diǎn)型變量考慮使用全局變量考慮使用全局變量,因?yàn)?,因?yàn)榫植孔兞烤植孔兞慷际嵌际窃诙褩T诙褩@锷傻睦锷傻?,過(guò)多的浮點(diǎn)數(shù)變量過(guò)多的浮點(diǎn)數(shù)變量對(duì)對(duì)軟件堆棧要求太多軟件堆棧要求太多,容易造,容易造成成堆棧溢出堆棧溢出問(wèn)題。問(wèn)題。63(5)復(fù)位問(wèn)題)復(fù)位問(wèn)題利用仿真器進(jìn)行調(diào)試的時(shí)候,利用仿真器進(jìn)行調(diào)試的時(shí)候,DSP程序通過(guò)程序通過(guò)仿真環(huán)境啟動(dòng),不仿真環(huán)境啟動(dòng),不需要復(fù)位信號(hào)需要復(fù)位信號(hào);而而閃存編程后閃存編程后DSP的運(yùn)行中,的運(yùn)行中,復(fù)位復(fù)位要通過(guò)電路板上要通過(guò)電路板上復(fù)位電路復(fù)位電路來(lái)來(lái)實(shí)現(xiàn),實(shí)現(xiàn),如果如果電路板上復(fù)位電路有
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人調(diào)休申請(qǐng)書(shū)
- 課題立項(xiàng)申請(qǐng)書(shū)選題
- 建筑公司轉(zhuǎn)正申請(qǐng)書(shū)
- 電子工業(yè)中的高強(qiáng)度緊固件技術(shù)探討
- 2024-2025學(xué)年高中英語(yǔ)Unit1Livingwell單元加餐練新人教版選修7
- 2024-2025學(xué)年高中數(shù)學(xué)第3章統(tǒng)計(jì)案例1回歸分析學(xué)案北師大版選修2-3
- 2024-2025學(xué)年高中物理第二章力第3節(jié)彈力課時(shí)作業(yè)含解析教科版必修1
- 科長(zhǎng)轉(zhuǎn)正申請(qǐng)書(shū)
- 發(fā)票專(zhuān)用章申請(qǐng)書(shū)
- 社團(tuán)更名申請(qǐng)書(shū)
- 2025年電力鐵塔市場(chǎng)分析現(xiàn)狀
- GB 12158-2024防止靜電事故通用要求
- 《教育強(qiáng)國(guó)建設(shè)規(guī)劃綱要(2024-2035年)》全文
- 山東省濱州市2024-2025學(xué)年高二上學(xué)期期末地理試題( 含答案)
- 體育老師籃球說(shuō)課
- 化學(xué)-江蘇省蘇州市2024-2025學(xué)年2025屆高三第一學(xué)期學(xué)業(yè)期末質(zhì)量陽(yáng)光指標(biāo)調(diào)研卷試題和答案
- 蛋雞生產(chǎn)飼養(yǎng)養(yǎng)殖培訓(xùn)課件
- 運(yùn)用PDCA降低住院患者跌倒-墜床發(fā)生率
- 海底撈員工手冊(cè)
- 2024CSCO小細(xì)胞肺癌診療指南解讀
- 立春氣象與生活影響模板
評(píng)論
0/150
提交評(píng)論