dsp-第6章-C54x的C語言程序設(shè)計.ppt_第1頁
dsp-第6章-C54x的C語言程序設(shè)計.ppt_第2頁
dsp-第6章-C54x的C語言程序設(shè)計.ppt_第3頁
dsp-第6章-C54x的C語言程序設(shè)計.ppt_第4頁
dsp-第6章-C54x的C語言程序設(shè)計.ppt_第5頁
免費預(yù)覽已結(jié)束,剩余66頁可下載查看

下載本文檔

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

文檔簡介

1、2020年7月28日,DSP原理及應(yīng)用,1,第6章 TMS320C54xC語言程序設(shè)計,內(nèi)容提要 C54x的程序設(shè)計語言可以選擇:匯編語言和C語言。 匯編語言的優(yōu)點:程序執(zhí)行效率高,硬件定時準(zhǔn)確; 缺點:程序不夠直觀,可移植性和可維護性差 C語言特點:可移植性和可維護性好 程序設(shè)計是應(yīng)用軟件設(shè)計的基礎(chǔ),主要任務(wù)是利用C指令和偽指令編寫源程序以完成指定的功能。 本章重點介紹DSP的C語言程序設(shè)計的特點、DSP C語言編程的設(shè)計技巧、C與匯編的混合編程實現(xiàn)等,2020年7月28日,DSP原理及應(yīng)用,2,第6章 TMS320C54xC語言程序設(shè)計,6.1 C54x C語言介紹 6.2 C54x C語

2、言編程 6.3 C54x C代碼優(yōu)化,2020年7月28日,DSP原理及應(yīng)用,3,第6章 TMS320C54xC語言程序設(shè)計,6.1 C54x C語言介紹,C54x C編譯器支持美國國家標(biāo)準(zhǔn)委員會 (American Nation Standards Institute ,ANSI)開發(fā)的C語言標(biāo)準(zhǔn)。,2020年7月28日,DSP原理及應(yīng)用,4,第6章 TMS320C54xC語言程序設(shè)計,概括地講,C54x C繼承了ANSI C的大部分基本特征,只要與硬件不是特別相關(guān)的部分都是它們的相同點。 C54x C繼承了ANSI C結(jié)構(gòu)化程序設(shè)計的基本思想,以函數(shù)作為基本單位,函數(shù)的定義和引用方式完全一

3、致,大部分變量、常量、數(shù)組、結(jié)構(gòu)體、枚舉、聯(lián)合體、指針的定義語法結(jié)構(gòu)也完全一致,局部變量、全局變量、靜態(tài)變量、動態(tài)變量等基本定義也一致,宏定義、宏展開、宏調(diào)用的思想語法規(guī)則基本一致。,6.1.1 C54x C與ANSI C的相同點,2020年7月28日,DSP原理及應(yīng)用,5,第6章 TMS320C54xC語言程序設(shè)計,1. 常量定義,6.1.1 C54x C與ANSI C的相同點,格式:const 類型 符號=數(shù)值;,例6-1 const short d1=8;,C54x C也可以用下面的方法定義符號常量 #define d1 8;/程序中出現(xiàn)d1時均會以8來代替,2020年7月28日,DSP

4、原理及應(yīng)用,6,第6章 TMS320C54xC語言程序設(shè)計,2. 變量定義,1)一般變量的定義 格式:類型 符號;,例6-2 char ch_1;/定義了一個字符變量,名字為ch_1 short sh_1; /定義了一個短整型變量,名字為sh_1 long 1_dat1;/定義了一個長整型變量1_dat1 int *pi_1; /定義了一個指向整型數(shù)據(jù)的指針變量, 名字為pi_1 Short sh_a10;/定義了一個短整型數(shù)組,數(shù)組的長 度為10,2020年7月28日,DSP原理及應(yīng)用,7,第6章 TMS320C54xC語言程序設(shè)計,2)擴展變量的定義,struct str_t /定義一個結(jié)

5、構(gòu)類型str_t short sh_a; long l_b; float f_c; struct str_t str_a;/定義一個str_t型結(jié)構(gòu)變量str_a,2020年7月28日,DSP原理及應(yīng)用,8,第6章 TMS320C54xC語言程序設(shè)計,3)自定義變量的定義,格式:typedef 已有類型 新數(shù)據(jù)類型,例6-3 typedef unsigned short US_DATA; US_DATA ush_t; 等同于: unsigned short ush_t; 或者:#define US_DATA unsigned short;,2020年7月28日,DSP原理及應(yīng)用,9,第6章 T

