第6章C語言程序設(shè)計(jì)_第1頁
第6章C語言程序設(shè)計(jì)_第2頁
第6章C語言程序設(shè)計(jì)_第3頁
第6章C語言程序設(shè)計(jì)_第4頁
第6章C語言程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第6章章 C/C+語言程序設(shè)計(jì)語言程序設(shè)計(jì)n C55x C/C+語言概述語言概述n C55x C/C+語言編程基礎(chǔ)語言編程基礎(chǔ)n C55x C/C+編譯器的使用編譯器的使用n C和匯編語言混合編程和匯編語言混合編程源代碼源代碼 (source code) 預(yù)處理器預(yù)處理器 (preprocessor) 編譯器編譯器 (compiler) 匯編程序匯編程序 (assembler) 目標(biāo)代碼目標(biāo)代碼 (object code) 鏈鏈接器接器 (Linker) 可執(zhí)行程序可執(zhí)行程序 (executables) 6.1 C55x C/C+語言概述語言概述6.1.1 C/C+語言概況語言概況l匯編語言

2、依賴于匯編語言依賴于計(jì)算機(jī)硬件計(jì)算機(jī)硬件,程序的,程序的可讀性和可移植可讀性和可移植性比較差性比較差。一般高級語言具有很好的可移植性,但是。一般高級語言具有很好的可移植性,但是難以實(shí)現(xiàn)匯編語言的某些功能(如對內(nèi)存地址的操作、難以實(shí)現(xiàn)匯編語言的某些功能(如對內(nèi)存地址的操作、位操作等)。位操作等)。lC/C+語言作為一種高級語言,既可以語言作為一種高級語言,既可以訪問物理地址訪問物理地址又可以又可以進(jìn)行位操作進(jìn)行位操作,能,能直接對硬件進(jìn)行操作直接對硬件進(jìn)行操作,能實(shí)現(xiàn),能實(shí)現(xiàn)匯編語言的匯編語言的大部分大部分功能,適合用作功能,適合用作DSP開發(fā)語言。開發(fā)語言。6.1.2 C55x C/C+語言概

3、況語言概況lC55x C/C+編譯器全面支持編譯器全面支持ANSI C/C+語言標(biāo)準(zhǔn),語言標(biāo)準(zhǔn),能夠把按照標(biāo)準(zhǔn)能夠把按照標(biāo)準(zhǔn)ANSI C/C+規(guī)范編寫的源程序進(jìn)行規(guī)范編寫的源程序進(jìn)行全面優(yōu)化,編譯成全面優(yōu)化,編譯成C55x 匯編語言源程序。匯編語言源程序。lC55x C/C+編譯器工具擁有完整的編譯器工具擁有完整的實(shí)時(shí)運(yùn)行庫。實(shí)時(shí)運(yùn)行庫。l C55x C/C+編譯器輸出文件的特性。編譯器輸出文件的特性。包括標(biāo)準(zhǔn)輸入輸出、串操作、包括標(biāo)準(zhǔn)輸入輸出、串操作、動態(tài)內(nèi)存分配、數(shù)據(jù)轉(zhuǎn)換、三動態(tài)內(nèi)存分配、數(shù)據(jù)轉(zhuǎn)換、三角函數(shù)、指數(shù)函數(shù)、雙曲函數(shù)角函數(shù)、指數(shù)函數(shù)、雙曲函數(shù)等,但是等,但是不包含信號處理函數(shù)不包

4、含信號處理函數(shù),因?yàn)樗鼈兩婕暗侥繕?biāo)系統(tǒng)的具因?yàn)樗鼈兩婕暗侥繕?biāo)系統(tǒng)的具體特性體特性n生成的匯編語言便于查看,使生成的匯編語言便于查看,使用戶能夠看到產(chǎn)生自用戶能夠看到產(chǎn)生自C/C+源程源程序的代碼。序的代碼。n COFF文件允許用戶在鏈接時(shí)文件允許用戶在鏈接時(shí)定義自己的系統(tǒng)存儲器配置定義自己的系統(tǒng)存儲器配置 。n對于嵌入式場合,編譯器允許對于嵌入式場合,編譯器允許用戶把所有代碼和初始化數(shù)據(jù)鏈用戶把所有代碼和初始化數(shù)據(jù)鏈接進(jìn)接進(jìn)ROM,使代碼自復(fù)位后開始,使代碼自復(fù)位后開始運(yùn)行運(yùn)行6.2 C55x C/C+語言編程基礎(chǔ)語言編程基礎(chǔ)6.2.1 數(shù)據(jù)類型數(shù)據(jù)類型lC55x C語言支持的數(shù)據(jù)類型語言支持

