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

下載本文檔

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

文檔簡(jiǎn)介

1、DSP原理與應(yīng)用The Technology File name: 280 x.h IMR.set 0004h ; 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 ; Res

2、et Vector INT1B GISR1 ; Interrupt Level 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

3、Interrupt SW_INT10 B PHANTOM ; Software 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 PHA

4、NTOM ; Trap vector NMI B NMI ; Nonmaskable 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è)

5、計(jì)-示例文件,.asm文件: 程序文件,* File Name: SPI.asm .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

6、,GPR3 OUT GPR3,WSGR CLRC SXM CLRC OVM CLRC CNF LDP #WDCR7 SPLK #006Fh,WDCR KICK_DOG LDP #SCSR17 SPLK #0020h,SCSR1,第二章:DSP程序設(shè)計(jì),第2.1節(jié) 概述 第2.2節(jié) DSP匯編語言概述及匯編程序設(shè)計(jì) 第2.3節(jié) DSP C語言程序設(shè)計(jì) 第2.4節(jié) DSP C與匯編混合編程 第2.5節(jié) DSP程序燒寫 習(xí)題,第2.3節(jié) DSP C語言程序設(shè)計(jì),支持ANSI C: 提供相應(yīng)的編譯器和優(yōu)化工具 對(duì)ANSI C進(jìn)行了限定和擴(kuò)展 運(yùn)行庫: 字符串操作 動(dòng)態(tài)地址分配 數(shù)據(jù)轉(zhuǎn)換 ,第2.3節(jié)

7、DSP C語言程序設(shè)計(jì),變量和標(biāo)識(shí): 變量和標(biāo)識(shí)符長度100個(gè)字符,區(qū)分大小寫 變量和標(biāo)識(shí)符的符號(hào)集為ASCII,不支持多字節(jié)符號(hào)(如漢字)。 字符或字符串常量中的16進(jìn)制ESC碼(特殊字符,如0X07)可能會(huì)有32位的值。 多字符的字符變量最后一個(gè)有效,如abc是c 數(shù)據(jù)類型: Size_t(sizeof的結(jié)果)定義為unsigned int Ptrdiff_t(指針加減結(jié)果)定義為int 所有的整數(shù)類型(char, short, int, 以及這些類型的無符號(hào)型)都是相同類型,并代表16位的二進(jìn)制值. Long和unsigned long代表32位二進(jìn)制值.,第2.3節(jié) DSP C語言程序

8、設(shè)計(jì),數(shù)據(jù)類型: 有符號(hào)數(shù)是用二進(jìn)制補(bǔ)碼表示. 數(shù)據(jù)單元的基礎(chǔ)是字(16位),BYTE和WORD一樣 char是有符號(hào)類型,等同于int 枚舉型(enum)用16位值表示,等同于int 浮點(diǎn)類型(float,double)是相同的,遵循TMS320C2x/C2xx/C5x的32位浮點(diǎn)類型. Long 和float的數(shù)據(jù)存儲(chǔ)格式為低有效字存儲(chǔ)在低地址的方式. Long long 和long double是64位的.,第2.3節(jié) DSP C語言程序設(shè)計(jì),數(shù)據(jù)類型:,第2.3節(jié) DSP C語言程序設(shè)計(jì),類型轉(zhuǎn)換: 浮點(diǎn)數(shù)轉(zhuǎn)為整數(shù)為取整截?cái)?指針類型(pointer)和int可以自由轉(zhuǎn)換 far po

9、inter 為22位有效位 表達(dá)式: 有符號(hào)整數(shù)相除,商符號(hào)由兩個(gè)數(shù)共同決定,余數(shù)符號(hào)同被除數(shù) 10/-3=-3,余1; -10/3=-3余-1 有符號(hào)數(shù)右移為算術(shù)右移,符號(hào)位不變,第2.3節(jié) DSP C語言程序設(shè)計(jì),C訪問16位乘法結(jié)果的高16位: int m1,m2; int result; result=(long)m1*(long)m2) 16; 浮點(diǎn)數(shù):32bits FPU +,-, 比較(,=,=,=,!=) 同int,long的相互轉(zhuǎn)換 以上操作均通過相應(yīng)的匯編指令(即內(nèi)部硬件機(jī)制)實(shí)現(xiàn)。(無FPU時(shí)處理浮點(diǎn)運(yùn)算需要通過浮點(diǎn)數(shù)運(yùn)算庫,運(yùn)算效率低),第2.3節(jié) DSP C語言程序設(shè)