6、MS320C54xC語言程序設(shè)計,3.函數(shù)的定義和組織,C54x C和ANSI C一樣,整個程序有一個主函數(shù) (main函數(shù))和零個或者多個子函數(shù)構(gòu)成,如下所示:,float sub_cac(float a, float b);/子函數(shù)聲明 void main()/主函數(shù)定義,整個程序內(nèi)有且只有一個 float a=1; float b=2; float c; c=sub_cac(a,b);/子函數(shù)調(diào)用 while(1) /死循環(huán),等待外部事件發(fā)生 ,2020年7月28日,DSP原理及應(yīng)用,10,第6章 TMS320C54xC語言程序設(shè)計,float sub_cac(float e,float

7、 f)/子函數(shù)定義 float g; g=e*f; return g; ,除此之外,C54x C的算術(shù)運算符、關(guān)系運算符、邏輯運算符、 位操作運算符,包括運算符之間的優(yōu)先級和綜合性等也都和 ANSI C一樣,函數(shù)語句的組織也分成順序結(jié)構(gòu)、分支結(jié)構(gòu)、 循環(huán)結(jié)構(gòu)等。,2020年7月28日,DSP原理及應(yīng)用,11,第6章 TMS320C54xC語言程序設(shè)計,6.1.2 C54x C與ANSI C的不同點,C54x C與ANSI C的不同點總的來說有以下幾個方面:,1. 所處理數(shù)據(jù)的性質(zhì)不同 面向PC機的ANSI C所處理的數(shù)據(jù)是一些采集好 的、數(shù)據(jù)量較多的、以數(shù)據(jù)塊為單位的數(shù)據(jù)。對這 些數(shù)據(jù)的處理實

8、時性要求并不是很高。 C54x C 的編程對象C54x DSP工作于實時性處 理場合,對于處理時間有比較嚴(yán)格的實時性要求。,2020年7月28日,DSP原理及應(yīng)用,12,第6章 TMS320C54xC語言程序設(shè)計,2.數(shù)據(jù)出輸入輸出設(shè)備不同,C54x C處理的數(shù)據(jù)來自于實時采集數(shù)據(jù),數(shù)據(jù) 處理的結(jié)果通過通信口傳遞給其他計算機或者芯片 (如MCU、ARM等)使用,或者通過D/A輸出。,面向PC機的ANSI C所處理的數(shù)據(jù)來自硬盤、內(nèi)存等存儲介質(zhì),或者是鍵盤的輸入。其輸出是顯示器、通信口或者實時輸出。對人機界面提出了較高的要求。,2020年7月28日,DSP原理及應(yīng)用,13,第6章 TMS320C

9、54xC語言程序設(shè)計,3.“死循環(huán)”的對待上不同,面向PC機的ANSI C程序,最怕的事情就是程序 內(nèi)部出現(xiàn)“死循環(huán)”。,C54x C在系統(tǒng)初始化之后安排“死循環(huán)”,在“死循環(huán)”內(nèi)等待各種中斷事件(如外部中斷事件、定時器中斷事件、通信口的中斷事件等)的發(fā)生。,2020年7月28日,DSP原理及應(yīng)用,14,第6章 TMS320C54xC語言程序設(shè)計,4.語法及數(shù)據(jù)結(jié)構(gòu)細節(jié)上的不同,(1)C54x的C語言數(shù)據(jù)類型及其表示范圍,由于C54x是一種16位定點DSP,所處理的數(shù)據(jù)一般都是以字(word ,16bit)為單位,而對于小于16位的數(shù)據(jù)的運算,需要配合邏輯和以為運算來完成。,C54x編譯器將1

10、6位數(shù)據(jù)定義成最短的數(shù)據(jù)表示類型,如signed char, char, unsigned char, short, signed short, int, signed int, enum, unsigned int,* 指針都是16位數(shù)據(jù),與ANSI C有較大區(qū)別。,2020年7月28日,DSP原理及應(yīng)用,15,第6章 TMS320C54xC語言程序設(shè)計,對于16位表示范圍不夠的數(shù)據(jù),C54x編譯器安排 了32位的數(shù)據(jù)類型,32位的數(shù)據(jù)包括long, signed long, float, double, long double。這也是表示范圍最 大的一種數(shù)據(jù)類型。與ANSI C有較大區(qū)別。

