1. 編寫插斷服務常式
在.c源檔案中編寫ISR函數c_intXX,用於中斷處理,如:
interrupt void c_intXX (void)
{
…;
}
註:對於硬體中斷而言,XX = 00~15。
2.初始化中斷向量表,並在記憶體段中的中斷向量表中配置好對應的中斷向量
首先是把中斷向量表定位到某一記憶體段中,我們可以在cmd檔案中配置中斷向量表的記憶體映射,如:
MEMORY
{
VECTORS: org = 00000000h, len = 00000400h
L2SRAM: org = 00000400h, len = 00100000h
SDRAM: org = 80000000h, len = 10000000h
}
SECTIONS
{
.vecs :> VECTORS
.data :> L2SRAM
.text :> L2SRAM
.switch :> L2SRAM
.stack :> L2SRAM
.bss :> L2SRAM
.cinit :> L2SRAM
.far :> L2SRAM
.cio :> L2SRAM
.const :> L2SRAM
.sysmem :> SDRAM
.tables :> L2SRAM
}
然後建立一個.asm檔案,用以配置中斷向量表中的中斷向量,我們需要聲明一些全域變數,以便其他源檔案可以引用這些變數或者引用其他源檔案的變數,如:
.global _vectors
.global _c_int00
.global _vector1
.global _vector2
.global _vector3
.global _vector4
.global _vector5
.global _vector6
.global _vector7
.global _c_int08 ; 對應main()函數的c_int08插斷服務常式(假設處理的是EDMA中斷)
.global _vector9
.global _vector10
.global _vector11
.global _vector12
.global _vector13
.global _vector14
.global _vector15
因為引用了rts的_c_int00中斷,即RESET中斷,因此需要引入這個符號:
.ref _c_int00
為了把插斷服務常式的地址,即中斷向量插入到中斷向量表中,可以定義一個宏:
VEC_ENTRY .macro addr
STW B0,*--B15
MVKL addr,B0
MVKH addr,B0
B B0
LDW *B15++,B0
NOP 2
NOP
NOP
.endm
為了初始化中斷向量表中的中斷向量,可以定義一個虛擬中斷向量:
_vec_dummy:
B B3
NOP 5
接下來就可以配置中斷向量表了:
.sect “.vecs”
.align 1024
_vectors:
_vector0: VEC_ENTRY _c_int00 ;RESET中斷
_vector1: VEC_ENTRY _vec_dummy ;NMI不可屏蔽中斷
_vector2: VEC_ENTRY _vec_dummy ;保留中斷1
_vector3: VEC_ENTRY _vec_dummy ;保留中斷2
_vector4: VEC_ENTRY _vec_dummy ;外部中斷INT4
_vector5: VEC_ENTRY _vec_dummy ;外部中斷INT5
_vector6: VEC_ENTRY _vec_dummy ;外部中斷INT6
_vector7: VEC_ENTRY _vec_dummy ;外部中斷INT7
_vector8: VEC_ENTRY _c_int08 ; EDMA控制器中斷EDMAINT,對應於c_int08 ISR
_vector9: VEC_ENTRY _vec_dummy;JTAGRTDX中斷
_vector10: VEC_ENTRY _vec_dummy;EMIF_SDRAM_Timer中斷
_vector11: VEC_ENTRY _vec_dummy;McBSP_0_Receive中斷
_vector12: VEC_ENTRY _vec_dummy;McBSP_1_Transmit中斷
_vector13: VEC_ENTRY _vec_dummy;Host_Port_Host_to_DSP中斷
_vector14: VEC_ENTRY _vec_dummy;Timer0中斷
_vector15: VEC_ENTRY _vec_dummy;Timer1中斷
3. 在C程式中指定定義的中斷向量表,並且啟用CPU中斷功能
在C程式中,用CSL的IRQ模組來設定中斷比較方便,在設定之前,需要外部連結上面的asm程式的中斷向量表符號:
extern far void vectors();//之所以為vectors,因為C編譯器編譯後自動改名其為_vectors
引用了中斷向量表之後,就可以設定中斷了:
IRQ_setVecs(vectors); //指向asm中定義的中斷向量表
IRQ_nmiEnable();
IRQ_globalEnable();
IRQ_map(IRQ_EVT_EDMAINT, 8); //映射事件到指定的物理中斷號
IRQ_reset(IRQ_EVT_EDMAINT);
4.啟動中斷源,如EDMA控制器的中斷
至此,插斷服務常式c_int8就可以為EDMAINT中斷服務了,其它硬體中斷向量的配置同理。