10、計(jì),直接訪問寄存器 通過cregister語句實(shí)現(xiàn): extern cregister volatile unsigned int IFR; IFR = 0;,第2.3節(jié) DSP C語言程序設(shè)計(jì),預(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è)計(jì),CODE_ALIGN: 為某一

11、段程序指定特定的代碼存儲(chǔ)邊界,以保證某函數(shù)代碼存于特定位置。 #pragma CODE_ALIGN(func, constant) #pragma CODE_ALIGN(constant) Constant必須是2的冪次,以保證內(nèi)存邊界問題,第2.3節(jié) DSP C語言程序設(shè)計(jì),CODE_SECTION: 為某一段程序指定特定的代碼存儲(chǔ)段,以便單獨(dú)分配存儲(chǔ)空間 #pragma CODE_SECTION(symbol, “section_name”) #pragma CODE_SECTION(“section_name”) 例:#pragma CODE_SECTION(fn, “my_sect”)

12、 int fn(int x) return 0; 匯編結(jié)果: .file “CODEN.c” .sect ”my_sect” .global _fn .sym _fn,_fn,36,2,0 .func 3,第2.3節(jié) DSP C語言程序設(shè)計(jì),DATA_ALIGN: 為某一段數(shù)據(jù)指定特定的代碼存儲(chǔ)邊界,以保證特定數(shù)據(jù)存于特定位置。 #pragma DATA_ALIGN(symbol,constant) #pragma DATA_ALIGN(constant) Constant必須是2的冪次,以保證內(nèi)存邊界問題,第2.3節(jié) DSP C語言程序設(shè)計(jì),DATA_SECTION: 為某一段數(shù)據(jù)指定特定的

13、數(shù)據(jù)存儲(chǔ)段,以便單獨(dú)分配存儲(chǔ)空間,例如同.bss內(nèi)存分開,或單獨(dú)分配連續(xù)的存儲(chǔ)空間 #pragma 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è)計(jì),SECTIONS VECTO

14、RS: PMPAGE 0 .TEXT : PMPAGE 0 .BSS : BLK_B2PAGE 1 .DATA : BLK_B1PAGE 1 BufferB_sect : SARAM_D PAGE 1 ,第2.3節(jié) DSP C語言程序設(shè)計(jì),FAST_FUNC_CALL: 指明某一函數(shù)調(diào)用時(shí)采用快速函數(shù)調(diào)用(FFC)機(jī)制,而不是使用普通函數(shù)調(diào)用流程: FFC進(jìn)棧出棧及函數(shù)返回有所不同,調(diào)用更快速。 #pragma FAST_FUNC_CALL (func) 這類函數(shù)返回時(shí)的asm代碼必須是: LB *XAR7,第2.3節(jié) DSP C語言程序設(shè)計(jì),FUNC_EXT_CALLED: 指明某一未使用的

15、函數(shù),使其不會(huì)在C優(yōu)化時(shí)被刪除。 #pragma FUNC_EXT_CALLED (func),第2.3節(jié) DSP C語言程序設(shè)計(jì),INTERRUPT: 指明函數(shù)為中斷處理函數(shù)(函數(shù)返回機(jī)制使用IRP) #pragma INTERRUPT ( func ); #pragma INTERRUPT; #pragma INTERRUPT (func, HPI|LPI); #pragma INTERRUPT ( HPI|LPI);) FPU有高優(yōu)先級(jí)中斷(HPI)和低優(yōu)先級(jí)中斷(LPI)處理機(jī)制,通過此預(yù)編譯實(shí)現(xiàn)。,第2.3節(jié) DSP C語言程序設(shè)計(jì),MUST_ITERATE: 指明循環(huán)必須被執(zhí)行的次