11、,2020年7月28日,DSP原理及應(yīng)用,16,第6章 TMS320C54xC語言程序設(shè)計,(2)C54x的C語言特有數(shù)據(jù)類型,C54x的C語言除了從ANSI C繼承了一些既有數(shù)據(jù)類型,在表示方法上作了少許調(diào)整。為了便于C語言直接對DSP硬件進行操作,C54x的C語言還擴展了一些專用或者說是特有的數(shù)據(jù)類型。,1)地址變量,在DSP的C語言程序中,經(jīng)常需要對某一個存儲單元進行訪問,這個存儲單元可能是普通的數(shù)據(jù)存儲器單元,也可能是存儲器映像寄存器。對于他們的訪問必須明確指出其地址,為此C54x的C語言編譯器設(shè)置一種地址變量來實現(xiàn)對這些指定數(shù)據(jù)存儲單元的訪問。,2020年7月28日,DSP原理及應(yīng)用

12、,17,第6章 TMS320C54xC語言程序設(shè)計,1)地址變量,所謂的地址變量實際上就是指定了具體地址的指針變量。,為了防止編譯器將其優(yōu)化掉(C54x編譯器在對程 序進行優(yōu)化時,會將定義了但從來沒有使用的變量 優(yōu)化掉,以便節(jié)省存儲空間),往往需要用 volatile關(guān)鍵字進行說明,如:,volatile short *mcbsp0_drr10=0 x10; short sh_drr10_data; sh_drr10_data=*mcbsp0_drr10,2020年7月28日,DSP原理及應(yīng)用,18,第6章 TMS320C54xC語言程序設(shè)計,2)I/O端口變量,C54x的存儲空間有三個:程序

13、存儲空間、數(shù)據(jù)存儲空間和I/O空間。為了實現(xiàn)C訪問DSP的I/O空間,C54x C語言規(guī)定了一種I/O端口變量,對這些端口變量的訪問就是對I/O空間的訪問。I/O端口變量的定義格式如下:,ioport 數(shù)據(jù)類型 porthex_num; 其中, ioport:端口變量定義關(guān)鍵字;數(shù)據(jù)類型:只能是char, short, int, unsigned等16位類型;hex_num:該I/O端口的16進制表示的端口地址。,2020年7月28日,DSP原理及應(yīng)用,19,第6章 TMS320C54xC語言程序設(shè)計,2)I/O端口變量,例如: ioport short port100;/定義了一個端口變量

14、,端口地址是100h,端口變量定義好后,對這些變量的訪問在形式上和普通的變量沒有太大區(qū)別,如: short sh_1,sh_2;/定義了兩個短整型變量 sh_1=port100;/端口讀操作 port100=sh_2;/端口寫操作,2020年7月28日,DSP原理及應(yīng)用,20,第6章 TMS320C54xC語言程序設(shè)計,I/O變量可以和其他變量一樣參加任何的表達式運算,例如: short s1,s2; s1=0 x55; s2=port100+s1; /從100端口讀數(shù)據(jù),將所讀到的數(shù)據(jù)和s1加在一起,結(jié)果送s2,2020年7月28日,DSP原理及應(yīng)用,21,第6章 TMS320C54xC語言

15、程序設(shè)計,需要注意的是:一般情況下I/O變量的讀寫速度 有快有慢,快的和CPU的處理速度差不多,慢的和CPU 的處理速度差距非常大。對于讀寫速度慢的I/O變量 的讀寫,需要在程序中通過調(diào)用不同的延時程序?qū)崿F(xiàn)延時。,2020年7月28日,DSP原理及應(yīng)用,22,第6章 TMS320C54xC語言程序設(shè)計,DSP的C語言擴展了寄存器變量。在一個C函數(shù)內(nèi)部最多可以使用兩個寄存器變量,編譯器在編譯這兩個寄存器變量時用AR6和AR7這兩個輔助寄存器分別做了對應(yīng):,3)寄存器變量,AR6被賦給第一個寄存器變量 AR7被賦給了第二個寄存器變量,寄存器變量的定義格式: register type AR6 或

