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

下載本文檔

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

文檔簡(jiǎn)介

會(huì)計(jì)學(xué)1dspCx的C語(yǔ)言程序設(shè)計(jì)2023年1月18日DSP原理及應(yīng)用2第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

6.1C54xC語(yǔ)言介紹

6.2C54xC語(yǔ)言編程6.3C54xC代碼優(yōu)化第1頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用3第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)6.1C54xC語(yǔ)言介紹

C54xC編譯器支持美國(guó)國(guó)家標(biāo)準(zhǔn)委員會(huì)(AmericanNationStandardsInstitute,ANSI)開發(fā)的C語(yǔ)言標(biāo)準(zhǔn)。第2頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用4第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

概括地講,C54xC繼承了ANSIC的大部分基本特征,只要與硬件不是特別相關(guān)的部分都是它們的相同點(diǎn)。

C54xC繼承了ANSIC結(jié)構(gòu)化程序設(shè)計(jì)的基本思想,以函數(shù)作為基本單位,函數(shù)的定義和引用方式完全一致,大部分變量、常量、數(shù)組、結(jié)構(gòu)體、枚舉、聯(lián)合體、指針的定義語(yǔ)法結(jié)構(gòu)也完全一致,局部變量、全局變量、靜態(tài)變量、動(dòng)態(tài)變量等基本定義也一致,宏定義、宏展開、宏調(diào)用的思想語(yǔ)法規(guī)則基本一致。6.1.1

C54xC與ANSIC的相同點(diǎn)第3頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用5第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)1.

常量定義

6.1.1C54xC與ANSIC的相同點(diǎn)

格式:const類型符號(hào)=數(shù)值;

例6-1constshortd1=8;

C54x

C也可以用下面的方法定義符號(hào)常量#defined18;//程序中出現(xiàn)d1時(shí)均會(huì)以8來代替第4頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用6第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)2.變量定義

1)一般變量的定義格式:類型符號(hào);

例6-2charch_1;//定義了一個(gè)字符變量,名字為ch_1shortsh_1;//定義了一個(gè)短整型變量,名字為sh_1long1_dat1;//定義了一個(gè)長(zhǎng)整型變量1_dat1int*pi_1;//定義了一個(gè)指向整型數(shù)據(jù)的指針變量,名字為pi_1Shortsh_a[10];//定義了一個(gè)短整型數(shù)組,數(shù)組的長(zhǎng)度為10第5頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用7第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)2)擴(kuò)展變量的定義structstr_t//定義一個(gè)結(jié)構(gòu)類型str_t{shortsh_a;longl_b;floatf_c;}structstr_tstr_a;//定義一個(gè)str_t型結(jié)構(gòu)變量str_a第6頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用8第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)3)自定義變量的定義格式:typedef已有類型新數(shù)據(jù)類型例6-3typedefunsignedshortUS_DATA;US_DATAush_t;等同于:unsignedshortush_t;或者:#defineUS_DATAunsignedshort;第7頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用9第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)3.函數(shù)的定義和組織

C54xC和ANSIC一樣,整個(gè)程序有一個(gè)主函數(shù)(main函數(shù))和零個(gè)或者多個(gè)子函數(shù)構(gòu)成,如下所示:floatsub_cac(floata,floatb);//子函數(shù)聲明voidmain()//主函數(shù)定義,整個(gè)程序內(nèi)有且只有一個(gè){floata=1;floatb=2;floatc;c=sub_cac(a,b);//子函數(shù)調(diào)用…while(1)//死循環(huán),等待外部事件發(fā)生{}}第8頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用10第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

floatsub_cac(floate,floatf)//子函數(shù)定義{floatg;g=e*f;returng;}除此之外,C54xC的算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位操作運(yùn)算符,包括運(yùn)算符之間的優(yōu)先級(jí)和綜合性等也都和ANSIC一樣,函數(shù)語(yǔ)句的組織也分成順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)等。第9頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用11第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)6.1.2C54xC與ANSIC的不同點(diǎn)

C54xC與ANSIC的不同點(diǎn)總的來說有以下幾個(gè)方面:1.所處理數(shù)據(jù)的性質(zhì)不同

面向PC機(jī)的ANSIC所處理的數(shù)據(jù)是一些采集好的、數(shù)據(jù)量較多的、以數(shù)據(jù)塊為單位的數(shù)據(jù)。對(duì)這些數(shù)據(jù)的處理實(shí)時(shí)性要求并不是很高。