16、數(shù),以防止循環(huán)被優(yōu)化掉 #pragma MUST_ITERATE (min,max,mult); 有時(shí)通過空循環(huán)建立必須的延時(shí),單在程序優(yōu)化時(shí)會(huì)被自動(dòng)優(yōu)化掉。 例如: For( i=0; i100; i+) 編譯器在優(yōu)化時(shí)會(huì)去掉此循環(huán),使用MUST_ITERATE可以保證此循環(huán)執(zhí)行。,第2.3節(jié) DSP C語言程序設(shè)計(jì),嵌入?yún)R編代碼: asm(“assembler text”); 例如: asm(“clrc intm”); 編譯器不會(huì)進(jìn)行語法檢查,直接生成匯編代碼 嵌入的匯編指令應(yīng)不破壞C語言的環(huán)境,例如堆棧結(jié)構(gòu)、當(dāng)前AR等,或不可控的跳轉(zhuǎn)等。 帶asm語句的代碼,使用優(yōu)化器時(shí)須小心,因?yàn)閮?yōu)化

17、器可能會(huì)改變asm語句附近的代碼順序,而引起不期望的結(jié)果.,第2.3節(jié) DSP C語言程序設(shè)計(jì),訪問IO:先定義io端口號(hào),然后使用 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; p

18、ortd0ff+=a;,第2.3節(jié) DSP C語言程序設(shè)計(jì),中斷處理:查詢式和回調(diào)(中斷服務(wù)程序)兩種方式。 查詢式: 程序中查詢中斷標(biāo)志及相應(yīng)的寄存器,判斷中斷的發(fā)生并進(jìn)行相應(yīng)處理。 優(yōu)點(diǎn):流程易于控制,不會(huì)發(fā)生中斷嵌套問題,一般不會(huì)丟失中斷。 缺點(diǎn):中斷實(shí)時(shí)性差。,第2.3節(jié) DSP C語言程序設(shè)計(jì),回調(diào)式: 為中斷指定回調(diào)處理函數(shù)(中斷服務(wù)程序),由CPU中斷處理機(jī)制自動(dòng)調(diào)用。 優(yōu)點(diǎn):中斷實(shí)時(shí)性好,程序結(jié)構(gòu)簡(jiǎn)潔,類似于windows的消息驅(qū)動(dòng)機(jī)制。 缺點(diǎn):處理不好容易造成中斷嵌套或丟失中斷,造成邏輯混亂。,第2.3節(jié) DSP C語言程序設(shè)計(jì),中斷服務(wù)函數(shù):兩種方式定義中斷服務(wù)函數(shù)。 a)