16、register type AR7,2020年7月28日,DSP原理及應(yīng)用,23,第6章 TMS320C54xC語言程序設(shè)計,1)變量的初值問題,(3)DSP C語言關(guān)于變量的特殊規(guī)定,ANSI C語言規(guī)定:沒有顯式初始化的變量都將初始化為0 DSP的C語言規(guī)定:沒有顯式初始化的變量仍保持未初始化狀態(tài),2020年7月28日,DSP原理及應(yīng)用,24,第6章 TMS320C54xC語言程序設(shè)計,例如: int sum; int a8 =1,2,3,4,5,6,7,8; for(i=0;i8;i+) sum=sum+ai;,在PC機上運行的結(jié)果為sum=36。,注意:在DSP上運行,結(jié)果可能不是su

17、m=36。 因為變量sum沒有初始化,初始值是未知的。,2020年7月28日,DSP原理及應(yīng)用,25,第6章 TMS320C54xC語言程序設(shè)計,DSP的C語言規(guī)定,有符號數(shù)的右移等價于算術(shù)右移,即右移時符號位會擴展,這樣右移一位相當(dāng)于除2,對于除2或2的整數(shù)次方的運算,應(yīng)該用移位來實現(xiàn),這樣實現(xiàn)的除法代碼運行效率最高。,2)有符號數(shù)的右移,2020年7月28日,DSP原理及應(yīng)用,26,第6章 TMS320C54xC語言程序設(shè)計,對于無符號整數(shù)除法和取余運算,標(biāo)準(zhǔn)C做了規(guī)定,3)除法和取余,例如: 10/3=3, 10%3=1,對于有符號整數(shù)除法和取余運算沒有硬性規(guī)定,例如: -10%3=-1

18、, -10%3=1,而DSP的C語言做了如下規(guī)定:,10/-3=-3, 10%-3=1 -10/3=-3,-10%3=-1,即:余數(shù)的符號與被除數(shù)的符號保持一致,2020年7月28日,DSP原理及應(yīng)用,27,第6章 TMS320C54xC語言程序設(shè)計,浮點數(shù)轉(zhuǎn)換到整數(shù)時,DSP的C語言采用朝0截止的方式,即簡單地去掉分?jǐn)?shù)部分。(標(biāo)準(zhǔn)C可以選擇是向下截取取比該浮點數(shù)小的最大整數(shù),向上截取取比該浮點數(shù)大的最小整數(shù),還是簡單截止DSP的C語言采用的方式),4)浮點數(shù)轉(zhuǎn)換到整數(shù),例如:int a,b a=1.3; a=1 b=-1.3; b=-1,2020年7月28日,DSP原理及應(yīng)用,28,第6章

19、TMS320C54xC語言程序設(shè)計,5)多字符常量,標(biāo)準(zhǔn)C規(guī)定:字符用單引號括起來,其本質(zhì)是代表一個整數(shù),如: char c=r; 標(biāo)準(zhǔn)C還允許單引號內(nèi)包含多個字符,通常取里面的第一個或最后一個字符有效,沒有硬性規(guī)定。,TI公司的DSP C語言規(guī)定取最后一個字符有效: 例如: abc=c,2020年7月28日,DSP原理及應(yīng)用,29,第6章 TMS320C54xC語言程序設(shè)計,6)16位數(shù)相乘,DSP C語言規(guī)定:16位數(shù)相乘,如果只想獲得乘積結(jié)果的高16位(如Q15格式數(shù)據(jù)相乘仍然可以用Q15來表示),可通過把乘積結(jié)果右移16位來獲得。,例如:int m1,m2,result1; unsig

20、ned m3,m4,result3; result1=(long)m1*m2)16;/16位*16位結(jié) 果應(yīng)用32位表示 result3=(unsigned long)m3*m4)16;,2020年7月28日,DSP原理及應(yīng)用,30,第6章 TMS320C54xC語言程序設(shè)計,這里的m1*m2的中間結(jié)果作了強制long轉(zhuǎn)換,是為了防止有效數(shù)據(jù)位的丟失。,2020年7月28日,DSP原理及應(yīng)用,31,第6章 TMS320C54xC語言程序設(shè)計,6.2.1 C54x C語言開發(fā)的存儲器結(jié)構(gòu),1.C54x C語言開發(fā)的段結(jié)構(gòu) C編譯器對C語言源程序進行編譯后產(chǎn)生匯編程序,匯編程序再經(jīng)過匯編將成為CO