5、的數(shù)據(jù)類型:類型長度(位)內(nèi)容最小值最大值字符型、帶符號字符型16ASCII碼-32 76832 767無符號字符型16ASCII碼065 535短整型、帶符號短整型16二進(jìn)制補(bǔ)碼-32 76832 767無符號短整型16二進(jìn)制數(shù)065 535整型、帶符號整型16二進(jìn)制補(bǔ)碼-32 76832 767無符號整型16二進(jìn)制數(shù)065 535長整型、帶符號長整型32二進(jìn)制補(bǔ)碼-2 147 483 6482 147 483 647無符號長整型32二進(jìn)制數(shù)04 294 967 295charunsigned char short intunsigned short intintunsigned int l

6、ong intunsigned long int類型長度(位)內(nèi)容最小值最大值帶符號特長整型40二進(jìn)制補(bǔ)碼-5.49756E+115.49756E+11無符號特長整型40二進(jìn)制數(shù)01.09951E+12枚舉16二進(jìn)制補(bǔ)碼-32 76832 767浮點(diǎn)3232位IEEE 1.18E-383.40E+38雙精度3232位IEEE1.18E-383.40E+38長雙精度3232位IEEE1.18E-383.40E+38數(shù)據(jù)指針(小存儲器模式)16二進(jìn)制數(shù)00 xFFFF數(shù)據(jù)指針(大存儲器模式)23二進(jìn)制數(shù)00 x7FFFFF程序指針24二進(jìn)制數(shù)00 xFFFFFFl定義各種數(shù)據(jù)類型時(shí)應(yīng)注意如下規(guī)則:

7、定義各種數(shù)據(jù)類型時(shí)應(yīng)注意如下規(guī)則:u避免設(shè)避免設(shè)int和和long為相同大小為相同大小u對對定點(diǎn)算法(特別是乘法)盡量使用定點(diǎn)算法(特別是乘法)盡量使用int數(shù)據(jù)類型數(shù)據(jù)類型。用。用long類型作乘法操作數(shù)會導(dǎo)致調(diào)用運(yùn)行時(shí)間庫(類型作乘法操作數(shù)會導(dǎo)致調(diào)用運(yùn)行時(shí)間庫(run-time library)的程序)的程序u避免設(shè)避免設(shè)char為為8位或位或long為為64位位u最好使用最好使用int類型類型作循環(huán)指數(shù)變量和其它位數(shù)不太重要時(shí)作循環(huán)指數(shù)變量和其它位數(shù)不太重要時(shí)的整型變量,因?yàn)榈恼妥兞?,因?yàn)閕nt是對目標(biāo)系統(tǒng)操作最高效的整數(shù)類是對目標(biāo)系統(tǒng)操作最高效的整數(shù)類型,而不管芯片結(jié)構(gòu)如何型,而不管

8、芯片結(jié)構(gòu)如何6.2.2 關(guān)鍵字關(guān)鍵字1. const l將這個(gè)關(guān)鍵字使用到對將這個(gè)關(guān)鍵字使用到對任意變量或數(shù)組任意變量或數(shù)組的定義上可的定義上可以確保它們的值不改變。以確保它們的值不改變。l如果定義一個(gè)對象為如果定義一個(gè)對象為const,那么,那么const段段就會為就會為該對象分配存儲空間。該對象分配存儲空間。const int n=2;2. ioportlC55x C編譯器增加了編譯器增加了ioport關(guān)鍵字來關(guān)鍵字來支持支持I/O尋址模式尋址模式uioport類型限定詞可以和標(biāo)準(zhǔn)類型(數(shù)組、結(jié)構(gòu)體、共類型限定詞可以和標(biāo)準(zhǔn)類型(數(shù)組、結(jié)構(gòu)體、共用體和枚舉)一起使用用體和枚舉)一起使用u可以