19、c_intd方式定義的函數(shù),c_int00作系統(tǒng)復(fù)位函數(shù) b)Interrupt關(guān)鍵詞定義的函數(shù)。 例: void c_int01() interrupt void timer2_isr() ,第2.3節(jié) DSP C語言程序設(shè)計(jì),中斷服務(wù)函數(shù)與相應(yīng)的中斷對(duì)應(yīng): 通過vectors字段對(duì)應(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 ;0

20、6h INT3 int4: B int4 ;08h INT4,第2.3節(jié) DSP C語言程序設(shè)計(jì),cmd文件: 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 /* initializ

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

22、的寄存器,如外設(shè)控制寄存器。 中斷服務(wù)函數(shù)也可以被其他c程序調(diào)用,但效率較差。 c_int00是系統(tǒng)保留的復(fù)位中斷函數(shù),不會(huì)被調(diào)用,也不需要保護(hù)任何寄存器。 中斷服務(wù)函數(shù)入口地址放在相應(yīng)的中斷向量處。,第2.3節(jié) DSP C語言程序設(shè)計(jì),第二章:DSP程序設(shè)計(jì),第2.1節(jié) 概述 第2.2節(jié) DSP匯編語言概述及匯編程序設(shè)計(jì) 第2.3節(jié) DSP C語言程序設(shè)計(jì) 第2.4節(jié) DSP C與匯編混合編程 第2.5節(jié) DSP程序燒寫 習(xí)題,第2.4節(jié) DSP C與匯編混合編程,C語言和匯編語言混合編程的四種方法 (1) 獨(dú)立編寫匯編程序和C程序,分開編譯或匯編成各自的目標(biāo)代碼模塊,再用鏈接器將二者鏈接起

23、來。這種方法比較靈活,但是設(shè)計(jì)者必須自己維護(hù)各匯編模塊的入口和出口代碼,自己計(jì)算傳遞的參數(shù)在堆棧中的偏移量,工作量較大,但是能做到對(duì)程序的絕對(duì)控制。 (2) 在C程序中使用匯編程序中定義的變量和常數(shù)。 (3) 在C程序中內(nèi)嵌匯編語句。這種方法可以實(shí)現(xiàn)C語言無法實(shí)現(xiàn)的一些硬件控制功能,如修改中斷控制寄存器。 (4) 將C語言編譯生成相應(yīng)的匯編代碼,手工修改和優(yōu)化C編譯器生成的匯編代碼。采用這種方法可以控制C編譯器,從而產(chǎn)生具有交叉列表的匯編程序,而設(shè)計(jì)者可以對(duì)其中的匯編語句進(jìn)行修改,然后對(duì)匯編程序進(jìn)行編譯,產(chǎn)生目標(biāo)文件。 后3種方法由于在C中直接嵌入了匯編語言,易造成程序混亂,破壞C環(huán)境,甚至導(dǎo)

24、致程序崩潰,而開發(fā)者又很難對(duì)不良結(jié)果進(jìn)行預(yù)期和有效控制。而如果采用第一種方法,只要遵循有關(guān)C語言函數(shù)調(diào)用規(guī)則和寄存器規(guī)則,就能預(yù)見到程序運(yùn)行的結(jié)果,保證程序正確。,第2.4節(jié) DSP C與匯編混合編程,DSP C編譯器將存儲(chǔ)空間分為兩個(gè)線性空間: 程序存儲(chǔ)空間,存儲(chǔ)可執(zhí)行碼 數(shù)據(jù)存儲(chǔ)空間,存儲(chǔ)程序執(zhí)行過程中的數(shù)據(jù)和堆棧 編譯器將存儲(chǔ)空間以分段(section)的方式分配和管理。用戶以不同的方式分配存儲(chǔ)器,可以形成不同的系統(tǒng)配置,連接器將各個(gè)段連接在一起形成最終完整的存儲(chǔ)器結(jié)構(gòu)。 *注意:是由連接器決定存儲(chǔ)器影射而不是由編譯器。,第2.4節(jié) DSP C與匯編混合編程,已初始化的段:,第2.4節(jié)

25、DSP C與匯編混合編程,未初始化的段:,匯編自動(dòng)生成.text,.bss和.data段。C編譯器不使用.data段。,第2.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 /*

26、 Output file name */ main.obj /* First C module */ sub.obj /* Second 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 .

27、text PROG PAGE 0 .cinit PROG PAGE 0 .switch PROG PAGE 0 .bss DATA PAGE 1 .const DATA PAGE 1 .sysmem DATA PAGE 1 .stack DATA PAGE 1 ,第2.4節(jié) DSP C與匯編混合編程,系統(tǒng)堆棧: DSP 硬堆棧:8級(jí),用于保存函數(shù)調(diào)用、中斷服務(wù)函數(shù)等的返回地址,也可以用PUSH等保存其他變量 C編譯器可以生成一定大小的軟堆棧: 分配局部變量 傳遞函數(shù)參數(shù) 保存處理器狀態(tài) 保存函數(shù)返回地址 保存臨時(shí)結(jié)果 保存寄存器內(nèi)容,第2.4節(jié) DSP C與匯編混合編程,系統(tǒng)堆棧: 編譯器利用

28、兩個(gè)輔助寄存器來管理堆棧: SP堆棧指針(Stack Pointer),指向當(dāng)前堆棧頂。 XAR2幀指針(FP, Frame Pointer),指向當(dāng)前幀的起始點(diǎn),每個(gè)函數(shù)都會(huì)在堆棧頂部建立一個(gè)新的幀,用來保存局部或臨時(shí)變量。 C語言環(huán)境自動(dòng)操作這兩個(gè)寄存器。如果編寫用到堆棧的匯 編語言程序,一定要注意正確使用這兩個(gè)寄存器。 默認(rèn)堆棧大小是1k。用-stack連接選項(xiàng)可以指定軟件堆棧的大小,用C編寫DSP程序一定注意保留足夠的堆??臻g! 注意:編譯器不會(huì)檢查堆棧溢出情況,堆棧溢出會(huì)破壞DSP運(yùn)行環(huán)境,導(dǎo)致程序失敗。編寫DSP程序和配置DSP存儲(chǔ)器資源要注意防止堆棧溢出的發(fā)生。,第2.4節(jié) DS

29、P C與匯編混合編程,動(dòng)態(tài)內(nèi)存分配: TMS320C2x/C2xx/C5x C語言可調(diào)用malloc、calloc或realloc 函數(shù)動(dòng)態(tài)申請(qǐng)內(nèi)存,申請(qǐng)的內(nèi)存將分配在.sysmem塊。 動(dòng)態(tài)分配的內(nèi)存只能通過指針進(jìn)行訪問,動(dòng)態(tài)分配使用后可以釋放,這樣可以用于其它目的。將大數(shù)組通過這種方式來分配可以節(jié)省.bss塊的空間。 通過連接器的-heap選項(xiàng)可以定義.sysmem塊。 unsigned int data100; unsigned int *data; data =(unsigned int *) malloc (100 * sizeof (unsigned int);,第2.4節(jié) DSP

30、 C與匯編混合編程,寄存器使用規(guī)則: TMS320C2x/C2xx/C5x運(yùn)行環(huán)境對(duì)寄存器的使用有嚴(yán)格的要求,編寫涉及到寄存器的匯編程序,必須嚴(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與匯編混

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

32、2.4節(jié) DSP C與匯編混合編程,C語言調(diào)用函數(shù)時(shí)的工作: 將參數(shù)反向壓入堆棧(最右端的參數(shù)最先壓棧,最左端的參數(shù)最后壓棧),這樣,當(dāng)函數(shù)被調(diào)用時(shí),最左端的參數(shù)會(huì)在堆棧的最頂部。 使用被調(diào)用函數(shù)。 被調(diào)用函數(shù)返回前處理各寄存器。 當(dāng)被調(diào)用函數(shù)運(yùn)行結(jié)束時(shí),調(diào)用者函數(shù)要將壓入堆棧的參數(shù)彈出以恢復(fù)堆棧狀態(tài)。 注:如果用C程序調(diào)用匯編語言程序,C編譯器會(huì)自動(dòng)產(chǎn)生代碼完成這些工作。,第2.4節(jié) DSP C與匯編混合編程,C語言函數(shù)被調(diào)用時(shí)的工作: 將返回地址從硬件堆棧彈出,壓入軟件堆棧。 將FP(SP)壓入軟件堆棧。 分配局部幀(Frame)。 如果函數(shù)中要修改AR6、AR7,將它們壓入堆棧,其它寄存

33、器不用進(jìn)行保護(hù)就可以進(jìn)行修改。 實(shí)現(xiàn)函數(shù)功能。 如果函數(shù)返回標(biāo)量數(shù)據(jù),將它放入累加器。 如果保護(hù)了AR6、AR7,恢復(fù)這兩個(gè)寄存器。 刪除局部幀。 恢復(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

34、AR7,*+ ; 保存AR7 .; 函數(shù)功能部分 MAR *,AR1 ; 設(shè)置當(dāng)前AR為AR1 MAR *-; LAR AR7,*-; 恢復(fù)AR7 LAR AR6,*-; 恢復(fù)AR6 SBRK SIZE+1 ; 釋放局部幀(恢復(fù)AR1(SP) LAR AR0,*-; 恢復(fù)AR0(FP) PSHD *; 返回地址壓入硬堆棧 RET; 返回,第2.4節(jié) DSP C與匯編混合編程,一些特殊的情況: 返回一個(gè)結(jié)構(gòu):當(dāng)函數(shù)的返回值為一個(gè)結(jié)構(gòu)時(shí),調(diào)用者負(fù)責(zé)分配存儲(chǔ)空間,并將存儲(chǔ)空間地址作為最后一個(gè)輸入?yún)?shù)傳遞給被調(diào)用函數(shù)。被調(diào)用函數(shù)將要返回的結(jié)構(gòu)拷貝到這個(gè)參數(shù)所指向的內(nèi)存空間。 不將返回地址移動(dòng)到軟件堆棧

35、:當(dāng)被調(diào)用函數(shù)不再調(diào)用其它函數(shù),或者確定調(diào)用深度不會(huì)超過8級(jí),可以不用將返回地址移動(dòng)到軟件堆棧。 不分配局部幀:如果函數(shù)沒有輸入?yún)?shù),不使用局部變量,就不需要修改XAR2(FP),因此也不需要對(duì)其進(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ù)有以下注意事項(xiàng): 所有的函數(shù)(不論用C編寫還是用匯編語言編寫)都必須滿足前面介紹的寄存器規(guī)則。 對(duì)于一些寄存器,如果函數(shù)要修改其內(nèi)容,則必須事先對(duì)其進(jìn)行保

36、護(hù)。這些寄存器包括:XAR2(FP),SP,AR6,AR7。其它的寄存器可以不用保護(hù)自由使用。,第2.4節(jié) DSP C與匯編混合編程,注意事項(xiàng): 如果函數(shù)改變了狀態(tài)寄存器某些有假定值的位,則必須在函數(shù)結(jié)束前恢復(fù)其原有值。尤其要注意ARP必須為AR1。 中斷服務(wù)程序必須保護(hù)所有其用到的寄存器。 long型和float型變量在存儲(chǔ)器中的存儲(chǔ)方式為低有效位在低端地址。 函數(shù)返回值要通過累加器進(jìn)行傳遞。 編譯器會(huì)在所有對(duì)象的名稱前面加下橫線“_”,因此匯編語言模塊定義對(duì)象名稱時(shí)也要以下橫線為前綴,才能使定義的對(duì)象可以被C代碼訪問。例如C語言對(duì)象x在匯編語言中就是_x。匯編語言可以使用任何不帶下橫線前綴

37、的變量而不會(huì)和C語言對(duì)象沖突。 任何匯編語言定義的對(duì)象,如果要被C程序訪問,則必須用.global修飾。同樣任何C語言定義的對(duì)象,如果要被匯編語言訪問,也必須以.global修飾。 C和匯編互相調(diào)用函數(shù)時(shí),需保證參數(shù)壓棧和出棧的一致性。,第2.4節(jié) DSP C與匯編混合編程,第2.4節(jié) DSP C與匯編混合編程,C中訪問匯編變量:通常有兩種方式。 1.訪問.bss塊中的變量: 將要訪問的變量定義在.bss塊中。 用.golbal修飾要訪問的變量。 在匯編語言中以下橫線“_”為前綴聲明要訪問的變量。 在C語言中將變量聲明為外部變量(extern),就可以進(jìn)行正常訪問。 C:extern int

38、var; var = 1; asm:.bss _var,a1,a2 .global _var,第2.4節(jié) DSP C與匯編混合編程,2.訪問非.bss塊中的變量:一般使用指針查表獲得 首先定義變量,而且最好放在獨(dú)立的初始化塊中。 定義一個(gè)全局的標(biāo)識(shí)指向?qū)ο蟮钠鹗键c(diǎn),這樣對(duì)象可以分配在存儲(chǔ)器空間的任何位置。 在C程序中將這個(gè)對(duì)象定義為外部對(duì)象(extern),并且對(duì)象名稱不帶下橫線“_”前綴,就可以對(duì)其進(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è)計(jì)者可以檢查和修改C編譯器輸出的匯編語言程序,然后再對(duì)其進(jìn)行匯編編譯和連接。 在C語言可以使用內(nèi)嵌匯編語句在編譯輸出結(jié)果中添加注釋,以改善編譯器輸出

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論