21、FF格式的目標(biāo)文件,該文件將包含七個可以進行重新定位的代碼和數(shù)據(jù)段,他們是:,6.2 C54x C語言編程,2020年7月28日,DSP原理及應(yīng)用,32,第6章 TMS320C54xC語言程序設(shè)計,已初始化段:,(1).text段,包含了可執(zhí)行代碼。 (2).cinit段,包含明顯初始化的全局變量和靜態(tài)變量。 (3).const段,包含字符串常數(shù)和全局變量。 (4).switch段,包含大型switch語句的跳轉(zhuǎn)表,未初始化段 (1).bss段,包含了未初始化的全局變量和靜態(tài)變量 (2).stack段,定義軟件堆棧 (3).system段,為動態(tài)存儲器函數(shù)malloc,calloc,reall

22、oc(這些函數(shù)由運行支持庫提供)分配存儲器空間,2020年7月28日,DSP原理及應(yīng)用,33,第6章 TMS320C54xC語言程序設(shè)計,(1) 已初始化段,1).cinit段 DSP的C語言全局變量和靜態(tài)變量,其存儲單元定義在段.bss中,需要顯式初始化的值存放在段.cinit中。在DSP上電時,系統(tǒng)初始化函數(shù)(bootloader)會自動調(diào)用段.cinit的值來初始化段.bss。對于沒有顯式定義初始化值的,則保持未初始化狀態(tài)。,2020年7月28日,DSP原理及應(yīng)用,34,第6章 TMS320C54xC語言程序設(shè)計,例如:假設(shè)在C程序中定義了兩個初始化變量:,int a=45; int b

23、5=2,3,4,5,6;,則這兩個變量的初始化信息如下: .sect “.cinit”; 初始化段 *變量a的記錄* .word 1 ;數(shù)據(jù)長度為1 .word _a;.bss中的地址 .word 45;數(shù)據(jù),2020年7月28日,DSP原理及應(yīng)用,35,第6章 TMS320C54xC語言程序設(shè)計,*變量b的記錄* .word 5;數(shù)據(jù)長度為1 .word _b;.bss中的地址 .word 2,3,4,5,6;數(shù)據(jù),2).switch 段,當(dāng)C語言程序中有分支語句switch時,如: int i; int function( ) switch(i) case 1; return 1;,202

24、0年7月28日,DSP原理及應(yīng)用,36,第6章 TMS320C54xC語言程序設(shè)計,break; default; return 0; break; ,C語言程序經(jīng)過編譯將產(chǎn)生.switch段,該段記錄 了開關(guān)變量和相應(yīng)開關(guān)值,以及需要執(zhí)行的程序起始 位置的對應(yīng)關(guān)系。,2020年7月28日,DSP原理及應(yīng)用,37,第6章 TMS320C54xC語言程序設(shè)計,(2)未初始化段,1).stack段,.stack段定義了軟件堆棧,該堆棧用于函數(shù)調(diào)用、變量傳遞以及局部變量分配。軟件堆棧的大小由連接器選項-stack后面的數(shù)值規(guī)定(如-stack 40 規(guī)定了棧的大小為40字),如果沒有規(guī)定,則默認(rèn)大小

25、為400h即1K。,注意:C編譯器并不提供檢查堆棧溢出的手段,因此,必須保證有足夠的空間由于堆棧,否則,發(fā)生溢出現(xiàn)象將破壞程序的運行環(huán)境,從而導(dǎo)致程序的癱瘓。,2020年7月28日,DSP原理及應(yīng)用,38,第6章 TMS320C54xC語言程序設(shè)計,2) . system段,. system段為動態(tài)存儲器函數(shù)malloc,calloc, realloc(這些函數(shù)由運行支持庫提供)分配存儲器空間。若C程序沒有使用這些函數(shù),編譯器就不創(chuàng)建.system段。,(3)自定義段,除了C編譯器所產(chǎn)生的標(biāo)準(zhǔn)段:.text, .cinit, .const, .switch, .bss, .stack, .sy