C54xC的編程對(duì)象C54xDSP工作于實(shí)時(shí)性處理場(chǎng)合,對(duì)于處理時(shí)間有比較嚴(yán)格的實(shí)時(shí)性要求。第10頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用12第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)2.數(shù)據(jù)出輸入輸出設(shè)備不同

C54xC處理的數(shù)據(jù)來自于實(shí)時(shí)采集數(shù)據(jù),數(shù)據(jù)處理的結(jié)果通過通信口傳遞給其他計(jì)算機(jī)或者芯片(如MCU、ARM等)使用,或者通過D/A輸出。面向PC機(jī)的ANSIC所處理的數(shù)據(jù)來自硬盤、內(nèi)存等存儲(chǔ)介質(zhì),或者是鍵盤的輸入。其輸出是顯示器、通信口或者實(shí)時(shí)輸出。對(duì)人機(jī)界面提出了較高的要求。

第11頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用13第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)3.“死循環(huán)”的對(duì)待上不同

面向PC機(jī)的ANSIC程序,最怕的事情就是程序內(nèi)部出現(xiàn)“死循環(huán)”。

C54xC在系統(tǒng)初始化之后安排“死循環(huán)”,在“死循環(huán)”內(nèi)等待各種中斷事件(如外部中斷事件、定時(shí)器中斷事件、通信口的中斷事件等)的發(fā)生。第12頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用14第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)4.語(yǔ)法及數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)上的不同(1)C54x的C語(yǔ)言數(shù)據(jù)類型及其表示范圍

由于C54x是一種16位定點(diǎn)DSP,所處理的數(shù)據(jù)一般都是以字(word,16bit)為單位,而對(duì)于小于16位的數(shù)據(jù)的運(yùn)算,需要配合邏輯和以為運(yùn)算來完成。

C54x編譯器將16位數(shù)據(jù)定義成最短的數(shù)據(jù)表示類型,如signedchar,char,unsignedchar,short,signedshort,int,signedint,enum,unsignedint,*指針都是16位數(shù)據(jù),與ANSIC有較大區(qū)別。第13頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用15第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

對(duì)于16位表示范圍不夠的數(shù)據(jù),C54x編譯器安排了32位的數(shù)據(jù)類型,32位的數(shù)據(jù)包括long,signedlong,float,double,longdouble。這也是表示范圍最大的一種數(shù)據(jù)類型。與ANSIC有較大區(qū)別。第14頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用16第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)(2)C54x的C語(yǔ)言特有數(shù)據(jù)類型

C54x的C語(yǔ)言除了從ANSIC繼承了一些既有數(shù)據(jù)類型,在表示方法上作了少許調(diào)整。為了便于C語(yǔ)言直接對(duì)DSP硬件進(jìn)行操作,C54x的C語(yǔ)言還擴(kuò)展了一些專用或者說是特有的數(shù)據(jù)類型。

1)地址變量

在DSP的C語(yǔ)言程序中,經(jīng)常需要對(duì)某一個(gè)存儲(chǔ)單元進(jìn)行訪問,這個(gè)存儲(chǔ)單元可能是普通的數(shù)據(jù)存儲(chǔ)器單元,也可能是存儲(chǔ)器映像寄存器。對(duì)于他們的訪問必須明確指出其地址,為此C54x的C語(yǔ)言編譯器設(shè)置一種地址變量來實(shí)現(xiàn)對(duì)這些指定數(shù)據(jù)存儲(chǔ)單元的訪問。第15頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用17第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)1)地址變量

所謂的地址變量實(shí)際上就是指定了具體地址的指針變量。

為了防止編譯器將其優(yōu)化掉(C54x編譯器在對(duì)程序進(jìn)行優(yōu)化時(shí),會(huì)將定義了但從來沒有使用的變量?jī)?yōu)化掉,以便節(jié)省存儲(chǔ)空間),往往需要用volatile關(guān)鍵字進(jìn)行說明,如:

volatileshort*mcbsp0_drr10=0x10;

shortsh_drr10_data;sh_drr10_data=*mcbsp0_drr10第16頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用18第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)2)I/O端口變量

C54x的存儲(chǔ)空間有三個(gè):程序存儲(chǔ)空間、數(shù)據(jù)存儲(chǔ)空間和I/O空間。為了實(shí)現(xiàn)C訪問DSP的I/O空間,C54xC語(yǔ)言規(guī)定了一種I/O端口變量,對(duì)這些端口變量的訪問就是對(duì)I/O空間的訪問。I/O端口變量的定義格式如下:

ioport數(shù)據(jù)類型

porthex_num;

其中,ioport:端口變量定義關(guān)鍵字;數(shù)據(jù)類型:只能是char,short,int,unsigned等16位類型;hex_num:該I/O端口的16進(jìn)制表示的端口地址。

第17頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用19第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)2)I/O端口變量

例如:

ioportshortport100;//定義了一個(gè)端口變量,端口地址是100h

端口變量定義好后,對(duì)這些變量的訪問在形式上和普通的變量沒有太大區(qū)別,如:

shortsh_1,sh_2;//定義了兩個(gè)短整型變量sh_1=port100;//端口讀操作port100=sh_2;//端口寫操作第18頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用20第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)I/O變量可以和其他變量一樣參加任何的表達(dá)式運(yùn)算例如:

shorts1,s2;s1=0x55;s2=port100+s1;//從100端口讀數(shù)據(jù),將所讀到的數(shù)據(jù)和s1加在一起,結(jié)果送s2第19頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用21第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

需要注意的是:一般情況下I/O變量的讀寫速度有快有慢,快的和CPU的處理速度差不多,慢的和CPU的處理速度差距非常大。對(duì)于讀寫速度慢的I/O變量的讀寫,需要在程序中通過調(diào)用不同的延時(shí)程序?qū)崿F(xiàn)延時(shí)。第20頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用22第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

DSP的C語(yǔ)言擴(kuò)展了寄存器變量。在一個(gè)C函數(shù)內(nèi)部最多可以使用兩個(gè)寄存器變量,編譯器在編譯這兩個(gè)寄存器變量時(shí)用AR6和AR7這兩個(gè)輔助寄存器分別做了對(duì)應(yīng):

3)寄存器變量

★AR6被賦給第一個(gè)寄存器變量★AR7被賦給了第二個(gè)寄存器變量

寄存器變量的定義格式:

registertypeAR6或registertypeAR7第21頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用23第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)1)變量的初值問題(3)DSP

C語(yǔ)言關(guān)于變量的特殊規(guī)定◆ANSIC語(yǔ)言規(guī)定:沒有顯式初始化的變量都將初始化為0◆DSP的C語(yǔ)言規(guī)定:沒有顯式初始化的變量仍保持未初始化狀態(tài)第22頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用24第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

例如:

intsum;inta[8]={1,2,3,4,5,6,7,8};for(i=0;i<8;i++)sum=sum+a[i];

在PC機(jī)上運(yùn)行的結(jié)果為sum=36。注意:在DSP上運(yùn)行,結(jié)果可能不是sum=36。因?yàn)樽兞縮um沒有初始化,初始值是未知的。第23頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用25第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

DSP的C語(yǔ)言規(guī)定,有符號(hào)數(shù)的右移等價(jià)于算術(shù)右移,即右移時(shí)符號(hào)位會(huì)擴(kuò)展,這樣右移一位相當(dāng)于除2,對(duì)于除2或2的整數(shù)次方的運(yùn)算,應(yīng)該用移位來實(shí)現(xiàn),這樣實(shí)現(xiàn)的除法代碼運(yùn)行效率最高。2)有符號(hào)數(shù)的右移

第24頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用26第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

對(duì)于無(wú)符號(hào)整數(shù)除法和取余運(yùn)算,標(biāo)準(zhǔn)C做了規(guī)定3)除法和取余

例如:10/3==3,10%3==1

對(duì)于有符號(hào)整數(shù)除法和取余運(yùn)算沒有硬性規(guī)定

例如:-10%3==-1,-10%3==1

而DSP的C語(yǔ)言做了如下規(guī)定:10/-3==-3,10%-3==1

-10/3==-3,-10%3==-1

即:余數(shù)的符號(hào)與被除數(shù)的符號(hào)保持一致第25頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用27第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

浮點(diǎn)數(shù)轉(zhuǎn)換到整數(shù)時(shí),DSP的C語(yǔ)言采用朝0截止的方式,即簡(jiǎn)單地去掉分?jǐn)?shù)部分。(標(biāo)準(zhǔn)C可以選擇是向下截取——取比該浮點(diǎn)數(shù)小的最大整數(shù),向上截取——取比該浮點(diǎn)數(shù)大的最小整數(shù),還是簡(jiǎn)單截止——DSP的C語(yǔ)言采用的方式)

