DSP技術(shù)及應(yīng)用(第四章第二部分PPT)_第1頁(yè)
DSP技術(shù)及應(yīng)用(第四章第二部分PPT)_第2頁(yè)
DSP技術(shù)及應(yīng)用(第四章第二部分PPT)_第3頁(yè)
DSP技術(shù)及應(yīng)用(第四章第二部分PPT)_第4頁(yè)
DSP技術(shù)及應(yīng)用(第四章第二部分PPT)_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

4.5TMS320C54xC語(yǔ)言編程C54x軟件設(shè)計(jì):利用C語(yǔ)言進(jìn)行編程純匯編語(yǔ)言編程利用C和匯編語(yǔ)言進(jìn)行混合編程4.5TMS320C54xC語(yǔ)言編程4.5.1存儲(chǔ)器模式4.5.2寄存器規(guī)則4.5.3函數(shù)調(diào)用規(guī)則4.5.4中斷處理4.5.5表達(dá)式分析

4.5.1存儲(chǔ)器模式1.段C54x將存儲(chǔ)器處理為程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器兩個(gè)線性塊。程序存儲(chǔ)器包含可執(zhí)行代碼;數(shù)據(jù)存儲(chǔ)器主要包含外部變量、靜態(tài)變量和系統(tǒng)堆棧。編譯器的任務(wù)是產(chǎn)生可重定位的代碼,允許鏈接器將代碼和數(shù)據(jù)定位進(jìn)合適的存儲(chǔ)空間。C編譯器對(duì)C語(yǔ)言編譯后除了生成3個(gè)基本段,即.text、.data、.bss外,還生成.cinit、.const、.stack、.sysmem段。2.C系統(tǒng)堆棧DSP匯編程序中要將堆棧指針SP指向一塊RAM,用于保存中斷、調(diào)用時(shí)的返回地址,存放PUSH指令的壓棧內(nèi)容。.stack定義的系統(tǒng)堆棧實(shí)現(xiàn)的功能是保護(hù)函數(shù)的返回地址,分配局部變量,在調(diào)用函數(shù)時(shí)用于傳遞參數(shù),保護(hù)臨時(shí)結(jié)果。.stack定義的段大?。ǘ褩4笮。┛捎面溄悠鬟x項(xiàng)-stacksize設(shè)定,鏈接器還產(chǎn)生一個(gè)全局符號(hào)__STACK_SIZE,并賦給它等于堆棧長(zhǎng)度的值,以字為單位,缺省值為1K。3.存儲(chǔ)器分配(1)運(yùn)行時(shí)間支持函數(shù)。

(2)動(dòng)態(tài)存儲(chǔ)器分配。

(3)靜態(tài)和全局變量的存儲(chǔ)器分配。4.5.2寄存器規(guī)則TMS320C5x運(yùn)行環(huán)境對(duì)寄存器的使用有嚴(yán)格的規(guī)則,如果編寫(xiě)涉及到寄存器的匯編程序,必須嚴(yán)格遵守這些規(guī)則,否則可能造成系統(tǒng)工作異常。寄存器規(guī)則規(guī)定了編譯器如何使用寄存器,和寄存器在函數(shù)調(diào)用的過(guò)程中如何進(jìn)行保護(hù)。4.5.2寄存器規(guī)則寄存器按照保護(hù)方式分為兩種:調(diào)用保存(saveoncall),調(diào)用其它函數(shù)的函數(shù)負(fù)責(zé)保存這些寄存器的內(nèi)容。入口保存(saveonentry),被調(diào)用的函數(shù)負(fù)責(zé)保存這些寄存器的內(nèi)容。注:無(wú)論是否使用優(yōu)化編譯,都必須遵守這些寄存器規(guī)則。4.5.2寄存器規(guī)則寄存器規(guī)則明確了編譯器如何使用寄存器以及在函數(shù)調(diào)用過(guò)程中如何保護(hù)寄存器。(1)輔助寄存器AR1、AR6、AR7由被調(diào)用函數(shù)保護(hù),即可以在函數(shù)執(zhí)行過(guò)程中修改,但在函數(shù)返回時(shí)必須恢復(fù)。在TMS320C54X中,編譯器將AR1和AR6用作寄存器變量。其中,AR1被用作第一個(gè)寄存器變量,AR6被有作第二個(gè)寄存器變量,其順序不能改變。AR0、AR2、