9、和可以和const及及volatile一起使用。一起使用。uioport可以單獨(dú)使用,這種情況下可以單獨(dú)使用,這種情況下int限定詞就是默認(rèn)的限定詞就是默認(rèn)的lioport類型限定詞類型限定詞只能用于全局或靜態(tài)變量只能用于全局或靜態(tài)變量。局部變量不能。局部變量不能用用ioport限制,除非變量是個(gè)指針限制,除非變量是個(gè)指針ioport unsigned int *ebsr ioport volatile unsigned short * PIOPUS;例例6-1,ioport關(guān)鍵字的使用。關(guān)鍵字的使用。ioport int k ; /*valid* /void foo(void)ioport

10、int i ; /*invalid* /ioport int *j ; /*valid* /3. interruptlC55x C編譯器增加了編譯器增加了interrupt關(guān)鍵字,來指定關(guān)鍵字,來指定某個(gè)函數(shù)為中斷函數(shù)。某個(gè)函數(shù)為中斷函數(shù)。void interrupt isr() 4. onchiplOnchip關(guān)鍵字聲明一個(gè)特殊指針,該指針?biāo)赶虻臄?shù)關(guān)鍵字聲明一個(gè)特殊指針,該指針?biāo)赶虻臄?shù)據(jù)可用作據(jù)可用作雙雙MAC指令的操作數(shù)指令的操作數(shù)。在鏈接時(shí)這些數(shù)據(jù)必。在鏈接時(shí)這些數(shù)據(jù)必須被鏈接到須被鏈接到DSP片上存儲器片上存儲器,否則會導(dǎo)致總線錯(cuò)誤。,否則會導(dǎo)致總線錯(cuò)誤。onchip int x1

11、00; /* 數(shù)組聲明數(shù)組聲明 */onchip int *p ; /* 指針聲明指針聲明 */5. volatilel在任何情況下,優(yōu)化器會通過分析數(shù)據(jù)流來在任何情況下,優(yōu)化器會通過分析數(shù)據(jù)流來避免存避免存儲器訪問。儲器訪問。l如果程序依靠存儲器訪問,則必須使用如果程序依靠存儲器訪問,則必須使用volatile關(guān)關(guān)鍵字來指明這些訪問。鍵字來指明這些訪問。u編譯器將編譯器將不會優(yōu)化不會優(yōu)化任何對任何對volatile變量的引用變量的引用 volatile int i=10; int a=i; . /其他代碼,并未明確告訴編譯器,其他代碼,并未明確告訴編譯器,對對i進(jìn)行過操作進(jìn)行過操作 int

12、b=i; 6.2.3 寄存器變量和參數(shù)寄存器變量和參數(shù)l寄存器變量就是用寄存器變量就是用register關(guān)鍵字聲明的變量。關(guān)鍵字聲明的變量。l根據(jù)是否使用優(yōu)化器,根據(jù)是否使用優(yōu)化器,C編譯器對寄存器變量采用不同編譯器對寄存器變量采用不同的處理方式。的處理方式。l編譯器會盡量分配好所聲明的寄存器變量。編譯器會盡量分配好所聲明的寄存器變量。l整型整型、浮點(diǎn)型浮點(diǎn)型和和指針類型指針類型對象都可以聲明為寄存器變對象都可以聲明為寄存器變量量,而其它類型對象不行。而其它類型對象不行。u當(dāng)使用優(yōu)化器時(shí),編譯器當(dāng)使用優(yōu)化器時(shí),編譯器忽略任忽略任何寄存器聲明何寄存器聲明,通過一種能夠最,通過一種能夠最有效地使用

13、寄存器的代價(jià)算法,有效地使用寄存器的代價(jià)算法,把寄存器分配給變量和臨時(shí)量。把寄存器分配給變量和臨時(shí)量。u當(dāng)不使用優(yōu)化器進(jìn)行編譯時(shí),編當(dāng)不使用優(yōu)化器進(jìn)行編譯時(shí),編譯器將譯器將使用使用register關(guān)鍵字的變量關(guān)鍵字的變量分配到寄存器中分配到寄存器中register int a; 6.2.4 asm指令指令lasm指令指令可以直接將可以直接將C55x匯編語言指令嵌入到編譯器匯編語言指令嵌入到編譯器的匯編語言輸出中。的匯編語言輸出中。l指令格式:指令格式: asm (“assembler text”); asm (“ nop”); 插入一條匯編指令插入一條匯編指令nopl插入的代碼必須是插入的代碼