4)浮點(diǎn)數(shù)轉(zhuǎn)換到整數(shù)例如:inta,ba=1.3;

→a=1b=-1.3;→b=-1第26頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用28第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)5)多字符常量

標(biāo)準(zhǔn)C規(guī)定:字符用單引號(hào)括起來,其本質(zhì)是代表一個(gè)整數(shù),如:

charc=‘r’;標(biāo)準(zhǔn)C還允許單引號(hào)內(nèi)包含多個(gè)字符,通常取里面的第一個(gè)或最后一個(gè)字符有效,沒有硬性規(guī)定。

TI公司的DSPC語(yǔ)言規(guī)定取最后一個(gè)字符有效:

例如:‘a(chǎn)bc’==‘c’第27頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用29第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)6)16位數(shù)相乘

DSPC語(yǔ)言規(guī)定:16位數(shù)相乘,如果只想獲得乘積結(jié)果的高16位(如Q15格式數(shù)據(jù)相乘仍然可以用Q15來表示),可通過把乘積結(jié)果右移16位來獲得。

例如:intm1,m2,result1;unsignedm3,m4,result3;result1=((long)m1*m2)>>16;//16位*16位結(jié)果應(yīng)用32位表示

result3=((unsignedlong)m3*m4)>>16;

第28頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用30第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

這里的m1*m2的中間結(jié)果作了強(qiáng)制long轉(zhuǎn)換,是為了防止有效數(shù)據(jù)位的丟失。第29頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用31第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)6.2.1C54x

C語(yǔ)言開發(fā)的存儲(chǔ)器結(jié)構(gòu)

1.C54xC語(yǔ)言開發(fā)的段結(jié)構(gòu)

C編譯器對(duì)C語(yǔ)言源程序進(jìn)行編譯后產(chǎn)生匯編程序,匯編程序再經(jīng)過匯編將成為COFF格式的目標(biāo)文件,該文件將包含七個(gè)可以進(jìn)行重新定位的代碼和數(shù)據(jù)段,他們是:

6.2C54xC語(yǔ)言編程第30頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用32第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)已初始化段:(1).text段,包含了可執(zhí)行代碼。(2).cinit段,包含明顯初始化的全局變量和靜態(tài)變量。(3).const段,包含字符串常數(shù)和全局變量。(4).switch段,包含大型switch語(yǔ)句的跳轉(zhuǎn)表未初始化段(1).bss段,包含了未初始化的全局變量和靜態(tài)變量(2).stack段,定義軟件堆棧(3).system段,為動(dòng)態(tài)存儲(chǔ)器函數(shù)malloc,calloc,realloc(這些函數(shù)由運(yùn)行支持庫(kù)提供)分配存儲(chǔ)器空間第31頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用33第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)(1)

已初始化段

1).cinit段

DSP的C語(yǔ)言全局變量和靜態(tài)變量,其存儲(chǔ)單元定義在段.bss中,需要顯式初始化的值存放在段.cinit中。在DSP上電時(shí),系統(tǒng)初始化函數(shù)(bootloader)會(huì)自動(dòng)調(diào)用段.cinit的值來初始化段.bss。對(duì)于沒有顯式定義初始化值的,則保持未初始化狀態(tài)。

第32頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用34第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

例如:假設(shè)在C程序中定義了兩個(gè)初始化變量:

inta=45;intb[5]={2,3,4,5,6};則這兩個(gè)變量的初始化信息如下:.sect“.cinit”;初始化段***********變量a的記錄**************.word1;數(shù)據(jù)長(zhǎng)度為1.word_a ;.bss中的地址.word45 ;數(shù)據(jù)第33頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用35第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)***********變量b的記錄***************.word5 ;數(shù)據(jù)長(zhǎng)度為1.word_b ;.bss中的地址.word2,3,4,5,6 ;數(shù)據(jù)2).switch段

當(dāng)C語(yǔ)言程序中有分支語(yǔ)句switch時(shí),如:

inti;intfunction() { switch(i){ case1; return1;第34頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用36第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

break; default; return0; break; }}

C語(yǔ)言程序經(jīng)過編譯將產(chǎn)生.switch段,該段記錄了開關(guān)變量和相應(yīng)開關(guān)值,以及需要執(zhí)行的程序起始位置的對(duì)應(yīng)關(guān)系。第35頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用37第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)(2)未初始化段1).stack段