26、stem段外,用戶還可以利用progma偽指令來產(chǎn)生其他的自定義段。,2020年7月28日,DSP原理及應(yīng)用,39,第6章 TMS320C54xC語言程序設(shè)計, CODE_SECTION pragma,如果用戶想將程序中的代碼(如函數(shù))編譯成不同于.text段的其他段,并鏈接到不同于.text段的獨立區(qū)域,就可以使用CODE_SECTION pragma偽指令。其語法結(jié)構(gòu)為:,# pragma CODE_SECTION (symbol,“section name”),這里 ,section name代表了要產(chǎn)生的段名,而symbol代表了要匯編到該段的符號(如函數(shù)名)。,2020年7月28日,

27、DSP原理及應(yīng)用,40,第6章 TMS320C54xC語言程序設(shè)計,DATA_SECTION pragma,如果用戶想將程序中的部分?jǐn)?shù)據(jù)編譯成不同于.bss段的其他段,并鏈接到不同于.bss段的獨立區(qū)域,就可以使用DATA_SECTION pragma偽指令。其語法結(jié)構(gòu)為:,# pragma DATA_SECTION (symbol,“section name”),這里 ,section name代表了要產(chǎn)生的段名,而symbol代表了要匯編到該段的符號(如變量名)。,2020年7月28日,DSP原理及應(yīng)用,41,第6章 TMS320C54xC語言程序設(shè)計,2. C54x C語言開發(fā)的存儲器結(jié)

28、構(gòu),(1)段的存儲器定位,DSP的C語言程序經(jīng)過編譯器編譯后生成一些段,如已初始化的.text,.cinit, .const, switch段和未初始化的.bss, .stack, .system段,還有一些自定義段,這些段在鏈接時必須指定相應(yīng)的存儲位置。,2020年7月28日,DSP原理及應(yīng)用,42,第6章 TMS320C54xC語言程序設(shè)計,2020年7月28日,DSP原理及應(yīng)用,43,第6章 TMS320C54xC語言程序設(shè)計,DSP編譯器支持兩種存儲器模式:小存儲器模式 (little endian)和大存儲器模式(big endian);,(2)存儲器模式,小存儲器模式:編譯器默認(rèn)的

29、存儲器模式。這要求 .bss在128個字(一個數(shù)據(jù)頁)范圍內(nèi),這樣編譯器 在編譯成匯編時,不需要修改DP的值,程序代碼簡單 ,運算效率高。,大存儲器模式:對.bss大小沒有限制,訪問變量 時需要首先確定DP值,這將增加指令訪問周期,2020年7月28日,DSP原理及應(yīng)用,44,第6章 TMS320C54xC語言程序設(shè)計,6.2.2 C54x C語言開發(fā)的函數(shù)及其約定,DSP的C語言和基本C的開發(fā)一樣,也是采用函數(shù)作為主體的模塊化程序設(shè)計方法。同樣也是以main函數(shù)作為主函數(shù),其他功能函數(shù)作為子函數(shù),函數(shù)的定義函數(shù)的聲明和函數(shù)的調(diào)用方法,從形式上都是一樣的。 而對于函數(shù)的參數(shù)傳遞,不同的計算機結(jié)

30、構(gòu)確定了不同種類甚至不同信號的計算機,其C語言函數(shù)在參數(shù)傳遞的實現(xiàn)上也是有一定的差異的。,2020年7月28日,DSP原理及應(yīng)用,45,第6章 TMS320C54xC語言程序設(shè)計,1.C54x C語言開發(fā)的寄存器約定規(guī)則,編譯器的寄存器約定規(guī)則規(guī)定了在函數(shù)內(nèi)如何使用寄存器,以及在函數(shù)之間相互調(diào)用時如何保存(或稱為保護)這些寄存器的值。 寄存器值的保存分成兩種基本類型,即入口保存和調(diào)用保存。,2020年7月28日,DSP原理及應(yīng)用,46,第6章 TMS320C54xC語言程序設(shè)計,調(diào)用保存(save-on-call) :為了防止調(diào)用函數(shù)所使用的寄存器的值被調(diào)用函數(shù)更改掉,在調(diào)用被調(diào)用函數(shù)之前,由