14、必須是合法的匯編語言指令合法的匯編語言指令包含引用的代碼行必須用標(biāo)號、空格、星號、分號開頭。包含引用的代碼行必須用標(biāo)號、空格、星號、分號開頭。l使用使用asm指令存在的問題:指令存在的問題:容易破壞容易破壞C環(huán)境,當(dāng)使用帶環(huán)境,當(dāng)使用帶asm指令的指令的優(yōu)化器優(yōu)化器時(shí)必須小心。時(shí)必須小心。優(yōu)化器可以重新改變周圍代碼順序并可能引起不可預(yù)知的結(jié)果優(yōu)化器可以重新改變周圍代碼順序并可能引起不可預(yù)知的結(jié)果6.2.5 Pragma指令指令lPragma指令告訴編譯器的指令告訴編譯器的預(yù)處理器預(yù)處理器如何處理函數(shù)。如何處理函數(shù)。l必須在必須在函數(shù)體外函數(shù)體外確定確定pragma,且必須出現(xiàn)在任何聲明、,且必

15、須出現(xiàn)在任何聲明、定義或?qū)瘮?shù)和符號引用之前。否則,編譯器會輸出警告。定義或?qū)瘮?shù)和符號引用之前。否則,編譯器會輸出警告。#Pragma Para 6.2.6存儲器模式存儲器模式1.小存儲器模式(默認(rèn)模式)小存儲器模式(默認(rèn)模式)n使用小存儲器模式將得到比使用大存儲模式時(shí)使用小存儲器模式將得到比使用大存儲模式時(shí)更少的更少的代碼和數(shù)據(jù)代碼和數(shù)據(jù)。n 在小存儲器模式中,在在小存儲器模式中,在單頁單頁(64KB)存儲器內(nèi)的以)存儲器內(nèi)的以下段必須都分配合適:下段必須都分配合適:n.bss和和.data段(所有靜態(tài)和全局?jǐn)?shù)據(jù))。段(所有靜態(tài)和全局?jǐn)?shù)據(jù))。n.stack和和sysstack段(第一和第二

16、系統(tǒng)堆棧)。段(第一和第二系統(tǒng)堆棧)。n.sysmem段(動態(tài)存儲空間)。段(動態(tài)存儲空間)。n.const段。段。l在小存儲器模式中,對在小存儲器模式中,對.text段(代碼)、段(代碼)、.switch段段(switch語句)和語句)和.cinit段(變量初始化)的大小和段(變量初始化)的大小和位置沒有限制。位置沒有限制。l小存儲器模式下編譯器使用小存儲器模式下編譯器使用16位數(shù)據(jù)指針位數(shù)據(jù)指針來訪問數(shù)據(jù)。來訪問數(shù)據(jù)。XARn寄存器的高寄存器的高7位用來設(shè)置指向包含位用來設(shè)置指向包含.bss段的存儲段的存儲頁。頁。2.大存儲器模式大存儲器模式l大存儲器模式支持不嚴(yán)格的數(shù)據(jù)放置。大存儲器模式

17、支持不嚴(yán)格的數(shù)據(jù)放置。l在大存儲器模式下,在大存儲器模式下,數(shù)據(jù)指針為數(shù)據(jù)指針為23位位,在存儲器中占,在存儲器中占2字空間。字空間。.stack和和.sysstack段必須在同一頁上。段必須在同一頁上。l在大存儲器模式下編譯代碼時(shí),必須和在大存儲器模式下編譯代碼時(shí),必須和rts55x.lib運(yùn)運(yùn)行時(shí)間庫鏈接。行時(shí)間庫鏈接。應(yīng)用程序中的所有文件都必須使用相應(yīng)用程序中的所有文件都必須使用相同的存儲器模式。同的存儲器模式。l鏈接器不允許同時(shí)存在大存儲器模式和小存儲器模式。鏈接器不允許同時(shí)存在大存儲器模式和小存儲器模式。-l rts55x.lib6.2.7 存儲器分配存儲器分配1. C編譯器生成的段

