DSP2833X_C語言+程序燒寫_第1頁
DSP2833X_C語言+程序燒寫_第2頁
DSP2833X_C語言+程序燒寫_第3頁
DSP2833X_C語言+程序燒寫_第4頁
DSP2833X_C語言+程序燒寫_第5頁
已閱讀5頁,還剩94頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、dsp原理與應(yīng)用the technology interrupt mask register ifr.set 0006h ; interrupt flag register ; system configuration and interrupt registers scsr1.set 7018h ; system control peripheral interrupt acknowledge register 2,file name: vector.h .sectvectors rsvectb start ; reset vector int1b gisr1 ; interrupt lev

2、el 1 int2b gisr2 ; interrupt level 2 int3b gisr3 ; interrupt level 3 int4b gisr4 ; interrupt level 4 int5b gisr5 ; interrupt level 5 int6b gisr6 ; interrupt level 6 reserved b phantom ; reserved sw_int8 b phantom ; software interrupt sw_int9 b phantom ; software interrupt sw_int10 b phantom ; softwa

3、re interrupt sw_int11 b phantom ; software interrupt sw_int12 b phantom ; software interrupt sw_int13 b phantom ; software interrupt sw_int14 b phantom ; software interrupt sw_int15 b phantom ; software interrupt sw_int16 b phantom ; software interrupt trap b phantom ; trap vector nmi b nmi ; nonmas

4、kable interrupt emu_trap b phantom ; emulator trap sw_int20 b phantom ; software interrupt sw_int21 b phantom ; software interrupt sw_int22 b phantom ; software interrupt sw_int23 b phantom ; software interrupt sw_int24 b phantom ; software interrupt,第2.2.9 匯編程序設(shè)計-示例文件,asm文件: 程序文件,file name: spi.asm

5、 .include 280 xa.h .include vector.h .bss gpr0,1 ;general purpose registers. .bss gpr3,1 kick_dog .macro ;watchdog reset macro ldp #00e0h splk #05555h, wdkey splk #0aaaah, wdkey ldp #0h .endm ; m a i n c o d e starts here .text start: ldp #0 setc intm splk #0h,gpr3 out gpr3,wsgr clrc sxm clrc ovm cl

6、rc cnf ldp #wdcr7 splk #006fh,wdcr kick_dog ldp #scsr17 splk #0020h,scsr1,第二章:dsp程序設(shè)計,第2.1節(jié) 概述 第2.2節(jié) dsp匯編語言概述及匯編程序設(shè)計 第2.3節(jié) dsp c語言程序設(shè)計 第2.4節(jié) dsp c與匯編混合編程 第2.5節(jié) dsp程序燒寫 習(xí)題,第2.3節(jié) dsp c語言程序設(shè)計,支持ansi c: 提供相應(yīng)的編譯器和優(yōu)化工具 對ansi c進(jìn)行了限定和擴(kuò)展 運行庫: 字符串操作 動態(tài)地址分配 數(shù)據(jù)轉(zhuǎn)換,第2.3節(jié) dsp c語言程序設(shè)計,變量和標(biāo)識: 變量和標(biāo)識符長度100個字符,區(qū)分大小寫 變

7、量和標(biāo)識符的符號集為ascii,不支持多字節(jié)符號(如漢字)。 字符或字符串常量中的16進(jìn)制esc碼(特殊字符,如0x07)可能會有32位的值。 多字符的字符變量最后一個有效,如abc是c 數(shù)據(jù)類型: size_t(sizeof的結(jié)果)定義為unsigned int ptrdiff_t(指針加減結(jié)果)定義為int 所有的整數(shù)類型(char, short, int, 以及這些類型的無符號型)都是相同類型,并代表16位的二進(jìn)制值. long和unsigned long代表32位二進(jìn)制值,第2.3節(jié) dsp c語言程序設(shè)計,數(shù)據(jù)類型: 有符號數(shù)是用二進(jìn)制補(bǔ)碼表示. 數(shù)據(jù)單元的基礎(chǔ)是字(16位),byt