31、調(diào)用函數(shù)負(fù)責(zé)將這些寄存器的值進行保護,因此稱為“調(diào)用保存”。 如:AR0、AR2-AR5、A、B、T、BRC,入口保存(save-on-entry:當(dāng)被調(diào)用函數(shù)需要使用某個寄存器時,這些寄存器原來的值由被調(diào)用函數(shù)負(fù)責(zé)保存。這些寄存器值的保護,一般放置在被調(diào)用函數(shù)的入口處,因此稱為“入口保存”。 如:AR1、AR6、AR7,2020年7月28日,DSP原理及應(yīng)用,47,第6章 TMS320C54xC語言程序設(shè)計,2.C54x C語言開發(fā)的函數(shù)調(diào)用規(guī)則,C54x C編譯器規(guī)定了一組嚴(yán)格的函數(shù)調(diào)用規(guī)則,任何調(diào)用C函數(shù)或被C調(diào)用的函數(shù)都必須遵循這些規(guī)則,否則,就會破壞C環(huán)境,造成不可預(yù)測的結(jié)果。 假定

32、有一個函數(shù)function1,它接收了調(diào)用者傳遞給它的參數(shù),它自己有自己的局部變量,它還要調(diào)用另一個函數(shù)function2,function1也需要傳遞參數(shù)給function2,并從function2中返回計算結(jié)果。,2020年7月28日,DSP原理及應(yīng)用,48,第6章 TMS320C54xC語言程序設(shè)計,其調(diào)用關(guān)系是: main( ) function1() function2(),2020年7月28日,DSP原理及應(yīng)用,49,第6章 TMS320C54xC語言程序設(shè)計,3.C54x C語言開發(fā)的標(biāo)識符命名約定和混合語言編程,約定: C編譯器在編譯C語言程序時,會自動在所有標(biāo)識符(函數(shù)名、變

33、量名等)之前加下劃線“_”,比如在C程序中定義的變量x,則編譯以后的匯編程序里面會成為_x,在匯編程序中使用該變量,變量的標(biāo)號應(yīng)該是_x。,匯編程序中定義一個標(biāo)識符_x,C語言程 序調(diào)用是x,而不是_x,2020年7月28日,DSP原理及應(yīng)用,50,第6章 TMS320C54xC語言程序設(shè)計,(1)在C中訪問.bss中定義的匯編變量,1)在C中訪問.bss中定義的匯編變量,匯編程序: .bss _var,1 ;定義變量 .global _var ;說明為外部變量 C程序: extern int var; /*聲明為外部變量*/ var=1; /*訪問外部變量*/,2020年7月28日,DSP原

34、理及應(yīng)用,51,第6章 TMS320C54xC語言程序設(shè)計,2)在C中訪問匯編常數(shù)。,匯編程序: .global _table_size ;說明為外部變量 _table_size .set 10000 ;定義常數(shù) C程序: extern int table_size; /*聲明為外部變量*/ for(i=0;itable_size;i+) ,2020年7月28日,DSP原理及應(yīng)用,52,第6章 TMS320C54xC語言程序設(shè)計,3)在C中訪問匯編常數(shù)表,匯編程序: .global _sine ;說明為外部變量 .sect “sine_tab” ;定義命名段 _sine: .word 0 .w

35、ord 1*32768/100 .word 2*32768/100 .word 2*32768/100,2020年7月28日,DSP原理及應(yīng)用,53,第6章 TMS320C54xC語言程序設(shè)計,C程序: extern int sine; /*聲明為外部變量*/ int *sine_pointer=sine; /*訪問外部變量*/ float f; f=(float)sine_pointer2/32768;,2020年7月28日,DSP原理及應(yīng)用,54,第6章 TMS320C54xC語言程序設(shè)計,(2)在匯編程序中訪問C變量的例子,1)在匯編中訪問C中定義的全局變量。 C程序: int i; /

36、*全局變量*/ main( ) 匯編程序: .global _i ;說明為外部變量 STM _i,AR0 ;AR0=i,2020年7月28日,DSP原理及應(yīng)用,55,第6章 TMS320C54xC語言程序設(shè)計,2)在匯編中訪問C中定義的全局?jǐn)?shù)組,C程序: int h20; /*全局?jǐn)?shù)組變量*/ main( ) ,2020年7月28日,DSP原理及應(yīng)用,56,第6章 TMS320C54xC語言程序設(shè)計,匯編程序: .global _h ;說明為外部變量 .data h_add .word _h ;數(shù)組h的起始地址 .text STM h_add,AR0 RPTZ A, #19 ST A,*AR0