18、編譯器生成的段lC編譯器生成的段有兩種基本的類型,即編譯器生成的段有兩種基本的類型,即初始化段初始化段和和未初始未初始化段化段l初始化段有:初始化段有:u.cinit段,段, 包含初始化數(shù)據(jù)表格和常數(shù)包含初始化數(shù)據(jù)表格和常數(shù)u.pinit段段, 包含實(shí)時(shí)運(yùn)行時(shí)調(diào)用的數(shù)據(jù)表格包含實(shí)時(shí)運(yùn)行時(shí)調(diào)用的數(shù)據(jù)表格u.const段段,包含用,包含用const定義(不能同時(shí)被定義(不能同時(shí)被volatile定義)的字符串常定義)的字符串常 量和數(shù)據(jù)量和數(shù)據(jù)u.switch段段,包含,包含switch語句所用表語句所用表u.text段段, 包含所有可執(zhí)行代碼包含所有可執(zhí)行代碼匯編器生成了匯編器生成了.data段

19、,但段,但C編譯編譯器并不使用這個(gè)段。器并不使用這個(gè)段。l未初始化段未初始化段保留了存儲器空間保留了存儲器空間,一段程序可以在運(yùn)行期一段程序可以在運(yùn)行期間使用這個(gè)空間來生成和存儲變量:間使用這個(gè)空間來生成和存儲變量:u.bss段段,為全局和靜態(tài)變量保留了空間。,為全局和靜態(tài)變量保留了空間。u.stack段段,為,為C系統(tǒng)堆棧分配存儲地址。這個(gè)存儲系統(tǒng)堆棧分配存儲地址。這個(gè)存儲地址用來傳遞變量和局部存儲地址用來傳遞變量和局部存儲u.sysstack段段,為第二系統(tǒng)堆棧分配存儲地址,為第二系統(tǒng)堆棧分配存儲地址u.sysmem段段,為動態(tài)存儲分配保留空間。這個(gè)空間被,為動態(tài)存儲分配保留空間。這個(gè)空間

20、被malloc、calloc和和realloc函數(shù)調(diào)用。函數(shù)調(diào)用。u.cio段段,支持,支持C I/O。.cio段必須放在鏈接器命令文件中段必須放在鏈接器命令文件中才能使用才能使用C I/O表表6-2 段及其存儲位置段及其存儲位置MEMORY DARAM: o=0 x100,l=0 x07f00 VECT : o=0 x0d000,l=0 x100 DARAM2: o=0 x0d100,l=0 x1f00 SARAM: o=0 x10000,l=0 x30000 SDRAM: o=0 x40000,l=0 x3e0000 SECTIONS .text: DARAM .vectors: VECT

21、 .trcinit: DARAM .gblinit: DARAM .cinit: DARAM .pinit: DARAM .sysinit: DARAM .bss: DARAM2 .far: DARAM2 .const: DARAM .switch: DARAM .sysmem: DARAM .cio: DARAM .sysheap: DARAM .sysstack DARAM .stack: DARAM 2. 堆棧堆棧l用來放置用來放置局部變量局部變量、傳遞參數(shù)傳遞參數(shù)給函數(shù)、給函數(shù)、保存處理器狀態(tài)保存處理器狀態(tài),它被放在存儲器的一個(gè)連續(xù)塊中,并從高地址到低地址存它被放在存儲器的一個(gè)連續(xù)塊中