8、e和word一樣 char是有符號類型,等同于int 枚舉型(enum)用16位值表示,等同于int 浮點類型(float,double)是相同的,遵循tms320c2x/c2xx/c5x的32位浮點類型. long 和float的數(shù)據(jù)存儲格式為低有效字存儲在低地址的方式. long long 和long double是64位的,第2.3節(jié) dsp c語言程序設(shè)計,數(shù)據(jù)類型,第2.3節(jié) dsp c語言程序設(shè)計,類型轉(zhuǎn)換: 浮點數(shù)轉(zhuǎn)為整數(shù)為取整截斷 指針類型(pointer)和int可以自由轉(zhuǎn)換 far pointer 為22位有效位 表達(dá)式: 有符號整數(shù)相除,商符號由兩個數(shù)共同決定,余數(shù)符號同

9、被除數(shù) 10/-3=-3,余1; -10/3=-3余-1 有符號數(shù)右移為算術(shù)右移,符號位不變,第2.3節(jié) dsp c語言程序設(shè)計,c訪問16位乘法結(jié)果的高16位: int m1,m2; int result; result=(long)m1*(long)m2) 16; 浮點數(shù):32bits fpu +,-, 比較(,=,=,=,!=) 同int,long的相互轉(zhuǎn)換 以上操作均通過相應(yīng)的匯編指令(即內(nèi)部硬件機(jī)制)實現(xiàn)。(無fpu時處理浮點運算需要通過浮點數(shù)運算庫,運算效率低,第2.3節(jié) dsp c語言程序設(shè)計,直接訪問寄存器 通過cregister語句實現(xiàn): extern cregister v

10、olatile unsigned int ifr; ifr = 0,第2.3節(jié) dsp c語言程序設(shè)計,預(yù)處理: 預(yù)處理忽略所有不支持的#pragma指令 支持如下#pragma: . code_align code_section data_align data_section fast_func_call func_ext_called interrupt must_interate unroll 預(yù)處理必須在函數(shù)外,在所有聲明之前,第2.3節(jié) dsp c語言程序設(shè)計,code_align: 為某一段程序指定特定的代碼存儲邊界,以保證某函數(shù)代碼存于特定位置。 #pragma code_al

11、ign(func, constant) #pragma code_align(constant) constant必須是2的冪次,以保證內(nèi)存邊界問題,第2.3節(jié) dsp c語言程序設(shè)計,code_section: 為某一段程序指定特定的代碼存儲段,以便單獨分配存儲空間 #pragma code_section(symbol, “section_name”) #pragma code_section(“section_name”) 例:#pragma code_section(fn, “my_sect”) int fn(int x) return 0; 匯編結(jié)果: .file “coden.c”

12、 .sect ”my_sect” .global _fn .sym _fn,_fn,36,2,0 .func 3,第2.3節(jié) dsp c語言程序設(shè)計,data_align: 為某一段數(shù)據(jù)指定特定的代碼存儲邊界,以保證特定數(shù)據(jù)存于特定位置。 #pragma data_align(symbol,constant) #pragma data_align(constant) constant必須是2的冪次,以保證內(nèi)存邊界問題,第2.3節(jié) dsp c語言程序設(shè)計,data_section: 為某一段數(shù)據(jù)指定特定的數(shù)據(jù)存儲段,以便單獨分配存儲空間,例如同.bss內(nèi)存分開,或單獨分配連續(xù)的存儲空間 #pra

13、gma data_section(symbol, “section_name”) 例:#pragma data_section(bufferb, “bufferb_sect”) char buffera512; char bufferb512; 匯編結(jié)果: .global _buffera .bss _buffera, 512, 4 .global _bufferb _bufferb:.usect “bufferb_sect”,512,4,第2.3節(jié) dsp c語言程序設(shè)計,sections vectors: pmpage 0 .text : pmpage 0 .bss : blk_b2pag

14、e 1 .data : blk_b1page 1 bufferb_sect : saram_d page 1,第2.3節(jié) dsp c語言程序設(shè)計,fast_func_call: 指明某一函數(shù)調(diào)用時采用快速函數(shù)調(diào)用(ffc)機(jī)制,而不是使用普通函數(shù)調(diào)用流程: ffc進(jìn)棧出棧及函數(shù)返回有所不同,調(diào)用更快速。 #pragma fast_func_call (func) 這類函數(shù)返回時的asm代碼必須是: lb *xar7,第2.3節(jié) dsp c語言程序設(shè)計,func_ext_called: 指明某一未使用的函數(shù),使其不會在c優(yōu)化時被刪除。 #pragma func_ext_called (func,

15、第2.3節(jié) dsp c語言程序設(shè)計,interrupt: 指明函數(shù)為中斷處理函數(shù)(函數(shù)返回機(jī)制使用irp) #pragma interrupt ( func ); #pragma interrupt; #pragma interrupt (func, hpi|lpi); #pragma interrupt ( hpi|lpi);) fpu有高優(yōu)先級中斷(hpi)和低優(yōu)先級中斷(lpi)處理機(jī)制,通過此預(yù)編譯實現(xiàn),第2.3節(jié) dsp c語言程序設(shè)計,must_iterate: 指明循環(huán)必須被執(zhí)行的次數(shù),以防止循環(huán)被優(yōu)化掉 #pragma must_iterate (min,max,mult);

16、有時通過空循環(huán)建立必須的延時,單在程序優(yōu)化時會被自動優(yōu)化掉。 例如: for( i=0; i100; i+) 編譯器在優(yōu)化時會去掉此循環(huán),使用must_iterate可以保證此循環(huán)執(zhí)行,第2.3節(jié) dsp c語言程序設(shè)計,嵌入?yún)R編代碼: asm(“assembler text”); 例如: asm(“clrc intm”); 編譯器不會進(jìn)行語法檢查,直接生成匯編代碼 嵌入的匯編指令應(yīng)不破壞c語言的環(huán)境,例如堆棧結(jié)構(gòu)、當(dāng)前ar等,或不可控的跳轉(zhuǎn)等。 帶asm語句的代碼,使用優(yōu)化器時須小心,因為優(yōu)化器可能會改變asm語句附近的代碼順序,而引起不期望的結(jié)果,第2.3節(jié) dsp c語言程序設(shè)計,訪問i