37、+,2020年7月28日,DSP原理及應(yīng)用,57,第6章 TMS320C54xC語言程序設(shè)計,(3)在C中訪問匯編函數(shù),C程序: extern int asmfunc( ); /*定義外部的匯編 函數(shù)*/ int gvar; /*定義全局變量*/ main( ) int i; i=samfunc(i); /*調(diào)用函數(shù)*/ ,2020年7月28日,DSP原理及應(yīng)用,58,第6章 TMS320C54xC語言程序設(shè)計,匯編程序,FP .set AR7 .mmregs ;使能存儲器映像寄存器 .global _asmfunc ;說明為外部函數(shù) .global _gvar ;C中定義的變量 .text

38、_asmfunc: FRAME #-1 ;(SP)-1SP,形成局部幀 NOP ;避免流水線沖突 STL A, SP ;參數(shù)i暫存到SP ADD (_gvar),A ;將參數(shù)與gvar相加 STL A, (_gvar) ;保存至gvar FRAME #1 ;(SP)+1SP,撤銷局部幀 RET ;函數(shù)返回,2020年7月28日,DSP原理及應(yīng)用,59,第6章 TMS320C54xC語言程序設(shè)計,(4)在C中使用內(nèi)嵌匯編,在C程序中內(nèi)嵌匯編語句是一種直接的C模塊和匯編模塊接口方法。采用這種方法一方面可以在C程序中實現(xiàn)用C語言難以實現(xiàn)的一些硬件控制功能;另一方面,也可以用這種方法在C程序中的關(guān)鍵部

39、分用匯編語句代替C語句以優(yōu)化程序。,格式:asm(“ 匯編語句”) 如:asm(“ SSBX INTM”),2020年7月28日,DSP原理及應(yīng)用,60,第6章 TMS320C54xC語言程序設(shè)計,注意: (1)” ”內(nèi)的內(nèi)容要符合匯編語言語法規(guī)則 例如:標(biāo)號要從頭開始 (2)這種方式交易破壞C環(huán)境,匯編出錯編譯器查不出; (3)插入跳轉(zhuǎn)、標(biāo)號可能導(dǎo)致C代碼出錯; (4)不要在內(nèi)嵌匯編中改變C變量的值; (5)不要在內(nèi)嵌匯編中更改匯編環(huán)境的設(shè)置。因為改變可 能與C編譯器的設(shè)置有沖突。,2020年7月28日,DSP原理及應(yīng)用,61,第6章 TMS320C54xC語言程序設(shè)計,6.2.3 C54x

40、 C語言中斷處理函數(shù)的實現(xiàn),1.C語言中斷函數(shù)的定義,C語言中斷函數(shù)的定義有兩種實現(xiàn)方法,如下:,(1)c_intd 函數(shù) C編譯器約定,任何具有名為c_intd(d為09)的函數(shù)都被假定為一個中斷程序。如:,void c_int1() ,2020年7月28日,DSP原理及應(yīng)用,62,第6章 TMS320C54xC語言程序設(shè)計,這種定義的中斷函數(shù)每個中斷都采用固定的處理程序名。其中c_int0函數(shù)是系統(tǒng)復(fù)位的中斷處理程序,主要用來完成系統(tǒng)上電后的初始化。該函數(shù)是rts.lib庫函數(shù)來完成的,不用編寫。 缺點:可以定義的中斷處理函數(shù)數(shù)目較少(只有9個),另外,函數(shù)名稱與其功能的對應(yīng)關(guān)系不夠直觀。

41、因此,除了c_int0函數(shù)外,一般不建議使用這種定義方法。,2020年7月28日,DSP原理及應(yīng)用,63,第6章 TMS320C54xC語言程序設(shè)計,(2 ) interrupt 函數(shù) 中斷函數(shù)定義的另一種實現(xiàn)方法就是利用interrupt關(guān)鍵字,將該關(guān)鍵字后面所定義的函數(shù)聲明為中斷函數(shù),當(dāng)編譯器編譯該函數(shù)時,就會把該函數(shù)編譯成中斷處理函數(shù)。,void interrupt isr() ,采用這種方法,可以對每種中斷服務(wù)函數(shù)的功能,給它起一個有意義的名稱,非常直觀,同時,中斷服務(wù)函數(shù)的個數(shù)也沒有嚴(yán)格的限制。,2020年7月28日,DSP原理及應(yīng)用,64,第6章 TMS320C54xC語言程序設(shè)計,2.關(guān)于C語言

溫馨提示

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

最新文檔

評論

0/150

提交評論