版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第15章 DSP的C語言編程15DSPC語言簡介DSP生產(chǎn)廠商及第三方為DSP軟件開發(fā)提供了 C編譯器, 使得利用高級語言實現(xiàn)DSP程序的開發(fā)成為可能。 在TI公司的DSP軟件開發(fā)平臺CCS中,又提供了優(yōu)化 的C編譯器,可以對C語言程序進行優(yōu)化編譯,提高 程序效率,目前在某些應用中C語言優(yōu)化編譯的結 果可以達到手工編寫的匯編語言效率的90%以上。DSP生產(chǎn)廠商和相關公司也在不斷對C優(yōu)化編譯器進 行改進設計,相信日后C語言程序優(yōu)化編譯的效果會有進一 步的改善。TMS320C2000系列提供有優(yōu)化的C編譯器,它支持ANSI (Amer i can Nat i onaI Standards Inst
2、 itute, 美 國國家標準委員會)開發(fā)的C語言標準,該C語言標準 是使用最廣泛的C語言標準,ANSI標準具有一些受目 標處理器、運行期環(huán)境或主機環(huán)境影響的C語言特 性,從有效性或?qū)崿F(xiàn)上的考慮,這些特征在各種標 準的C編譯器之間可能有不同。15.2 DSPC語言特性15.2.1 TMS320C2000 C語言的特飪(1) 標識符和常數(shù)所有標識符的前100個字符有意義,區(qū)分大小寫。源(主機)和執(zhí)行(目標)字符集為ASCII碼,不 存在多字節(jié)字符。具有多個字符的字符常數(shù)按序列中最后一個字符來編 碼,例如:“abc, = = c,(2) 數(shù)據(jù)轉(zhuǎn)換浮點到整數(shù)的轉(zhuǎn)換取整數(shù)部分。 指針和整數(shù)可以自由轉(zhuǎn)換
3、。(3)表達式當兩個有符號整數(shù)相除時,若其中一個為負,則其商為負,余數(shù)的符號與分子的符號相同。斜杠(/)用來求商,百分號()用來求余數(shù)。例如:10/-3 = -3,-10/3 = -3,10%-3 = 1,一10%3 二-1(4) 聲明寄存器變量對所有char, short, i毗和指針類型有效。interrupt關鍵字僅可用于沒有參量的vo i d函數(shù)。(5)預處理預處理器忽略任何不支持的#pragma偽指令。預處理器支持的偽指令包括:C0DE_SECT0INDATA_SECTI ON FUNC_EXT_CALLED15.2.2 TMS320C2000 C語言的數(shù)據(jù)類型類型長度表示方法范【最
4、小值最丈值char signed char16位ASCII-3276832767unsigned char16位ASCII065535short16位基2補碼-3276832767unsigned short16位二進制碼065535int signed int16位基2補碼-3276832767unsigned int16位二進制碼065535long signed long32位基2補碼-21474836482147483647unsigned long32位二進制碼04294967295enum16位基2補碼-3276832767float32位TTS32OC2x/C2xx/C5x1.1
5、9209290e-383.4028235e+38double32位TMS32OC2x/C2xx/C5x1.19209290e-383.4028235e+3Slong double32位TMS32OC2x/C2xx/C5x1.19209290e-383.4028235e+38pointers坊位二進制碼0OxFFFFsizeof操作符返注:在TMS320C2x/C2xx/C5x C語言中,字節(jié)長度為16位,的對象長度是以16位為字節(jié)長度的字節(jié)數(shù)。例如sizeof (int)二1。15.2.3 TMS32OC2OOO C語言的關鍵字 const (常數(shù)) ioport ( I/O端口) inter
6、rupt (中斷) near (近) far (遠) vo I at i I e (可變的)15.2.4寄存器變量TMS320C2000 C編譯器在一個函數(shù)中最多可以使用兩個寄存器變量。寄存器變量的聲明必須在變量列表或 函數(shù)的起始處進行,在嵌套塊中聲明的寄存器變量被處理為一般的變量。編譯器使用AR6和AR7作為寄存器變量: AR6被賦給第一個寄存器變量 AR7被賦給第二個寄存器變量寄存器變量的地址會被放入分配的寄存器中,這1!樣變量的訪問速度會更快。16位類型的變量(charshort, ini:和指針)都可以被定義為寄存器變量。但在運行時,設置一個寄存器變量大約需要4條指令,為了更有效地使用
7、這個功能,僅當變量被訪問超過2次時,才使用寄存器變量。程序優(yōu)化編譯器也會定義寄存器變量,但使用方式不 同。編譯器會自己決定哪些變量作為寄存器變量, 程序中聲明的寄存器變量會全部被忽略。聲明的格式為:register type reg;15.2.5 pragma偽指令pragma偽指令通知編譯器的預處理器如何處理函數(shù)。TMS320C2000 C編譯器支持下列pragma: CODE_SECTI ON DATA_SECTI ON FUNC_EXT_CALLED1. CODE_SECTI ON這個偽指令在名稱為section name的命名段中為 symbol分配空間。語法為:#pragma COD
8、ESECT I ON (symbol, “section name”);2. DATA_SECTION這個偽指令在名稱為section name的命名段中為symbol分配空間。語法為:#pragma DATA SECTI ON (symboI, “sect i onname);3. FUNC_EXT_CALLED當使甲峽項時,編譯器將使用程序級的優(yōu)化L數(shù)直接或間接砂用購國數(shù)7一而用戶程序里可能包含要被手工編寫的匯編語言程序 調(diào)用而沒有被ma in函數(shù)調(diào)用的函數(shù),這時就應該用 FUNC_EXT_CALLED來通知編譯器保留此函數(shù)和被此函 數(shù)調(diào)用到的函數(shù),這些函數(shù)將作為C程序的入口點。這個偽指令
9、必須出現(xiàn)在對要保留的函數(shù)的任何聲明或EXT CALLED (f=-=理甩之前崇語法為:15.2.6 asm語句TMS320C2000 C編譯器可以在編譯器輸出的匯編語言程序中直接輸出匯編指令或語句。利用asm語句嵌入冃匕o制功匯編語言程序,可以實現(xiàn)一些C語言難以實現(xiàn)或?qū)崿F(xiàn)起m語句在語法上就象是調(diào)用一個函數(shù)名為asm的函 數(shù),國數(shù)參數(shù)是二個宇符串:asm ,);編譯器會直接將參數(shù)字符串復制到輸出的匯編語言程 序中,因此必須保證參數(shù)雙引號之間的字符串是一個頁效的匯編語言指令。雙引號之間的匯編指令必 貢以空格、制表符(TAB)、標記符(LABEL)或逹 釋開頭,這和匯編語言編程的要求是一致的。編譯器
10、不會檢查此匯編語句是否合法,如果語句中有錯誤,在匯編的過程中會被匯編器指出。使用asm指令的時候應小心不要破壞C語言的環(huán)境。如果C代碼中插入跳轉(zhuǎn)指令和標記符可能會引起不可預 料的操作結果。能夠改變段或其它影響C語言環(huán)境的 指令也可能引起麻煩。對包含asm語句的程序使用優(yōu)化器時要特別小心。盡 管妲俺不能刪除asm指令,但它可以重新安排asm 指論近萌代碼崩亦gS迥璧含亞還期望的 結果。15.2.7訪問I/O空間讀寫I/O空間的功能是TMS320C2000 C編譯器對標準C的擴展,是利用關鍵字ioport (I/O端口)來實現(xiàn)的。該關鍵字的用法為:i oport type port hexnum;
11、 ioport指示這是定義一個端口變量的關鍵字。 type (類型)必須是養(yǎng)(字符)、short (短整 型)、int (整型)或?qū)臒o符號類型。邁亡丘頑定義的端口菱量,其格式必須是 “port”后面跟_處進制數(shù),如沁型9膽是定5LI/O空間地址OAh的變量。所有I/O端口的定義必須在文件級完成,不支持在函 數(shù)級聲明的I/O端口變量。利用i oport關鍵字定義的I/0端口變量可以象一般變量_樣進行賦值操很ioport unsinged port10j_ /*訪問 I/O空間 10h的變 量*/portIO 二 a;/*將a寫到端口 10h*/ b 二 portIO; /*從端口 10h讀入
12、b*/端口變量的使用不僅限于賦值操作,事實上,用port關鍵字定義的I/O端口變量可以象其它變量樣用在表達式蟲:a = portIO +/*讀端口 10h,加上b,結果賦給a*/portIO +二a;/*讀端口 10h,加上a,結果寫回到端 10h*/在講行函數(shù)調(diào)用的時候,可以做I/O端口駕量的值傳拂,而不旱引用:G5JLL_JuQrlQlj_Z2dfiSniQh_i_JSSiSfeifcyiLK2!?Z15.2.8訪問數(shù)據(jù)空間訪問DSP數(shù)據(jù)牢間是利用指針來實現(xiàn)的:* (unsigned int *) 0x1000二a; /*將a的值寫入數(shù)據(jù)空間1000h 地址 */b 二 * (unsign
13、ed int *) Ox 1000; /* 讀出數(shù)據(jù)空間 1000h 地址的值,賦給b*/可見訪問DSP數(shù)據(jù)牢間地址不需要對要訪問的單元預先定義ma指針直接訪圓就可以了這樣,訪問數(shù)據(jù)牢間很容易實現(xiàn)循環(huán)結構ca I I (&port10);/*引用傳遞無效! */for (i=0; i stack、 system等。用戶可以利用CODE_SECT I ON和DATA_SECT I ON偽指令來 創(chuàng)建另外的段。段的存儲分配和頁的指定段存儲器類型頁.textROM或RAM0.ci nitROM或RAM0.switchROM或RAM0 constROM或RAM1bssRAM1.stackRAM1.sy
14、stemRAM1(2)系統(tǒng)堆棧C編譯器使用軟件堆棧進行如下工作:分配局部變量向函數(shù)傳遞參數(shù) 保存處理器狀態(tài) 保存函數(shù)的返回地址 保存暫時的結果 保存寄存器堆棧從較低地冊向較高地冊牛長,IWIBI1編譯器使用兩個寄存 AR1:堆棧指針(塑,stack pointer),指向當前 堆棧頂。 AR2:幀指針(FP, frame pointer),指向當前幀 的起始點。每一個函數(shù)都會在堆棧頂部建立一個 新的幀,用來保存局部的或臨時的變量。C語言環(huán)境自動操作這兩個寄存器。如果編寫用到堆棧 的匯編語言程序,一定要注意7F確便用這兩個寄存器.用-stack連接選項可以指定軟件堆棧的大小,用C編寫 DSP程序
15、一定注意保留足夠的堆??臻g! 注意:編譯器不會檢查堆棧溢出情況,堆棧溢出會破壞 DSP運行環(huán)境,導致程序失敗。編寫DSP程序和配置DSP 存儲器資源要注意防止堆棧溢出的發(fā)生。TMS320C2x/C2xx/C5x運行環(huán)境對寄存器的使用有嚴格的 規(guī)則,如果編寫涉及到寄存器的匯編程序,必須嚴格遵 守這些規(guī)則,否則可能造成系統(tǒng)工作異常。寄存器規(guī)則 規(guī)定了編譯器如何使用寄存器,和寄存器在函數(shù)調(diào)用的 過程中如何進行保護。寄存器按照保護方式分為兩種:口 調(diào)用保存(save on call),調(diào)用其它函數(shù)的函數(shù)負責保存這些寄存器的內(nèi)容???入口保存(save on entry),被調(diào)用的函數(shù)負 責保存這些寄存
16、器的內(nèi)容。注:無論是否使用優(yōu)化編譯,都必須遵守這些寄存器 規(guī)則。寄存器的使用和保護寄存器用途調(diào)用時保護ARO勵旨針(FP)YesAR1堆瞬針(SP)YesAR2局部變量指針(LVP)NoAR3-AR5表達式運算NoAR6-AR7寄存器變量YesAccumulator表達式運算/返回值No狀態(tài)寄存器(STO、ST1)單元名稱ARP歸助寄存器極1C進位標志DP業(yè)zzrZ 數(shù)據(jù)頁OV謚出標值OVM一溢出模式0PM垂法移位VECS PAGE 0text:PROG PAGE 0.cinit:PROG PAGE 0data:PROG PAGE 0stack:IDATA2 PAGE 1bss:IDATA2
17、PAGE 1reg240x : REG MEM PAGE 1頭文件2407c.h主要定義TMS320LF2407的片內(nèi)外設控制寄存 器。此文件在利用TMS320LF2407進行的各種開發(fā)中可以 通用。15.7.5匯編丈件示例程序中沒有利用匯編語言編寫控制程序,但由于對定時 器中斷的處理釆用回調(diào)方式,需要編寫匯編文件定義中 斷向量表。_gpjjnel, _c_ LnlO sect vectorsRSVECTB_c_i ntO;Reset VectorINT1BPHANTOM;Interrupt LeveI 1INT2B_gpt ime1;Interrupt LeveI 2INT3BGISR3;I
18、nterrupt LeveI 315.7.6 C丈件(1) 聲明咅H分 b (2) 主函數(shù)一 (3) 初始化宗時器函數(shù)(4) 宗時器中斷服務函數(shù)go i ni t B vx void interrupt gptimel (void) uWork=(*PIVR);N讀外設中斷向量寄存器*/switch(uWork)case 0x27:fT1PINT, 0x27為定時器1的周期中斷的向量值*/t(*EVAIFRA)=0x80;N 清除中斷標志T1PINT Vbreak;1577賣例總結實例功能要求雖然簡單,卻包含了DSP控制程序設計 中的許多問題,包括:(1)各種文件的編寫:頭文件左接命令文件(.cmd)、;編代碼文件(.asm)、C源文件( c);(2) 數(shù)據(jù)空間的讀寫,對各種片內(nèi)外設控制寄存器 的設置都是通過數(shù)據(jù)空間的寫操作實現(xiàn)的(3) I/O空
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文學視角下園林植物的文化寓意探析
- 石河子大學《土壤肥料學》2022-2023學年第一學期期末試卷
- 石河子大學《人事測評》2021-2022學年第一學期期末試卷
- 石河子大學《地籍測量》2023-2024學年第一學期期末試卷
- 沈陽理工大學《現(xiàn)場總線控制系統(tǒng)》2022-2023學年期末試卷
- 沈陽理工大學《汽車檢測與診斷技術》2023-2024學年第一學期期末試卷
- 沈陽理工大學《計算機程序設計》2022-2023學年期末試卷
- 沈陽理工大學《工程制圖A》2021-2022學年第一學期期末試卷
- 沈陽理工大學《大學生健康教育》2021-2022學年第一學期期末試卷
- 光合同化物的下運途徑
- GB/T 41715-2022定向刨花板
- YC/T 384.3-2018煙草企業(yè)安全生產(chǎn)標準化規(guī)范第3部分:考核評價準則和方法
- 夏商周考古課件 第5章 西周文化(3節(jié))
- GB/T 7324-2010通用鋰基潤滑脂
- GB/T 4459.1-1995機械制圖螺紋及螺紋緊固件表示法
- 危險化學品安全告知牌硝酸、鹽酸、硫酸、氫氧化鈉
- 上海英文介紹課件
- 上交所個股期權基礎知識課件
- 最新山羊、綿羊人工授精技術及新技術介紹(含人工授精視頻)課件
- 2022年征信知識競賽基礎題題庫(含各題型)
- 公司企業(yè)日常安全安全生產(chǎn)檢查記錄表
評論
0/150
提交評論