本文主要是關(guān)于DSP的相關(guān)介紹,并著重對(duì)DSP對(duì)中斷的理解及其入門應(yīng)用進(jìn)行了詳盡的闡述。
DSP
現(xiàn)代社會(huì)對(duì)數(shù)據(jù)通信需求正向多樣化、個(gè)人化方向發(fā)展。而無(wú)線數(shù)據(jù)通信作為向社會(huì)公眾迅速、準(zhǔn)確、安全、靈活、高效地提供數(shù)據(jù)交流的有力手段,其市場(chǎng)需求也日益迫切。正是在這種情況下,3G、4G通信才會(huì)不斷地被推出,但是無(wú)論是3G還是4G,未來(lái)通信都將離不開DSP技術(shù)(數(shù)字信號(hào)處理器),DSP作為一種功能強(qiáng)大的特種微處理器,主要應(yīng)用在數(shù)據(jù)、語(yǔ)音、視像信號(hào)的高速數(shù)學(xué)運(yùn)算和實(shí)時(shí)處理方面,可以說(shuō)DSP將在未來(lái)通信領(lǐng)域中起著舉足輕重的作用。
為了確保未來(lái)的通信能在各種環(huán)境下自由高效地工作,這就要求組成未來(lái)通信的DSP要具有非常高的處理信號(hào)的運(yùn)算速度,才能實(shí)現(xiàn)各種繁雜的計(jì)算、解壓縮和編譯碼。而目前DSP按照功能的側(cè)重點(diǎn)不一樣,可以分為定點(diǎn)DSP和浮點(diǎn)DSP,定點(diǎn)DSP以成本低見(jiàn)長(zhǎng),浮點(diǎn)DSP以速度快見(jiàn)長(zhǎng)。如果單一地使用一種類型的DSP,未來(lái)通信的潛能就不能得到最大程度的發(fā)揮。為了能將定點(diǎn)與浮點(diǎn)的優(yōu)勢(shì)集于一身,突破DSP技術(shù)上的瓶頸,人們又推出了一種高級(jí)多重處理結(jié)構(gòu)--VLIW結(jié)構(gòu),該結(jié)構(gòu)可以在不提高時(shí)鐘速度的情況下,實(shí)現(xiàn)很強(qiáng)的數(shù)字信號(hào)處理能力,而且它能同時(shí)具備定點(diǎn)DSP和浮點(diǎn)DSP所有的優(yōu)點(diǎn)。為了能推出一系列更高檔的新技術(shù)平臺(tái),人們又開始注重DSP的內(nèi)核技術(shù)的開發(fā),因?yàn)镈SP的內(nèi)核就相當(dāng)于計(jì)算機(jī)的CPU一樣,被譽(yù)為DSP的心臟,大量的算法和操作都得通過(guò)它來(lái)完成,因此該內(nèi)核結(jié)構(gòu)的質(zhì)量如何,將會(huì)直接影響整個(gè)DSP芯片的性能、功耗和成本。
考慮到未來(lái)無(wú)線訪問(wèn)Internet因特網(wǎng)和開展多媒體業(yè)務(wù)的需要,現(xiàn)在美國(guó)的Sun公司又開始準(zhǔn)備準(zhǔn)將該公司的拳頭產(chǎn)品--PersonalJava語(yǔ)言嵌入到DSP中,以便能進(jìn)一步提高DSP在處理信號(hào)方面的自動(dòng)化程度和智能化程度。當(dāng)然,在以前DSP中也潛入了其他軟件語(yǔ)言,例如高級(jí)C語(yǔ)言,但這種語(yǔ)言在處理網(wǎng)絡(luò)資源以及多媒體信息方面無(wú)能為力;而PersonalJava是一種適合個(gè)人網(wǎng)絡(luò)連接和應(yīng)用的Java環(huán)境,基于該環(huán)境的個(gè)人通信系統(tǒng)可以從網(wǎng)絡(luò)和Internet網(wǎng)上下載數(shù)據(jù)和圖像。此外,人們還在研究開發(fā)符合MPEG-4無(wú)線解壓縮標(biāo)準(zhǔn)DSP,該壓縮標(biāo)準(zhǔn)將為未來(lái)通信傳輸各種多媒體信息提供了依據(jù)。
作為一個(gè)案例研究,我們來(lái)考慮數(shù)字領(lǐng)域里最通常的功能:濾波。簡(jiǎn)單地說(shuō),濾波就是對(duì)信號(hào)進(jìn)行處理,以改善其特性。例如,濾波可以從信號(hào)里清除噪聲或靜電干擾,從而改善其信噪比。為什么要用微處理器,而不是模擬器件來(lái)對(duì)信號(hào)做濾波呢?我們來(lái)看看其優(yōu)越性:模擬濾波器(或者更一般地說(shuō),模擬電路)的性能要取決于溫度等環(huán)境因素。而數(shù)字濾波器則基本上不受環(huán)境的影響。數(shù)字濾波易于在非常小的寬容度內(nèi)進(jìn)行復(fù)制,因?yàn)槠湫阅懿⒉蝗Q于性能已偏離正常值的器件的組合。一個(gè)模擬濾波器一旦制造出來(lái),其特性(例如通帶頻率范圍)是不容易改變的。使用微處理器來(lái)實(shí)現(xiàn)數(shù)字濾波器,就可以通過(guò)對(duì)其重新編程來(lái)改變?yōu)V波的特性。
DSP中對(duì)中斷的理解
1 中斷概述
中斷定義:由硬件或軟件驅(qū)動(dòng)的信號(hào),使DSP將當(dāng)前的程序掛起,執(zhí)行另一個(gè)稱為中斷服務(wù)子程序(ISR)的任務(wù)。
C55x支持32個(gè)ISR。有些ISR可以由軟件或硬件觸發(fā),有些只能由軟件觸發(fā)。
當(dāng)CPU同時(shí)收到多個(gè)硬件中斷請(qǐng)求時(shí),CPU會(huì)按照預(yù)先定義的優(yōu)先級(jí)對(duì)它們做出響應(yīng)和處理。
所有的軟件中斷都是不可屏蔽中斷
DSP處理中斷的步驟:
(1)接收中斷請(qǐng)求。軟件和硬件都要求DSP將當(dāng)前程序掛起。
(2)響應(yīng)中斷請(qǐng)求。CPU必須響應(yīng)中斷。如果是可屏蔽中斷,響應(yīng)必須滿足某些條件。如果是不可屏蔽中斷,則CPU立即響應(yīng)。
(3)準(zhǔn)備進(jìn)入中斷服務(wù)子程序。
CPU要執(zhí)行的主要任務(wù)有:
完成當(dāng)前指令的執(zhí)行,并沖掉流水線上還未解碼的指令
自動(dòng)將某些必要的寄存器的值保存到數(shù)據(jù)堆棧和系統(tǒng)堆棧
從用戶實(shí)現(xiàn)設(shè)置好的向量地址獲取中斷向量,該中斷向量指向中斷服務(wù)子程序
(4)執(zhí)行中斷服務(wù)子程序。
CPU執(zhí)行用戶編寫的ISR。ISR以一條中斷返回指令結(jié)束,自動(dòng)恢復(fù)步驟(3)中自動(dòng)保存的寄存器值。
? 注意:
外部中斷只能發(fā)生在CPU退出復(fù)位后的至少3個(gè)周期后,否則無(wú)效;
在硬件復(fù)位后,不論INTM位的設(shè)置和寄存器IER0、IER1的值如何,所有的中斷都被禁止,直到通過(guò)軟件初始化堆棧后才開放中斷。
2 可屏蔽中斷
所有的可屏蔽中斷都是硬件中斷。
無(wú)論硬件何時(shí)請(qǐng)求一個(gè)可屏蔽中斷,在一個(gè)中斷標(biāo)志寄存器里就有相應(yīng)的中斷標(biāo)志置位。該標(biāo)志一旦置位,相應(yīng)的中斷還必須使能,否則不會(huì)得到處理。
當(dāng)CPU在實(shí)時(shí)硬件仿真模式下暫停時(shí),只能處理時(shí)間臨界中斷。
可屏蔽中斷標(biāo)準(zhǔn)處理流程:
1. 向CPU發(fā)送中斷請(qǐng)求。
2. 設(shè)置響應(yīng)的IFR標(biāo)志。CPU檢測(cè)到一個(gè)有效的可屏蔽中斷請(qǐng)求時(shí),它設(shè)置并鎖上某個(gè)中斷標(biāo)志寄存器的響應(yīng)標(biāo)志位,這個(gè)位保持鎖定,直到該中斷得到響應(yīng)或者復(fù)位,才清楚
3. IER中斷使能?根據(jù)中斷使能寄存器是否使能,響應(yīng)中斷。
4. INTM = 0?全局開放中斷,才響應(yīng)
5. 跳轉(zhuǎn)到ISR服務(wù)程序,
6. 執(zhí)行ISR服務(wù)程序
7, 返回。
3 不可屏蔽中斷
當(dāng)CPU接收到一個(gè)不可屏蔽中斷請(qǐng)求時(shí),立即無(wú)條件響應(yīng),并很快跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)子程序(ISR)
C55x的不可屏蔽中斷有:
硬件中斷/RESET。如果引腳/RESET為低電平,則觸發(fā)了一個(gè)DSP硬件復(fù)位和一個(gè)中斷(迫使執(zhí)行復(fù)位ISR)。
硬件中斷/NMI。如果引腳/NMI為低電平,則CPU必須執(zhí)行相應(yīng)的ISR。 /NMI提供了一種通用的無(wú)條件中斷DSP的硬件方法。
軟件中斷。
4 按鍵中斷
按鍵中斷,屬于可屏蔽中斷,用戶自定義硬件中斷,當(dāng)CPU響應(yīng)按鍵后,檢查相關(guān)引腳中斷標(biāo)記寄存器,若標(biāo)志位為1,則響應(yīng)該中斷。同時(shí),清除中斷標(biāo)志寄存器位。
5 c_int00
當(dāng)C環(huán)境被初始化時(shí),啟動(dòng)程序禁止中斷。 如果系統(tǒng)使用中斷,必須處理有關(guān)的中斷使能或屏蔽。
關(guān)于中斷的幾個(gè)要點(diǎn):
中斷程序會(huì)執(zhí)行任何其它函數(shù)執(zhí)行的工作,包括訪問(wèn)全局變量、為局部變量分配地址、調(diào)用其它函數(shù)。
需要處理任何特殊中斷屏蔽(通過(guò)IER0寄存器)。通過(guò)嵌入匯編語(yǔ)言語(yǔ)句可以使能或禁止中斷,也可以修改IER0寄存器而不會(huì)破壞C環(huán)境或C指針。
中斷處理程序不能有參數(shù),即使聲明了參數(shù)也會(huì)被忽略
中斷處理程序不能被普通C代碼調(diào)用。
為了將中斷程序和中斷聯(lián)系起來(lái),需要將分支程序放在合適的中斷向量中,通過(guò).sect指令創(chuàng)建一個(gè)簡(jiǎn)單的分支指令表就可以實(shí)現(xiàn)此操作。
在匯編語(yǔ)言中,需要在中斷程序名前加下劃線,如_c_int00。
分配堆棧到偶地址。
c_int00是系統(tǒng)復(fù)位中斷。當(dāng)進(jìn)入c_int00中斷時(shí),運(yùn)行時(shí)間堆棧并沒(méi)有被建立起來(lái),因此不能為局部變量分配地址,也不能在運(yùn)行時(shí)間堆棧中保存任何信息。
通過(guò)interrupt關(guān)鍵字可以用C函數(shù)直接處理中斷。
interrupt關(guān)鍵字可以和定義為返回void并不含參數(shù)的函數(shù)一起使用。中斷函數(shù)體可以有局部變量,可以自由使用堆棧。
c_int00是C程序入口。這個(gè)名字被保存為系統(tǒng)重啟中斷。這個(gè)特殊的中斷程序初始化系統(tǒng)并調(diào)用了主函數(shù)。因?yàn)闆](méi)有調(diào)用者,所以c_int00不保存任何寄存器。
例,
interrupt void isr()
{
。。.
}
中斷管理
基于DSP/BIOS管理中的硬件中斷,DSP/BIOS為中斷提供了一個(gè)HWI調(diào)度程序,為ISR完成必要的開頭和結(jié)尾部分。如果不使用,則在調(diào)用任何DSP/BIOS對(duì)象的API之前,必須調(diào)用HWI_enter和HWI_exit匯編宏來(lái)完成ISR的開頭和結(jié)束。實(shí)際上,DSP/BIOS提供的調(diào)度程序,就包括這兩個(gè)宏。
為了正確響應(yīng)硬件中斷,同時(shí),也為了DSP/BIOS內(nèi)核的穩(wěn)定性,必須注意:
1 在一個(gè)硬件中斷ISR中,不要調(diào)用SWI_disable和SWI_enable。
2 在NMI(不可屏蔽)中斷中,不要調(diào)用硬件中斷使能/禁止函數(shù)。
3 當(dāng)使用DSP/BIOS調(diào)度程序時(shí),不要使用HWI_exit和HWI_enter匯編宏
4 中斷中,可以打開新中斷。
我們可以在中斷配置選項(xiàng)卡中,設(shè)置Interrupt Mask 來(lái)實(shí)現(xiàn)在DSP/BIOS調(diào)度程序執(zhí)行前禁止某些中斷。
淺談DSP入門應(yīng)用
1、DSP中斷管理分為3個(gè)層次:外設(shè)級(jí),PIE級(jí),CPU級(jí)。
其中,外設(shè)級(jí)中斷管理負(fù)責(zé)具體外設(shè)中斷源的允許與禁止,PIE級(jí)中斷管理負(fù)責(zé)對(duì)外設(shè)級(jí)中斷分組并按照優(yōu)先級(jí)管理,CPU內(nèi)核級(jí)中斷管理則負(fù)責(zé)處理直接向CPU申請(qǐng)的中斷請(qǐng)求。
DSP控制器的外設(shè)中斷擴(kuò)展模塊(PIE),對(duì)中斷進(jìn)行集中化擴(kuò)展,使每一級(jí)CPU中斷均可以響應(yīng)多個(gè)中斷源。
2、PIE級(jí)中斷及管理:
CPU內(nèi)核級(jí)中斷(INT1–INT14),INT1-INT12被PIE模塊用來(lái)進(jìn)行中斷擴(kuò)展,有12組,每組8個(gè)中斷源。
各中斷的優(yōu)先級(jí)自上而下,由右到左逐步降低,總體優(yōu)先級(jí)INT1最高,INT12最低。
INT13由CPU定時(shí)器1和外部中斷XINT13復(fù)用,INT14由定時(shí)器2獨(dú)占。
3、中斷響應(yīng)過(guò)程
4、中斷寄存器介紹
PIEIFRx (1-12)中斷標(biāo)志寄存器
PIEIERx (1-12)中斷屏蔽寄存器
各有12個(gè),每個(gè)16位寬,只用了前8位分別表示8個(gè)中斷源;IFR標(biāo)志中斷到來(lái),IER表示是否要響應(yīng)(PIEIFRx.1-8,PIEIERx.1-8)
PIEACKx (1-12)應(yīng)答位
CPU是否響應(yīng)給位的中斷,為0中斷送入CPU,為1等待
PIECTRL PIE控制寄存器,只讀
讀取中斷向量
XINTnCR (n為1-7) 7個(gè)外部中斷
選擇中斷邊沿,01上升沿;外部中斷允許位
5、代碼片
PieCtrlRegs.PIEIFR1.bit.INTx4=1;//在PIE中斷組1設(shè)置XINT1的中斷標(biāo)志位
PieCtrlRegs.PIEIER1.bit.INTx4=1;//允許PIE中斷組1的XINT1 中斷
PieCtrlRegs.PIEACK.all = 0x0004;//清除中斷組3的ACK位,以便再次響應(yīng)
PieCtrlRegs.PIECTRL.bit.ENPIE=1;//允許從向量表中讀取中斷向量
1
2
3
4
5
6、定時(shí)器中斷實(shí)例
#include “DSP2833x_Device.h”
#include “DSP2833x_Examples.h”
interrupt void cpu_timer0_isr(void);//聲明中斷服務(wù)函數(shù)
void main()
{
//step1:初始化系統(tǒng)控制、PLL、看門狗、允許外設(shè)時(shí)鐘
InitSysCtrl();
//step2:初始化GPIO
InitGpio();
//step3:清除所有中斷,初始化PIE向量表
DINT;
InitPieCtrl(); //初始化PIE控制器
IER = 0x0000; //禁止CPU中斷
IFR = 0x0000; //清除所有CPU中斷標(biāo)志
InitPieVectTable(); //初始化PIE中斷向量表
EALLOW;
PieVectTable.TINT0 = &cpu_timer0_isr; //重映射中斷向量,指向中斷服務(wù)程序
EDIS;
//step4:初始化外設(shè)模塊
InitCpuTimers();
ConfigCpuTimer(&CpuTimer0,150,1000000); //150MHz,周期1秒
CpuTimer0Regs.TCR.all = 0x4001; //允許定時(shí)器中斷,且設(shè)置TSS為0啟動(dòng)定時(shí)器工作
//step5:
IER |= M_INT1; //允許CPU的INT1中斷,該中斷連接至TINT0
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //在PIE中斷組1中允許TINT0中斷
EINT; //清除全局屏蔽
ERTM; //允許全局實(shí)時(shí)中斷
//step6:循環(huán)
while(1);
}
interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //清除PIE中斷組1的應(yīng)答位,以便CPU再次響應(yīng)
}
結(jié)語(yǔ)
關(guān)于DSP的相關(guān)介紹就到這了,希望通過(guò)本文能讓你對(duì)DSP有更全面的認(rèn)識(shí)。
評(píng)論
查看更多