AR3、AR4、AR5可以自由使用,即在函數(shù)執(zhí)行過(guò)程中可以修改,而且不必恢復(fù)。(2)堆棧指針SP在函數(shù)調(diào)用時(shí)必須予以保護(hù),但其是自動(dòng)保護(hù)的,即在返回時(shí),壓入椎棧的內(nèi)容都將被全部彈出。4.5.2寄存器規(guī)則(3)ARP在函數(shù)進(jìn)入和返回時(shí),必須為0,即當(dāng)前輔助寄存器為AR0。函數(shù)執(zhí)行時(shí)可以是其它值。(4)在缺省的情況下,編譯器總是認(rèn)為OVM為0。因此,若在匯編程序中將OVM置為1,則在返回C環(huán)境時(shí),必須將其恢復(fù)為0。(5)其它狀態(tài)位和寄存器在子程序中可以任意使用,不必恢復(fù)。4.5.3函數(shù)調(diào)用規(guī)則C編譯器對(duì)函數(shù)的調(diào)用有一系列嚴(yán)格的規(guī)定。除了特殊的運(yùn)行支持函數(shù)外,任何調(diào)用者函數(shù)和被調(diào)用函數(shù)都要遵守這些規(guī)則,否則可能會(huì)破壞C環(huán)境并導(dǎo)致程序失敗。(1)函數(shù)調(diào)用在調(diào)用其他函數(shù)(子函數(shù))時(shí)執(zhí)行以下任務(wù)。a.調(diào)用者函數(shù)將參數(shù)以顛倒的順序壓入堆棧(最右邊聲明的參數(shù)第一個(gè)壓入堆棧,最左邊的參數(shù)最后一個(gè)壓入堆棧)。即函數(shù)調(diào)用時(shí),最左邊的參數(shù)放在棧頂單元。b.調(diào)用者函數(shù)調(diào)用子函數(shù)。c.調(diào)用者函數(shù)假定當(dāng)子函數(shù)執(zhí)行完成返回。d.完成調(diào)用后,調(diào)用者函數(shù)將參數(shù)彈出堆棧。(2)函數(shù)結(jié)束a.將返回地址從硬件堆棧中彈出,壓入軟件堆棧。b.將FP壓入軟件堆棧。c.分配局部幀。d.如果函數(shù)修改了AR6和AR7,則將它們壓入堆棧,其他的任何寄存器可以不用保存,任意修改。e.實(shí)現(xiàn)函數(shù)功能。f.如果函數(shù)返回標(biāo)量數(shù)據(jù),將它放入累加器。g.將ARP設(shè)定為AR0。h.如果保護(hù)了AR6、AR7,恢復(fù)這兩個(gè)寄存器。i.刪除局部幀。j.恢復(fù)FP。k.從軟件堆棧中彈出返回地址并壓入硬件堆棧。l.返回。4.5.4中斷處理(1)中斷的使能和屏蔽必須由程序員自己來(lái)設(shè)置。

(2)中斷程序沒(méi)有參數(shù)傳遞,即使說(shuō)明,也會(huì)被忽略(3)中斷處理程序不能被正常的C程序調(diào)用。(4)為了使中斷程序與中斷一致,在相應(yīng)的中斷矢量中必須放置一條轉(zhuǎn)移指令,可以用.sect匯編偽指令建立一個(gè)簡(jiǎn)單的跳轉(zhuǎn)指令表來(lái)完成此項(xiàng)功能。(5)在匯編語(yǔ)言中,注意在符號(hào)名前面加上一個(gè)下劃線,例如c_int00記為_(kāi)c_int00。(6)中斷程序使用的所有寄存器,包括狀態(tài)寄存器和程序中調(diào)用函數(shù)使用的寄存器都必須予以保護(hù)。(7)TMS320C54xC編譯器將C語(yǔ)言進(jìn)行了擴(kuò)展,中斷可以利用interrupt關(guān)鍵字由C/C++函數(shù)直接處理。4.5.5表達(dá)式分析當(dāng)C程序中需要計(jì)算整型表達(dá)式時(shí),必須注意以下幾點(diǎn):(1)算術(shù)上溢和下溢。

(2)整除和取模。

(3)C代碼對(duì)16位乘法結(jié)果高16位的訪問(wèn)。

intm1,m2,result; result=((long)m1*(long)m2)>>16;4.6用C語(yǔ)言和匯編語(yǔ)言混合編程4.6.1獨(dú)立的C模塊和匯編模塊接口4.6.2從C程序中訪問(wèn)匯編程序變量4.6.3在C程序中直接嵌入?yún)R編語(yǔ)句4.6.1C和匯編語(yǔ)言混合編程在編寫(xiě)?yīng)毩⒌膮R編程序時(shí),必須注意以下幾點(diǎn):(1)不論是用C語(yǔ)言編寫(xiě)的函數(shù)還是用匯編語(yǔ)言編寫(xiě)的函數(shù),都必須遵循寄存器使用規(guī)則。(2)必須保護(hù)函數(shù)要用到的幾個(gè)特定寄存器。