22、,并從高地址到低地址存放數(shù)據(jù)。放數(shù)據(jù)。l編譯器用編譯器用堆棧指針(堆棧指針(SP)來管理堆棧。來管理堆棧。C55x支持支持第二系第二系統(tǒng)堆棧統(tǒng)堆棧,使用第二堆棧指針,使用第二堆棧指針SSP來管理第二系統(tǒng)堆棧。來管理第二系統(tǒng)堆棧。l代碼不會檢查是否在運(yùn)行時(shí)間內(nèi)堆棧出現(xiàn)溢出,必須為堆代碼不會檢查是否在運(yùn)行時(shí)間內(nèi)堆棧出現(xiàn)溢出,必須為堆棧分配合適的存儲空間。棧分配合適的存儲空間。l兩堆棧的兩堆棧的大小都由鏈接器設(shè)置大小都由鏈接器設(shè)置。兩種默認(rèn)堆棧大小都是。兩種默認(rèn)堆棧大小都是1000字節(jié)。可通過鏈接器命令中的字節(jié)??赏ㄟ^鏈接器命令中的-stack或或-sysstack選項(xiàng)改變堆棧大小。選項(xiàng)改變堆棧大小

23、。-stack 500-sysstack 5003.動態(tài)存儲器分配動態(tài)存儲器分配l由編譯器提供的由編譯器提供的運(yùn)行時(shí)間支持庫運(yùn)行時(shí)間支持庫包含幾個(gè)在運(yùn)行時(shí)間內(nèi)包含幾個(gè)在運(yùn)行時(shí)間內(nèi)為變量動態(tài)分配存儲器的函數(shù)(為變量動態(tài)分配存儲器的函數(shù)(malloc、calloc和和realloc)l存儲器被從一個(gè)在存儲器被從一個(gè)在.sysmen段段定義的全局池(定義的全局池(pool)或)或堆(堆(heap)中分配出來??赏ㄟ^)中分配出來。可通過-heap size選項(xiàng)和鏈接選項(xiàng)和鏈接器命令來設(shè)置器命令來設(shè)置.sysmem段的大小。默認(rèn)大小為段的大小。默認(rèn)大小為2000字節(jié)字節(jié)l動態(tài)分配的對象必須用動態(tài)分配的對

24、象必須用指針尋址指針尋址。6.2.8 中斷處理中斷處理n中斷程序會執(zhí)行中斷程序會執(zhí)行任何其它函數(shù)執(zhí)行的工作任何其它函數(shù)執(zhí)行的工作。n對所有的中斷屏蔽都要進(jìn)行處理。通過嵌入?yún)R編語言語對所有的中斷屏蔽都要進(jìn)行處理。通過嵌入?yún)R編語言語句可以句可以使能或禁止中斷使能或禁止中斷,也可以修改,也可以修改IER0/1寄存器而寄存器而不會破壞不會破壞C環(huán)境或環(huán)境或C指針。指針。n中斷處理程序中斷處理程序不能有參數(shù)不能有參數(shù),即使聲明了參數(shù)也會被忽略,即使聲明了參數(shù)也會被忽略n中斷處理程序中斷處理程序不能被普通不能被普通C代碼調(diào)用代碼調(diào)用。1.1.關(guān)于中斷的幾個(gè)要點(diǎn)關(guān)于中斷的幾個(gè)要點(diǎn)n為了將中斷程序和中斷聯(lián)系起

25、來,需要將分支程序放在合為了將中斷程序和中斷聯(lián)系起來,需要將分支程序放在合適的中斷向量表中。適的中斷向量表中。n在匯編語言中,需要在中斷程序名前加下劃線,如在匯編語言中,需要在中斷程序名前加下劃線,如_c_int00。 c_int00是是C程序入口。這個(gè)名字被保存為程序入口。這個(gè)名字被保存為系統(tǒng)重啟中斷系統(tǒng)重啟中斷。這個(gè)特殊的中斷程序這個(gè)特殊的中斷程序初始化系統(tǒng)并調(diào)用了主函數(shù)初始化系統(tǒng)并調(diào)用了主函數(shù)。2. C中斷程序的使用中斷程序的使用l通過通過interrupt關(guān)鍵字關(guān)鍵字可以用可以用C函數(shù)直接處理中斷。函數(shù)直接處理中斷。l interrupt關(guān)鍵字可以和定義為返回關(guān)鍵字可以和定義為返回vo

26、id并不含參數(shù)的并不含參數(shù)的函數(shù)一起使用。中斷函數(shù)體可以有函數(shù)一起使用。中斷函數(shù)體可以有局部變量局部變量,可以,可以自由自由使用堆棧使用堆棧。例,例,interrupt void isr() .6.2.9 系統(tǒng)初始化系統(tǒng)初始化l在運(yùn)行在運(yùn)行C程序之前必須先程序之前必須先建立建立C運(yùn)行環(huán)境運(yùn)行環(huán)境,該工作由被稱為,該工作由被稱為_c_int00的的C啟動程序啟動程序來完成來完成.l為使系統(tǒng)開始運(yùn)行,必須由復(fù)位硬件調(diào)用為使系統(tǒng)開始運(yùn)行,必須由復(fù)位硬件調(diào)用_c_int00函數(shù),函數(shù),將將_c_ int00函數(shù)和其它目標(biāo)模塊鏈接起來。函數(shù)和其它目標(biāo)模塊鏈接起來。l當(dāng)當(dāng)C程序被鏈接時(shí),鏈接器會在可執(zhí)行輸

