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