.stack段定義了軟件堆棧,該堆棧用于函數(shù)調(diào)用、變量傳遞以及局部變量分配。軟件堆棧的大小由連接器選項(xiàng)-stack后面的數(shù)值規(guī)定(如-stack40規(guī)定了棧的大小為40字),如果沒有規(guī)定,則默認(rèn)大小為400h即1K。注意:C編譯器并不提供檢查堆棧溢出的手段,因此,必須保證有足夠的空間由于堆棧,否則,發(fā)生溢出現(xiàn)象將破壞程序的運(yùn)行環(huán)境,從而導(dǎo)致程序的癱瘓。

第36頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用38第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)2).system段.system段為動(dòng)態(tài)存儲(chǔ)器函數(shù)malloc,calloc,realloc(這些函數(shù)由運(yùn)行支持庫(kù)提供)分配存儲(chǔ)器空間。若C程序沒有使用這些函數(shù),編譯器就不創(chuàng)建.system段。

(3)自定義段

除了C編譯器所產(chǎn)生的標(biāo)準(zhǔn)段:.text,.cinit,.const,.switch,.bss,.stack,.system段外,用戶還可以利用progma偽指令來產(chǎn)生其他的自定義段。

第37頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用39第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)①CODE_SECTIONpragma

如果用戶想將程序中的代碼(如函數(shù))編譯成不同于.text段的其他段,并鏈接到不同于.text段的獨(dú)立區(qū)域,就可以使用CODE_SECTIONpragma偽指令。其語(yǔ)法結(jié)構(gòu)為:

#pragmaCODE_SECTION(symbol,“sectionname”)這里,sectionname代表了要產(chǎn)生的段名,而symbol代表了要匯編到該段的符號(hào)(如函數(shù)名)。第38頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用40第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)②DATA_SECTIONpragma如果用戶想將程序中的部分?jǐn)?shù)據(jù)編譯成不同于.bss段的其他段,并鏈接到不同于.bss段的獨(dú)立區(qū)域,就可以使用DATA_SECTIONpragma偽指令。其語(yǔ)法結(jié)構(gòu)為:

#pragmaDATA_SECTION(symbol,“sectionname”)

這里,sectionname代表了要產(chǎn)生的段名,而symbol代表了要匯編到該段的符號(hào)(如變量名)。第39頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用41第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)2.C54xC語(yǔ)言開發(fā)的存儲(chǔ)器結(jié)構(gòu)(1)段的存儲(chǔ)器定位

DSP的C語(yǔ)言程序經(jīng)過編譯器編譯后生成一些段,如已初始化的.text,.cinit,.const,switch段和未初始化的.bss,.stack,.system段,還有一些自定義段,這些段在鏈接時(shí)必須指定相應(yīng)的存儲(chǔ)位置。第40頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用42第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)C54x的段存儲(chǔ)器分配段名及段的類型存儲(chǔ)器類型Page類型已初始化段

.cinitROMorRAM0.constROMorRAM1.switchROMorRAM

0.textROMorRAM0未初始化段

.bssRAM1.stackRAM1.systemRAM1命名段

CODE_SECTIONROMorRAM0

DATA_SECTIONRAM1第41頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用43第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

DSP編譯器支持兩種存儲(chǔ)器模式:小存儲(chǔ)器模式(littleendian)和大存儲(chǔ)器模式(bigendian);

(2)存儲(chǔ)器模式

①小存儲(chǔ)器模式:編譯器默認(rèn)的存儲(chǔ)器模式。這要求.bss在128個(gè)字(一個(gè)數(shù)據(jù)頁(yè))范圍內(nèi),這樣編譯器在編譯成匯編時(shí),不需要修改DP的值,程序代碼簡(jiǎn)單,運(yùn)算效率高。

②大存儲(chǔ)器模式:對(duì).bss大小沒有限制,訪問變量時(shí)需要首先確定DP值,這將增加指令訪問周期第42頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用44第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)6.2.2C54xC語(yǔ)言開發(fā)的函數(shù)及其約定

DSP的C語(yǔ)言和基本C的開發(fā)一樣,也是采用函數(shù)作為主體的模塊化程序設(shè)計(jì)方法。同樣也是以main函數(shù)作為主函數(shù),其他功能函數(shù)作為子函數(shù),函數(shù)的定義函數(shù)的聲明和函數(shù)的調(diào)用方法,從形式上都是一樣的。