27、出模塊中給符號程序被鏈接時(shí),鏈接器會在可執(zhí)行輸出模塊中給符號_c_int00設(shè)置入口點(diǎn)的值設(shè)置入口點(diǎn)的值。l _c_int00函數(shù)執(zhí)行如下工作來初始化函數(shù)執(zhí)行如下工作來初始化C環(huán)境:環(huán)境:u建立堆棧和第二系統(tǒng)堆棧。建立堆棧和第二系統(tǒng)堆棧。u通過從在通過從在 .cinit段段中的初始化表中復(fù)制數(shù)據(jù)到中的初始化表中復(fù)制數(shù)據(jù)到.bss段段中的變量來初始化全局變量。中的變量來初始化全局變量。u調(diào)用調(diào)用main函數(shù)函數(shù)開始執(zhí)行開始執(zhí)行C程序。程序。 6.3 TMS320C55x的的C代碼優(yōu)化代碼優(yōu)化l由于由于C語言程序的執(zhí)行效率語言程序的執(zhí)行效率無法達(dá)到無法達(dá)到匯編語言程序的水匯編語言程序的水平,所以常

28、常在編寫完平,所以常常在編寫完C程序后還要進(jìn)行程序后還要進(jìn)行C代碼優(yōu)化以代碼優(yōu)化以提高效率提高效率,以,以達(dá)到實(shí)時(shí)性要求達(dá)到實(shí)時(shí)性要求。lC55x的的C/C+編譯器中含有編譯器中含有優(yōu)化器(優(yōu)化器(optimizer)的)的程序模塊程序模塊。優(yōu)化器通過執(zhí)行一些操作(如簡化循環(huán),重。優(yōu)化器通過執(zhí)行一些操作(如簡化循環(huán),重新安排語句和表達(dá)式,把變量用寄存器實(shí)現(xiàn)等),可以新安排語句和表達(dá)式,把變量用寄存器實(shí)現(xiàn)等),可以提高提高C/C+程序的運(yùn)行速度,減少其代碼長度。程序的運(yùn)行速度,減少其代碼長度。6.4 C55x C和匯編語言混合編程和匯編語言混合編程l匯編語言所編匯編語言所編程序執(zhí)行效率高程序執(zhí)行

29、效率高。 但是不同公司的但是不同公司的DSP芯片所提供的匯編語言各不相同,即使是同芯片所提供的匯編語言各不相同,即使是同一公司的芯片,由于芯片的類型不同,其匯編語言也不盡相同。一公司的芯片,由于芯片的類型不同,其匯編語言也不盡相同。用匯編語言開發(fā)用匯編語言開發(fā)DSP產(chǎn)品產(chǎn)品周期很長,軟件修改、升級、移植都非周期很長,軟件修改、升級、移植都非常困難常困難。l采用采用C語言編程具有語言編程具有開發(fā)效率高開發(fā)效率高的優(yōu)點(diǎn),有助于提高產(chǎn)的優(yōu)點(diǎn),有助于提高產(chǎn)品開發(fā)速度,程序修改、升級和移植也很方便。品開發(fā)速度,程序修改、升級和移植也很方便。 但是但是C語言的語言的執(zhí)行效率較低執(zhí)行效率較低,通常不能滿足實(shí)

30、時(shí)性要求,且,通常不能滿足實(shí)時(shí)性要求,且無法無法控制某些硬件控制某些硬件。l一般來說,只是在一般來說,只是在DSP運(yùn)算能力不是很緊張時(shí)才采運(yùn)算能力不是很緊張時(shí)才采用用C語言開發(fā)語言開發(fā)DSP程序,更加普遍的是采用程序,更加普遍的是采用C和匯編和匯編語言混合編程。語言混合編程。 通常對于實(shí)時(shí)性要求不高的部分如通常對于實(shí)時(shí)性要求不高的部分如主控程序采用主控程序采用C語言編寫語言編寫,對于對于實(shí)時(shí)性要求較高實(shí)時(shí)性要求較高的模塊如的模塊如FFT、FIRIIR濾波等則濾波等則采用匯采用匯編語言編寫編語言編寫。例,一個(gè)典型的函數(shù)調(diào)用。從例,一個(gè)典型的函數(shù)調(diào)用。從C C代碼中訪問匯編語言函數(shù)。代碼中訪問匯編