17、o:先定義io端口號,然后使用 ioport type porthex_num type用16位數(shù)據(jù)表示 例:ioport int portd0ff;/*io端口d0ff*/ portd0ff=a; /*輸出a值到portd0ff*/ b=portd0ff; /*讀輸入portd0ff值到b*/ in *+fp7,*(0d0ffh) ioport變量定義必須在文件頭位置定義,不能在函數(shù)中定義.ioport變量的使用跟普通變量一樣。 call(portd0ff); a=portd0ff+b; portd0ff+=a,第2.3節(jié) dsp c語言程序設(shè)計,中斷處理:查詢式和回調(diào)(中斷服務(wù)程序)兩種方

18、式。 查詢式: 程序中查詢中斷標(biāo)志及相應(yīng)的寄存器,判斷中斷的發(fā)生并進(jìn)行相應(yīng)處理。 優(yōu)點:流程易于控制,不會發(fā)生中斷嵌套問題,一般不會丟失中斷。 缺點:中斷實時性差,第2.3節(jié) dsp c語言程序設(shè)計,回調(diào)式: 為中斷指定回調(diào)處理函數(shù)(中斷服務(wù)程序),由cpu中斷處理機(jī)制自動調(diào)用。 優(yōu)點:中斷實時性好,程序結(jié)構(gòu)簡潔,類似于windows的消息驅(qū)動機(jī)制。 缺點:處理不好容易造成中斷嵌套或丟失中斷,造成邏輯混亂,第2.3節(jié) dsp c語言程序設(shè)計,中斷服務(wù)函數(shù):兩種方式定義中斷服務(wù)函數(shù)。 a)c_intd方式定義的函數(shù),c_int00作系統(tǒng)復(fù)位函數(shù) b)interrupt關(guān)鍵詞定義的函數(shù)。 例: v

19、oid c_int01() interrupt void timer2_isr(),第2.3節(jié) dsp c語言程序設(shè)計,中斷服務(wù)函數(shù)與相應(yīng)的中斷對應(yīng): 通過vectors字段對應(yīng): * cvectors.asm .ref _c_int00, _timer2_isr .sect ”vectors” rset: b _c_int00 ;00h reset int1: b int1 ;02h int1 int2: b int2 ;04h int2 int3: b _timer2_isr ;06h int3 int4: b int4 ;08h int4,第2.3節(jié) dsp c語言程序設(shè)計,cmd文件:

20、 memory page 0: /* program memory */ vecs: org=00000h, len=00040h /* internal flash */ sections /* sections generated by the ccompiler */ .text: flash page 0 /* initialized */ /* sections declared by the user */ vectors: vecs page 0 /* initialized */,第2.3節(jié) dsp c語言程序設(shè)計,中斷服務(wù)函數(shù): 中斷服務(wù)函數(shù)類型必須是void。 中斷服務(wù)函數(shù)

21、要盡量短小,減少中斷服務(wù)占用時間,以避免發(fā)生中斷嵌套或丟中斷。 多個中斷可以共用一個中斷服務(wù)函數(shù),除了int00。 注意imr、intm等中斷控制量的設(shè)置。 中斷服務(wù)函數(shù)可能和某些編譯選項和優(yōu)化沖突,需注意協(xié)調(diào),第2.3節(jié) dsp c語言程序設(shè)計,中斷服務(wù)函數(shù): 中斷服務(wù)函數(shù)可以像其他函數(shù)一樣訪問全局變量、分配局部變量和調(diào)用其它函數(shù)。 進(jìn)入中斷服務(wù)函數(shù),編譯器自動保護(hù)與運行上下文相關(guān)的寄存器,并在中斷服務(wù)函數(shù)結(jié)束時恢復(fù)運行環(huán)境。但并不保存所有寄存器 中斷服務(wù)程序可以任意修改不被保護(hù)的寄存器,如外設(shè)控制寄存器。 中斷服務(wù)函數(shù)也可以被其他c程序調(diào)用,但效率較差。 c_int00是系統(tǒng)保留的復(fù)位中斷

22、函數(shù),不會被調(diào)用,也不需要保護(hù)任何寄存器。 中斷服務(wù)函數(shù)入口地址放在相應(yīng)的中斷向量處,第2.3節(jié) dsp c語言程序設(shè)計,第二章:dsp程序設(shè)計,第2.1節(jié) 概述 第2.2節(jié) dsp匯編語言概述及匯編程序設(shè)計 第2.3節(jié) dsp c語言程序設(shè)計 第2.4節(jié) dsp c與匯編混合編程 第2.5節(jié) dsp程序燒寫 習(xí)題,第2.4節(jié) dsp c與匯編混合編程,c語言和匯編語言混合編程的四種方法 (1) 獨立編寫匯編程序和c程序,分開編譯或匯編成各自的目標(biāo)代碼模塊,再用鏈接器將二者鏈接起來。這種方法比較靈活,但是設(shè)計者必須自己維護(hù)各匯編模塊的入口和出口代碼,自己計算傳遞的參數(shù)在堆棧中的偏移量,工作量較

23、大,但是能做到對程序的絕對控制。 (2) 在c程序中使用匯編程序中定義的變量和常數(shù)。 (3) 在c程序中內(nèi)嵌匯編語句。這種方法可以實現(xiàn)c語言無法實現(xiàn)的一些硬件控制功能,如修改中斷控制寄存器。 (4) 將c語言編譯生成相應(yīng)的匯編代碼,手工修改和優(yōu)化c編譯器生成的匯編代碼。采用這種方法可以控制c編譯器,從而產(chǎn)生具有交叉列表的匯編程序,而設(shè)計者可以對其中的匯編語句進(jìn)行修改,然后對匯編程序進(jìn)行編譯,產(chǎn)生目標(biāo)文件。 后3種方法由于在c中直接嵌入了匯編語言,易造成程序混亂,破壞c環(huán)境,甚至導(dǎo)致程序崩潰,而開發(fā)者又很難對不良結(jié)果進(jìn)行預(yù)期和有效控制。而如果采用第一種方法,只要遵循有關(guān)c語言函數(shù)調(diào)用規(guī)則和寄存器

24、規(guī)則,就能預(yù)見到程序運行的結(jié)果,保證程序正確,第2.4節(jié) dsp c與匯編混合編程,dsp c編譯器將存儲空間分為兩個線性空間: 程序存儲空間,存儲可執(zhí)行碼 數(shù)據(jù)存儲空間,存儲程序執(zhí)行過程中的數(shù)據(jù)和堆棧 編譯器將存儲空間以分段(section)的方式分配和管理。用戶以不同的方式分配存儲器,可以形成不同的系統(tǒng)配置,連接器將各個段連接在一起形成最終完整的存儲器結(jié)構(gòu)。 *注意:是由連接器決定存儲器影射而不是由編譯器,第2.4節(jié) dsp c與匯編混合編程,已初始化的段,第2.4節(jié) dsp c與匯編混合編程,未初始化的段,匯編自動生成.text,.bss和.data段。c編譯器不使用.data段,第2.

