C6000 DSP技术深度探索(3)-中断向量表
生活随笔
收集整理的這篇文章主要介紹了
C6000 DSP技术深度探索(3)-中断向量表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DSP 作為一款處理器,它也支持中斷處理,對于中斷機制的引入,這里就不多說了,下面仍然以C6000系列DSP為例,探討一下中斷向量表,在前一篇文章中,
提到了匯編文件中存在一種特殊的文件,該文件通常命名為vectors.asm,這個文件就是中斷向量表的定義,那么這個文件是從何而來,與DSP硬件之間的聯系
在哪呢,這就要提到CPU的中斷,在討論中斷之前,我先把一個中斷向量表文件的內容列舉如下:
==========================================vectors.asm==============================================
? ? .ref ? ?_c_int00
.ref _my_isr ? ? ? ?
??
.sect "vectors"
; tell assembler not to use 16-bit compact instructions
; or else the vectors will not reside properly in memory
; (applies to entire section in which it is contained)
.nocmp
RESET_RST: ??
? ?mvkl .S2 _c_int00, B0
? ?mvkh .S2 _c_int00, B0
? ?B ? ?.S2 B0
NOP
NOP
NOP
NOP
? ?NOP
NMI_RST: ? ?
? ?NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RESV1:
? ?NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RESV2:
? ?NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT4:
b _my_isr
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT5:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
? ? ? ? ? ? ? ? ? ?
INT6:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT7:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT8:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT9:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT10:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT11:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT12:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT13:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT14:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT15:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
==========================================vectors.asm end============================================
從上面可以看出,上面都是使用匯編語言實現的,看到匯編不要頭疼,我們先放下這個不談,而是先從中斷說起,DSP在正常工作狀態下,不可避免的腰被外部
事件(GPIO、串口、EDMA等等)打斷,這些事件就是DSP的中斷源頭,產生這些事件后,DSP就要先記錄當前的工作狀態(保護現場),然后放下手頭的工作,轉
而去執行相應事件的處理程序(跳轉到中斷服務程序),對于C6000系列DSP,主要有四種類型的中斷:
[1]復位中斷
[2]不可屏蔽中斷(NMI)
[3]可屏蔽中斷(INT4-INT15)
[4]異常(僅C64x+內核支持)
對于前面三種中斷,從上到下,優先級依次降低,其中復位中斷的中斷源就是DSP的reset復位信號,對于第四種是只有C64x+內核支持的異常,當異常使能時,
NMI輸入是用作異常的。對于可屏蔽中斷(INT4-INT15),從INT4到INT15,它們的中斷優先級是依次降低的,因此INT4優先級最高,INT15優先級最低。由于任何
一個中斷服務例程都可能是原子(atomic)類型的,因此這里的優先級并不是說高優先級中斷可以搶占低優先級中斷(中斷嵌套),而是說中斷的阻塞,即兩個中斷
同時到來時,高優先級中斷會優先得到支持,低優先級中斷將被阻塞不被處理,當然通過軟件的方式,可以實現中斷的嵌套,這是后話。
? ? ?有了中斷,問題就來了,DSP怎么知道某一個事件來臨時,執行哪一段代碼呢,這就引出了中斷服務表(Interrupt Service Table(IST)),DSP在收到中斷后
會查取這個表,通過這個表跳到相應的中斷服務程序,既然這是一個表,它肯定就需要按一個既定的格式定義,其格式如下:
===========================
中斷向量表(IST)
===========================
? ?地址 ? ? ? ? ?中斷取指包
===========================
xxxx 000h ? ? ? RESET ISFP
xxxx 020h NMI ISFP
xxxx 040h Reserved
xxxx 060h Reserved
xxxx 080h INT4 ISFP
xxxx 0A0h INT5 ISFP
xxxx 0C0h INT6 ISFP
xxxx 0E0h INT7 ISFP
xxxx 100h INT8 ISFP
xxxx 120h INT9 ISFP
xxxx 140h INT10 ISFP
xxxx 160h INT11 ISFP
xxxx 180h INT12 ISFP
xxxx 1A0h INT13 ISFP
xxxx 1C0h INT14 ISFP
xxxx 1E0h INT15 ISFP
===========================
Program memory
為了理解上面的表,需要先引入一個概念-中斷取指包(interrupt service fetch packet,ISTP),每個中斷取指包在內存中固定的占用32字節空間,每個
取指包最多可包含14條指令(這里是指壓縮指令,對于非壓縮指令,只能存儲8條),一個中斷向量表就由16個這樣的取指包依次連續排列而成,上表左側即標示了
中斷取指包之間的相對內存位置關系,后面就是各個地址需要存放的中斷取指包,不同的地址固定的對應前面提到的中斷,只是第三個和第四個為保留中斷,有了這
個表,我們就可以大致的和上面的vectors.asm文件進行對比,可以看出vectors.asm中,.sect "vectors"之后,就是定義的16條中斷取指包。
由于一個中斷取指包只能存儲8個32bit指令,即使是壓縮指令也只能存儲14條因此出現了兩種情況,一種情況是,中斷服務例程足夠小,能夠存儲在一條中斷
取指包中完成,另一種情況就是,我們知道,實際的中斷服務程序通常遠遠大于這個限制,這時我們通常是在取指包中加入一條跳轉指令,通過跳轉指令跳轉到實際
的中斷服務例程,如上面vectors.asm中的中斷4的的取值包,它就是通過 “b _my_isr”跳轉到中斷服務程序,這個中斷服務程序通常是在C語言中定義的,它的
定義如下:
interrupt void my_isr()
{
asm(" NOP");
asm(" NOP");
asm(" NOP");
}
? ? 上面除了中斷4掛接了中斷,我們還看到第一個復位中斷的中斷取指包如下:
RESET_RST: ??
? ?mvkl .S2 _c_int00, B0
? ?mvkh .S2 _c_int00, B0
? ?B ? ?.S2 B0
NOP
NOP
NOP
NOP
? ?NOP
這條指令包的作用與中斷4指令包的作用一樣,也是跳到一個中斷服務函數,(但是為什么這條指令包不能直接使用 B _c_int00,我目前的想法是此時C語言的運行時
環境尚未建立,這一點需要進一步驗證),_c_int00的作用就比較特殊,它就是用于建立C語言的運行時環境,建立完成后,該函數就會調用我們C語言中常見的main函數
,下一節,我們將對_c_int00進行詳細的探討。
提到了匯編文件中存在一種特殊的文件,該文件通常命名為vectors.asm,這個文件就是中斷向量表的定義,那么這個文件是從何而來,與DSP硬件之間的聯系
在哪呢,這就要提到CPU的中斷,在討論中斷之前,我先把一個中斷向量表文件的內容列舉如下:
==========================================vectors.asm==============================================
? ? .ref ? ?_c_int00
.ref _my_isr ? ? ? ?
??
.sect "vectors"
; tell assembler not to use 16-bit compact instructions
; or else the vectors will not reside properly in memory
; (applies to entire section in which it is contained)
.nocmp
RESET_RST: ??
? ?mvkl .S2 _c_int00, B0
? ?mvkh .S2 _c_int00, B0
? ?B ? ?.S2 B0
NOP
NOP
NOP
NOP
? ?NOP
NMI_RST: ? ?
? ?NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RESV1:
? ?NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RESV2:
? ?NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT4:
b _my_isr
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT5:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
? ? ? ? ? ? ? ? ? ?
INT6:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT7:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT8:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT9:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT10:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT11:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT12:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT13:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT14:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INT15:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
==========================================vectors.asm end============================================
從上面可以看出,上面都是使用匯編語言實現的,看到匯編不要頭疼,我們先放下這個不談,而是先從中斷說起,DSP在正常工作狀態下,不可避免的腰被外部
事件(GPIO、串口、EDMA等等)打斷,這些事件就是DSP的中斷源頭,產生這些事件后,DSP就要先記錄當前的工作狀態(保護現場),然后放下手頭的工作,轉
而去執行相應事件的處理程序(跳轉到中斷服務程序),對于C6000系列DSP,主要有四種類型的中斷:
[1]復位中斷
[2]不可屏蔽中斷(NMI)
[3]可屏蔽中斷(INT4-INT15)
[4]異常(僅C64x+內核支持)
對于前面三種中斷,從上到下,優先級依次降低,其中復位中斷的中斷源就是DSP的reset復位信號,對于第四種是只有C64x+內核支持的異常,當異常使能時,
NMI輸入是用作異常的。對于可屏蔽中斷(INT4-INT15),從INT4到INT15,它們的中斷優先級是依次降低的,因此INT4優先級最高,INT15優先級最低。由于任何
一個中斷服務例程都可能是原子(atomic)類型的,因此這里的優先級并不是說高優先級中斷可以搶占低優先級中斷(中斷嵌套),而是說中斷的阻塞,即兩個中斷
同時到來時,高優先級中斷會優先得到支持,低優先級中斷將被阻塞不被處理,當然通過軟件的方式,可以實現中斷的嵌套,這是后話。
? ? ?有了中斷,問題就來了,DSP怎么知道某一個事件來臨時,執行哪一段代碼呢,這就引出了中斷服務表(Interrupt Service Table(IST)),DSP在收到中斷后
會查取這個表,通過這個表跳到相應的中斷服務程序,既然這是一個表,它肯定就需要按一個既定的格式定義,其格式如下:
===========================
中斷向量表(IST)
===========================
? ?地址 ? ? ? ? ?中斷取指包
===========================
xxxx 000h ? ? ? RESET ISFP
xxxx 020h NMI ISFP
xxxx 040h Reserved
xxxx 060h Reserved
xxxx 080h INT4 ISFP
xxxx 0A0h INT5 ISFP
xxxx 0C0h INT6 ISFP
xxxx 0E0h INT7 ISFP
xxxx 100h INT8 ISFP
xxxx 120h INT9 ISFP
xxxx 140h INT10 ISFP
xxxx 160h INT11 ISFP
xxxx 180h INT12 ISFP
xxxx 1A0h INT13 ISFP
xxxx 1C0h INT14 ISFP
xxxx 1E0h INT15 ISFP
===========================
Program memory
為了理解上面的表,需要先引入一個概念-中斷取指包(interrupt service fetch packet,ISTP),每個中斷取指包在內存中固定的占用32字節空間,每個
取指包最多可包含14條指令(這里是指壓縮指令,對于非壓縮指令,只能存儲8條),一個中斷向量表就由16個這樣的取指包依次連續排列而成,上表左側即標示了
中斷取指包之間的相對內存位置關系,后面就是各個地址需要存放的中斷取指包,不同的地址固定的對應前面提到的中斷,只是第三個和第四個為保留中斷,有了這
個表,我們就可以大致的和上面的vectors.asm文件進行對比,可以看出vectors.asm中,.sect "vectors"之后,就是定義的16條中斷取指包。
由于一個中斷取指包只能存儲8個32bit指令,即使是壓縮指令也只能存儲14條因此出現了兩種情況,一種情況是,中斷服務例程足夠小,能夠存儲在一條中斷
取指包中完成,另一種情況就是,我們知道,實際的中斷服務程序通常遠遠大于這個限制,這時我們通常是在取指包中加入一條跳轉指令,通過跳轉指令跳轉到實際
的中斷服務例程,如上面vectors.asm中的中斷4的的取值包,它就是通過 “b _my_isr”跳轉到中斷服務程序,這個中斷服務程序通常是在C語言中定義的,它的
定義如下:
interrupt void my_isr()
{
asm(" NOP");
asm(" NOP");
asm(" NOP");
}
? ? 上面除了中斷4掛接了中斷,我們還看到第一個復位中斷的中斷取指包如下:
RESET_RST: ??
? ?mvkl .S2 _c_int00, B0
? ?mvkh .S2 _c_int00, B0
? ?B ? ?.S2 B0
NOP
NOP
NOP
NOP
? ?NOP
這條指令包的作用與中斷4指令包的作用一樣,也是跳到一個中斷服務函數,(但是為什么這條指令包不能直接使用 B _c_int00,我目前的想法是此時C語言的運行時
環境尚未建立,這一點需要進一步驗證),_c_int00的作用就比較特殊,它就是用于建立C語言的運行時環境,建立完成后,該函數就會調用我們C語言中常見的main函數
,下一節,我們將對_c_int00進行詳細的探討。
總結
以上是生活随笔為你收集整理的C6000 DSP技术深度探索(3)-中断向量表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编常用指令二
- 下一篇: 超声波传感器闪光|乐高EV3教学