(3)中斷程序必須保護(hù)所有用到的寄存器。(4)從匯編程序調(diào)用C函數(shù)時(shí),第一個(gè)參數(shù)(最左邊)必須放入累加器A中,剩下的參數(shù)按自右向左的順序壓入堆棧。(5)調(diào)用C函數(shù)時(shí),注意C函數(shù)只保護(hù)了幾個(gè)特定的寄存器,而其他是可以自由使用的。(6)長(zhǎng)整型和浮點(diǎn)數(shù)在存儲(chǔ)器中存放的順序是低位字在高地址,高位字在低地址。(7)如果函數(shù)有返回值,返回值存放在累加器A中。(8)匯編語(yǔ)言模塊不能改變由C模塊產(chǎn)生的.cinit段,如果改變其內(nèi)容將會(huì)引起不可預(yù)測(cè)的后果。(9)編譯器在所有標(biāo)識(shí)符(函數(shù)名、變量名等)前加下劃線“_”。

(10)任何在匯編程序中定義的對(duì)象或函數(shù),如果需要在C程序中訪問(wèn)或調(diào)用,則必須用匯編指令.global定義。

(11)編輯模式CPL指示采用何種指針尋址,如果CPL=1,則采用堆棧指針SP尋址;如果CPL=0,則選擇頁(yè)指針DP進(jìn)行尋址。

C程序:

externint

asmfunc();/*聲明外部的匯編子程序*/

/*注意函數(shù)名前不要加下劃線*/

int

gvar;/*定義全局變量*/

main()

{

intI=3;

I=asmfunc(i);/*進(jìn)行函數(shù)調(diào)用*/

}

匯編程序:

_asmfunc:;函數(shù)名膠一定要有下劃線

ADD*(_gvar),A

;i的值在累加器A中

STLA,*(_gvar);返回結(jié)果在累加器A中

RETD;子程序返回

4.6.2C程序訪問(wèn)匯編程序變量從C程序中訪問(wèn)在匯編程序中定義的變量或常數(shù),可以分為以下3種情況:(1)訪問(wèn)在.bss塊中定義的變量

(2)對(duì)于訪問(wèn)不在.bss塊中定義的變量

(3)對(duì)于在匯編程序中用.set和.global偽指令定義的全局常數(shù),也可以使用特殊的操作從C程序中訪問(wèn)它們。

(1)訪問(wèn)在.bss塊中定義的變量用.bss命令定義變量用.global命令將其定義為外部變量在變量前加下劃線“_”匯編:.bss_var,1.global_varC程序:externint

var;

var=1;(2)訪問(wèn)不在.bss塊中定義的變量在匯編語(yǔ)言中定義一個(gè)查找表,然后在C語(yǔ)言中通過(guò)指針來(lái)訪問(wèn)。首先定義變量,而且最好放在獨(dú)立的初始化塊中。定義一個(gè)全局的標(biāo)識(shí)指向?qū)ο蟮钠鹗键c(diǎn),這樣對(duì)象可以分配在存儲(chǔ)器空間的任何位置。在C程序中將這個(gè)對(duì)象定義為外部對(duì)象(extern),并且對(duì)象名稱不帶下橫線“_”前綴,就可以對(duì)其進(jìn)行正常訪問(wèn)。(2)訪問(wèn)不在.bss塊中定義的變量匯編:

.global_sine.sect“sine_tab”_sine:float0.0float0.1float0.2float0.3C程序:

externfloatsine[];float*sine_point=sine;(3)在匯編中用.set和.global偽指令定義的全局常數(shù)匯編:_table_size.set1000.global_table_sizeC程序:externint

table_size;#defineTABLE_SIZE((int)(&table_size);匯編程序訪問(wèn)C程序C程序:

inti;

inth[];floatx;main(){}匯編程序:

.global_i.global_x.global_h.datah_add.word_h.textLD@_i,ASTA,@_xC程序:

externvoidad1247();/*定義外部的匯編函數(shù)*/

/*函數(shù)名前不必加下劃線*/

main()/*主程序*/

{

int

adlength=2048;/*數(shù)據(jù)的采樣長(zhǎng)度*/

int

adfreq=40;/*數(shù)據(jù)采樣頻率*/

.

.

}

匯編程序:

.mmregs

FP.setAR7

.sect".text"

.global_ad1247;定義匯編子程序,以global說(shuō)明要被外部的C程序調(diào)用,函數(shù)名前要有劃線

.bsslen,1;定義局部變量len

.bssfreq,1;定義局站變量freq,變量名前不必加下劃線

.

.

.

_ad1247;程序入口

PSHMAR6;保護(hù)AR6

PSHMAR7;保護(hù)AR7

PSHMAR1;保護(hù)AR1

FRAME#-16;為建立的局部幀分配空間函數(shù)體

STLA,*(len);將置于累加器A的第一個(gè)參數(shù)傳給變量len

SSBXCPL;用SP的直接尋址方式

LD@17,A;第二個(gè)參數(shù)的偏移地址

STLA,*(freq);將置于堆棧中的第二個(gè)參數(shù)傳給變量freq

.

.

.

FRAME#16;釋放局部幀的空間

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論