25、4節(jié) dsp c與匯編混合編程,用戶定義的段: 用戶使用code_section,data_section定義的段,如上面的 my_sect, bufferb_sect,第2.4節(jié) dsp c與匯編混合編程,*/ / linker command file link.cmd /*/ -c /* rom autoinitialization model */ -m example.map /* create a map file */ -o example.out /* output file name */ main.obj /* first c module */ sub.obj /* se

26、cond c module */ asm.obj /* assembly language module */ l rts25.lib /* runtimesupport library */ l matrix.lib /* object library *,memory page 0 : prog: origin = 30h, length = 0efd0h page 1 : data: origin = 800h length 0e800h sections .text prog page 0 .cinit prog page 0 .switch prog page 0 .bss data

27、 page 1 .const data page 1 .sysmem data page 1 .stack data page 1,第2.4節(jié) dsp c與匯編混合編程,系統(tǒng)堆棧: dsp 硬堆棧:8級,用于保存函數(shù)調(diào)用、中斷服務(wù)函數(shù)等的返回地址,也可以用push等保存其他變量 c編譯器可以生成一定大小的軟堆棧: 分配局部變量 傳遞函數(shù)參數(shù) 保存處理器狀態(tài) 保存函數(shù)返回地址 保存臨時結(jié)果 保存寄存器內(nèi)容,第2.4節(jié) dsp c與匯編混合編程,系統(tǒng)堆棧: 編譯器利用兩個輔助寄存器來管理堆棧: sp堆棧指針(stack pointer),指向當(dāng)前堆棧頂。 xar2幀指針(fp, frame poi

28、nter),指向當(dāng)前幀的起始點,每個函數(shù)都會在堆棧頂部建立一個新的幀,用來保存局部或臨時變量。 c語言環(huán)境自動操作這兩個寄存器。如果編寫用到堆棧的匯 編語言程序,一定要注意正確使用這兩個寄存器。 默認(rèn)堆棧大小是1k。用-stack連接選項可以指定軟件堆棧的大小,用c編寫dsp程序一定注意保留足夠的堆??臻g! 注意:編譯器不會檢查堆棧溢出情況,堆棧溢出會破壞dsp運行環(huán)境,導(dǎo)致程序失敗。編寫dsp程序和配置dsp存儲器資源要注意防止堆棧溢出的發(fā)生,第2.4節(jié) dsp c與匯編混合編程,動態(tài)內(nèi)存分配: tms320c2x/c2xx/c5x c語言可調(diào)用malloc、calloc或realloc 函

29、數(shù)動態(tài)申請內(nèi)存,申請的內(nèi)存將分配在.sysmem塊。 動態(tài)分配的內(nèi)存只能通過指針進(jìn)行訪問,動態(tài)分配使用后可以釋放,這樣可以用于其它目的。將大數(shù)組通過這種方式來分配可以節(jié)省.bss塊的空間。 通過連接器的-heap選項可以定義.sysmem塊。 unsigned int data100; unsigned int *data; data =(unsigned int *) malloc (100 * sizeof (unsigned int,第2.4節(jié) dsp c與匯編混合編程,寄存器使用規(guī)則: tms320c2x/c2xx/c5x運行環(huán)境對寄存器的使用有嚴(yán)格的要求,編寫涉及到寄存器的匯編程序,

30、必須嚴(yán)格遵守這些規(guī)則,否則可能造成系統(tǒng)工作異常。寄存器規(guī)則規(guī)定了編譯器如何使用寄存器,和寄存器在函數(shù)調(diào)用的過程中如何進(jìn)行保護(hù)。 寄存器按照保護(hù)方式分為兩種: 調(diào)用保存(save on call),調(diào)用其它函數(shù)的函數(shù)負(fù)責(zé)保存這些寄存器的內(nèi)容。 入口保存(save on entry),被調(diào)用的函數(shù)負(fù)責(zé)保存這些寄存器的內(nèi)容。 注:無論是否使用優(yōu)化編譯,都必須遵守這些寄存器規(guī)則,第2.4節(jié) dsp c與匯編混合編程,寄存器使用規(guī)則,第2.4節(jié) dsp c與匯編混合編程,寄存器使用規(guī)則,第2.4節(jié) dsp c與匯編混合編程,狀態(tài)寄存器使用,第2.4節(jié) dsp c與匯編混合編程,函數(shù)調(diào)用規(guī)則: tms32

31、0c2x/c2xx/c5x運行環(huán)境對函數(shù)調(diào)用有嚴(yán)格的要求,要調(diào)用c函數(shù)或要被c程序調(diào)用的匯編語言程序必須遵守這些規(guī)則,否則可能破壞c運行環(huán)境,造成程序失敗。 當(dāng)進(jìn)行函數(shù)調(diào)用時,調(diào)用者要將傳遞參數(shù)壓入系統(tǒng)堆棧傳給被調(diào)用的函數(shù),并將函數(shù)返回地址壓棧。 被調(diào)用的函數(shù)要在函數(shù)運行結(jié)束時將返回值放在累加器里返回給調(diào)用者函數(shù)。 函數(shù)參數(shù)及返回地址等都是通過堆棧傳遞的,要編寫匯編函數(shù),必須明確函數(shù)調(diào)用的過程中堆棧的變化和應(yīng)該進(jìn)行的處理,函數(shù)調(diào)用過程中堆棧情況,第2.4節(jié) dsp c與匯編混合編程,c語言調(diào)用函數(shù)時的工作: 將參數(shù)反向壓入堆棧(最右端的參數(shù)最先壓棧,最左端的參數(shù)最后壓棧),這樣,當(dāng)函數(shù)被調(diào)用時

32、,最左端的參數(shù)會在堆棧的最頂部。 使用被調(diào)用函數(shù)。 被調(diào)用函數(shù)返回前處理各寄存器。 當(dāng)被調(diào)用函數(shù)運行結(jié)束時,調(diào)用者函數(shù)要將壓入堆棧的參數(shù)彈出以恢復(fù)堆棧狀態(tài)。 注:如果用c程序調(diào)用匯編語言程序,c編譯器會自動產(chǎn)生代碼完成這些工作,第2.4節(jié) dsp c與匯編混合編程,c語言函數(shù)被調(diào)用時的工作: 將返回地址從硬件堆棧彈出,壓入軟件堆棧。 將fp(sp)壓入軟件堆棧。 分配局部幀(frame)。 如果函數(shù)中要修改ar6、ar7,將它們壓入堆棧,其它寄存器不用進(jìn)行保護(hù)就可以進(jìn)行修改。 實現(xiàn)函數(shù)功能。 如果函數(shù)返回標(biāo)量數(shù)據(jù),將它放入累加器。 如果保護(hù)了ar6、ar7,恢復(fù)這兩個寄存器。 刪除局部幀。 恢

33、復(fù)fp(sp)。 將返回地址從軟件堆棧中彈出,壓入硬件堆棧。 返回,第2.4節(jié) dsp c與匯編混合編程,popd *+; 返回地址從硬堆棧中彈出,壓入軟堆棧(由ar1指示) sar ar0,*+; ar0(fp)入軟堆棧 sar ar1,*; ar1(sp)入軟堆棧 lark ar0,size ; fp=局部幀大小 lar ar0,*0+ ; fp = sp, sp += size: 分配局部幀 sar ar6,*+ ; 保存ar6 sar ar7,*+ ; 保存ar7 .; 函數(shù)功能部分 mar *,ar1 ; 設(shè)置當(dāng)前ar為ar1 mar *-; lar ar7,*-; 恢復(fù)ar7 la

34、r ar6,*-; 恢復(fù)ar6 sbrk size+1 ; 釋放局部幀(恢復(fù)ar1(sp) lar ar0,*-; 恢復(fù)ar0(fp) pshd *; 返回地址壓入硬堆棧 ret; 返回,第2.4節(jié) dsp c與匯編混合編程,一些特殊的情況: 返回一個結(jié)構(gòu):當(dāng)函數(shù)的返回值為一個結(jié)構(gòu)時,調(diào)用者負(fù)責(zé)分配存儲空間,并將存儲空間地址作為最后一個輸入?yún)?shù)傳遞給被調(diào)用函數(shù)。被調(diào)用函數(shù)將要返回的結(jié)構(gòu)拷貝到這個參數(shù)所指向的內(nèi)存空間。 不將返回地址移動到軟件堆棧:當(dāng)被調(diào)用函數(shù)不再調(diào)用其它函數(shù),或者確定調(diào)用深度不會超過8級,可以不用將返回地址移動到軟件堆棧。 不分配局部幀:如果函數(shù)沒有輸入?yún)?shù),不使用局部變量,就

35、不需要修改xar2(fp),因此也不需要對其進(jìn)行保護(hù),第2.4節(jié) dsp c與匯編混合編程,c與匯編混合: c程序調(diào)用匯編函數(shù)必須要滿足前面介紹的調(diào)用規(guī)則和寄存器規(guī)則,c程序可以訪問匯編語言定義的變量或調(diào)用匯編語言函數(shù),同樣匯編語言也可以訪問c程序定義的變量或調(diào)用c函數(shù)。用c程序調(diào)用匯編函數(shù)有以下注意事項: 所有的函數(shù)(不論用c編寫還是用匯編語言編寫)都必須滿足前面介紹的寄存器規(guī)則。 對于一些寄存器,如果函數(shù)要修改其內(nèi)容,則必須事先對其進(jìn)行保護(hù)。這些寄存器包括:xar2(fp),sp,ar6,ar7。其它的寄存器可以不用保護(hù)自由使用,第2.4節(jié) dsp c與匯編混合編程,注意事項: 如果函數(shù)改

36、變了狀態(tài)寄存器某些有假定值的位,則必須在函數(shù)結(jié)束前恢復(fù)其原有值。尤其要注意arp必須為ar1。 中斷服務(wù)程序必須保護(hù)所有其用到的寄存器。 long型和float型變量在存儲器中的存儲方式為低有效位在低端地址。 函數(shù)返回值要通過累加器進(jìn)行傳遞。 編譯器會在所有對象的名稱前面加下橫線“_”,因此匯編語言模塊定義對象名稱時也要以下橫線為前綴,才能使定義的對象可以被c代碼訪問。例如c語言對象x在匯編語言中就是_x。匯編語言可以使用任何不帶下橫線前綴的變量而不會和c語言對象沖突。 任何匯編語言定義的對象,如果要被c程序訪問,則必須用.global修飾。同樣任何c語言定義的對象,如果要被匯編語言訪問,也必

37、須以.global修飾。 c和匯編互相調(diào)用函數(shù)時,需保證參數(shù)壓棧和出棧的一致性,第2.4節(jié) dsp c與匯編混合編程,第2.4節(jié) dsp c與匯編混合編程,c中訪問匯編變量:通常有兩種方式。 1.訪問.bss塊中的變量: 將要訪問的變量定義在.bss塊中。 用.golbal修飾要訪問的變量。 在匯編語言中以下橫線“_”為前綴聲明要訪問的變量。 在c語言中將變量聲明為外部變量(extern),就可以進(jìn)行正常訪問。 c:extern int var; var = 1; asm:.bss _var,a1,a2 .global _var,第2.4節(jié) dsp c與匯編混合編程,2.訪問非.bss塊中的變

38、量:一般使用指針查表獲得 首先定義變量,而且最好放在獨立的初始化塊中。 定義一個全局的標(biāo)識指向?qū)ο蟮钠鹗键c,這樣對象可以分配在存儲器空間的任何位置。 在c程序中將這個對象定義為外部對象(extern),并且對象名稱不帶下橫線“_”前綴,就可以對其進(jìn)行正常訪問。 c:extern float sine; f=sine2; asm:.global _sine _sine:.float 0.0 .float 0.015987 .float 0.022145,第2.4節(jié) dsp c與匯編混合編程,修改c編譯器輸出的匯編程序 程序設(shè)計者可以檢查和修改c編譯器輸出的匯編語言程序,然后再對其進(jìn)行匯編編譯和連接。 在c語言可以使用內(nèi)嵌匯編語句在編譯輸出結(jié)果中添加注釋,以改善編譯器輸出匯

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論