而對(duì)于函數(shù)的參數(shù)傳遞,不同的計(jì)算機(jī)結(jié)構(gòu)確定了不同種類甚至不同信號(hào)的計(jì)算機(jī),其C語(yǔ)言函數(shù)在參數(shù)傳遞的實(shí)現(xiàn)上也是有一定的差異的。第43頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用45第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)1.C54xC語(yǔ)言開發(fā)的寄存器約定規(guī)則

編譯器的寄存器約定規(guī)則規(guī)定了在函數(shù)內(nèi)如何使用寄存器,以及在函數(shù)之間相互調(diào)用時(shí)如何保存(或稱為保護(hù))這些寄存器的值。

寄存器值的保存分成兩種基本類型,即入口保存和調(diào)用保存。

第44頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用46第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

調(diào)用保存(save-on-call):為了防止調(diào)用函數(shù)所使用的寄存器的值被調(diào)用函數(shù)更改掉,在調(diào)用被調(diào)用函數(shù)之前,由調(diào)用函數(shù)負(fù)責(zé)將這些寄存器的值進(jìn)行保護(hù),因此稱為“調(diào)用保存”。如:AR0、AR2-AR5、A、B、T、BRC

入口保存(save-on-entry:當(dāng)被調(diào)用函數(shù)需要使用某個(gè)寄存器時(shí),這些寄存器原來的值由被調(diào)用函數(shù)負(fù)責(zé)保存。這些寄存器值的保護(hù),一般放置在被調(diào)用函數(shù)的入口處,因此稱為“入口保存”。如:AR1、AR6、AR7第45頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用47第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)2.C54xC語(yǔ)言開發(fā)的函數(shù)調(diào)用規(guī)則

C54xC編譯器規(guī)定了一組嚴(yán)格的函數(shù)調(diào)用規(guī)則,任何調(diào)用C函數(shù)或被C調(diào)用的函數(shù)都必須遵循這些規(guī)則,否則,就會(huì)破壞C環(huán)境,造成不可預(yù)測(cè)的結(jié)果。假定有一個(gè)函數(shù)function1,它接收了調(diào)用者傳遞給它的參數(shù),它自己有自己的局部變量,它還要調(diào)用另一個(gè)函數(shù)function2,function1也需要傳遞參數(shù)給function2,并從function2中返回計(jì)算結(jié)果。第46頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用48第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

其調(diào)用關(guān)系是:

main()

→function1(…)→function2(…)

第47頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用49第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)3.C54xC語(yǔ)言開發(fā)的標(biāo)識(shí)符命名約定和混合語(yǔ)言編程

約定:

◆C編譯器在編譯C語(yǔ)言程序時(shí),會(huì)自動(dòng)在所有標(biāo)識(shí)符(函數(shù)名、變量名等)之前加下劃線“_”,比如在C程序中定義的變量x,則編譯以后的匯編程序里面會(huì)成為_x,在匯編程序中使用該變量,變量的標(biāo)號(hào)應(yīng)該是_x。

◆匯編程序中定義一個(gè)標(biāo)識(shí)符_x,C語(yǔ)言程序調(diào)用是x,而不是_x

第48頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用50第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)(1)在C中訪問.bss中定義的匯編變量1)在C中訪問.bss中定義的匯編變量匯編程序:

.bss_var,1;定義變量.global_var;說明為外部變量

C程序:

externintvar;/*聲明為外部變量*/var=1;/*訪問外部變量*/第49頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用51第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)2)在C中訪問匯編常數(shù)。

匯編程序:.global_table_size;說明為外部變量

_table_size.set10000;定義常數(shù)C程序:

externinttable_size;/*聲明為外部變量*/for(i=0;i<table_size;i++)

{

…}第50頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用52第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)3)在C中訪問匯編常數(shù)表匯編程序:

.global_sine;說明為外部變量

.sect“sine_tab”;定義命名段_sine:

.word0 .word1*32768/100 .word2*32768/100 .word2*32768/100第51頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用53第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)C程序:

externintsine[];/*聲明為外部變量*/

int*sine_pointer=sine;/*訪問外部變量*/ floatf;f=(float)sine_pointer[2]/32768;

第52頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用54第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)(2)在匯編程序中訪問C變量的例子1)在匯編中訪問C中定義的全局變量。C程序:

inti;/*全局變量*/

main(){

…}匯編程序:

.global_i;說明為外部變量

STM@_i,AR0;AR0=i第53頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用55第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)2)在匯編中訪問C中定義的全局?jǐn)?shù)組C程序:

inth[20];/*全局?jǐn)?shù)組變量*/

main(){

…}第54頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用56第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)匯編程序:

.global_h;說明為外部變量

.datah_add.word_h;數(shù)組h的起始地址

.text…STM@h_add,AR0RPTZA,#19STA,*AR0+第55頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用57第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)(3)在C中訪問匯編函數(shù)

C程序:

externintasmfunc();/*定義外部的匯編函數(shù)*/intgvar;/*定義全局變量*/main(){inti;i=samfunc(i);/*調(diào)用函數(shù)*/}第56頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用58第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)匯編程序

FP.setAR7.mmregs;使能存儲(chǔ)器映像寄存器

.global_asmfunc;說明為外部函數(shù)

.global_gvar;C中定義的變量

.text_asmfunc:FRAME#-1;(SP)-1→SP,形成局部幀

NOP;避免流水線沖突

STLA,SP;參數(shù)i暫存到SPADD@(_gvar),A;將參數(shù)與gvar相加

STLA,@(_gvar);保存至gvarFRAME#1;(SP)+1→SP,撤銷局部幀

RET;函數(shù)返回

第57頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用59第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)(4)在C中使用內(nèi)嵌匯編

在C程序中內(nèi)嵌匯編語(yǔ)句是一種直接的C模塊和匯編模塊接口方法。采用這種方法一方面可以在C程序中實(shí)現(xiàn)用C語(yǔ)言難以實(shí)現(xiàn)的一些硬件控制功能;另一方面,也可以用這種方法在C程序中的關(guān)鍵部分用匯編語(yǔ)句代替C語(yǔ)句以優(yōu)化程序。格式:asm(“匯編語(yǔ)句”)如:asm(“SSBXINTM”)第58頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用60第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)注意:

(1)”

”內(nèi)的內(nèi)容要符合匯編語(yǔ)言語(yǔ)法規(guī)則例如:標(biāo)號(hào)要從頭開始

(2)這種方式交易破壞C環(huán)境,匯編出錯(cuò)編譯器查不出;

(3)插入跳轉(zhuǎn)、標(biāo)號(hào)可能導(dǎo)致C代碼出錯(cuò);

(4)不要在內(nèi)嵌匯編中改變C變量的值;

(5)不要在內(nèi)嵌匯編中更改匯編環(huán)境的設(shè)置。因?yàn)楦淖兛赡芘cC編譯器的設(shè)置有沖突。

第59頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用61第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)6.2.3

C54xC語(yǔ)言中斷處理函數(shù)的實(shí)現(xiàn)1.C語(yǔ)言中斷函數(shù)的定義

C語(yǔ)言中斷函數(shù)的定義有兩種實(shí)現(xiàn)方法,如下:(1)c_intd函數(shù)C編譯器約定,任何具有名為c_intd(d為0~9)的函數(shù)都被假定為一個(gè)中斷程序。如:voidc_int1(){

…}第60頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用62第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)

這種定義的中斷函數(shù)每個(gè)中斷都采用固定的處理程序名。其中c_int0函數(shù)是系統(tǒng)復(fù)位的中斷處理程序,主要用來完成系統(tǒng)上電后的初始化。該函數(shù)是rts.lib庫(kù)函數(shù)來完成的,不用編寫。缺點(diǎn):可以定義的中斷處理函數(shù)數(shù)目較少(只有9個(gè)),另外,函數(shù)名稱與其功能的對(duì)應(yīng)關(guān)系不夠直觀。因此,除了c_int0函數(shù)外,一般不建議使用這種定義方法。

第61頁(yè)/共71頁(yè)2023年1月18日DSP原理及應(yīng)用63第6章TMS320C54xC語(yǔ)言程序設(shè)計(jì)(2

)interrupt函數(shù)

中斷函數(shù)定義的另一種實(shí)現(xiàn)方法就是利用interrupt關(guān)鍵字,將該關(guān)鍵字后面所定義的函數(shù)聲明為中斷函數(shù),當(dāng)編譯器編譯該函數(shù)時(shí),就會(huì)把該函數(shù)編譯成中斷處理函數(shù)。

void

interruptisr(){

溫馨提示

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