31、語言函數(shù)。(a)C程序程序(父函數(shù)父函數(shù)):extern int asmfunc(int,int *); /聲明匯編函數(shù)聲明匯編函數(shù)int gvar ; /定義全局變量定義全局變量main()int i;i=asmfunc(i,&gvar); /調(diào)用函數(shù)調(diào)用函數(shù)(b)匯編程序匯編程序(子函數(shù)子函數(shù)) :_asmfunc:ADD *AR0,T0,T0 ; T0+gvar=i, i=T0 RET;6.4.4 C和匯編語言的接口和匯編語言的接口 混合使用混合使用C代碼和匯編語言代碼的主要方法有:代碼和匯編語言代碼的主要方法有:l使用幾個(gè)使用幾個(gè)獨(dú)立的匯編代碼模塊獨(dú)立的匯編代碼模塊,并將它們與

32、編譯了的,并將它們與編譯了的C模模塊塊進(jìn)行鏈接進(jìn)行鏈接,這是最通用的方法。,這是最通用的方法。l在在C源代碼中使用源代碼中使用匯編語言變量和常數(shù)匯編語言變量和常數(shù)。l將匯編語言程序?qū)R編語言程序直接嵌入直接嵌入C源代碼源代碼中。中。l在在C源代碼中使用源代碼中使用本征函數(shù)本征函數(shù)直接調(diào)用匯編語言語句。直接調(diào)用匯編語言語句。1. 在在C代碼中訪問匯編語言代碼中訪問匯編語言函數(shù)函數(shù)l定義匯編函數(shù)時(shí),需要在函數(shù)名前加定義匯編函數(shù)時(shí),需要在函數(shù)名前加下劃線下劃線“_” 讓編譯器識別。讓編譯器識別。例,從例,從C代碼中訪問匯編語言函數(shù)。代碼中訪問匯編語言函數(shù)。(a)C程序:程序:extern int a

33、smfunc(int,int *); /聲明匯編函數(shù)聲明匯編函數(shù)int gvar ; /定義全局變量定義全局變量main()int i;i=asmfunc(i,&gvar); /調(diào)用函數(shù)調(diào)用函數(shù)(b)匯編程序)匯編程序:_asmfunc:ADD *AR0,T0,T0 ; T0+gvar=i, i=T0 RET;2. 在在C代碼中訪問匯編語言代碼中訪問匯編語言變量變量n訪問訪問.bss段或段或.usect段中沒有初始化的變量:段中沒有初始化的變量:使用使用.bss或或.usect指令來定義變量指令來定義變量使用使用.global指令來定義為外部變量指令來定義為外部變量在匯編語言中的變量前

34、加下劃線在匯編語言中的變量前加下劃線“_”在在C代碼中聲明變量為代碼中聲明變量為外部變量外部變量并正常地訪問它并正常地訪問它例,從程序中訪問定義在例,從程序中訪問定義在.bss段的變量段的變量(a)C程序:程序:extern int var; /* 外部變量外部變量 */var = 1; /* 使用變量使用變量 */(b)匯編語言程序:)匯編語言程序:.bss var,1;定義變量定義變量.global bar;聲明變量為外部變量聲明變量為外部變量n當(dāng)變量不是被存放在當(dāng)變量不是被存放在.bss段時(shí),這時(shí)應(yīng)該定義一個(gè)指向段時(shí),這時(shí)應(yīng)該定義一個(gè)指向該變量的指針并從該變量的指針并從C語言中對其間接訪

35、問。語言中對其間接訪問。u首先,要首先,要定義變量定義變量u其次,聲明一個(gè)指向該變量起始地址的其次,聲明一個(gè)指向該變量起始地址的全局指針全局指針,這,這個(gè)變量就可以被鏈接到存儲空間的任何地方個(gè)變量就可以被鏈接到存儲空間的任何地方u最后,在程序中訪問時(shí),必須先聲明該對象為最后,在程序中訪問時(shí),必須先聲明該對象為extern型,型,并且不能在其名稱前面加下劃線,然后就并且不能在其名稱前面加下劃線,然后就可以正常訪問它了可以正常訪問它了例,在例,在C代碼中訪問沒有在代碼中訪問沒有在 .bss段中聲明的變量。段中聲明的變量。(a)C程序:程序:extern float sine ;/*這就是對象這就是對象*/float *sine_p=sine;/*聲明指針指向它聲明指針指向它*/f=sine_p2;/*正常訪問該對象正常訪問該對象*/(b)

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論