想问下TI提供的interrupt.c和intvecs.asm这两个函数怎么确定服务子程序入口地址的。 intcVectorTable具体的地址是由什么去决定的
//interrupt.c部分代码
void IntDSPINTCInit (void) {unsigned int step = 0;/* Set ISRs to default "do-nothing" routine */while(step != C674X_INT_COUNT)c674xISRtbl[step++] = IntDefaultHandler;/* Set interrupt service table pointer to the vector table */ #ifdef __TI_EABI__ISTP = (unsigned int)_intcVectorTable; #elseISTP = (unsigned int)intcVectorTable;// ISTP = (unsigned int)0x00800000; #endif/* Clear pending CPU maskable interrupts (if any) */ICR = 0xFFF0;/* Enable NMIE bit to allow CPU maskable interrupts */IER = (1 << C674X_NMI); } //intvecs.asm代码
; ; File: intvecs.asm ; ; Brief: Contains interrupt vector table and fetch packets ; ; Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ ; ALL RIGHTS RESERVED ;********************************************************** ; Global Symbols ;********************************************************** .global _intcVectorTable .global _c_int00 .global _c674x_nmi_isr .global _c674x_rsvd_int2_isr .global _c674x_rsvd_int3_isr .global _c674x_mask_int4_isr .global _c674x_mask_int5_isr .global _c674x_mask_int6_isr .global _c674x_mask_int7_isr .global _c674x_mask_int8_isr .global _c674x_mask_int9_isr .global _c674x_mask_int10_isr .global _c674x_mask_int11_isr .global _c674x_mask_int12_isr .global _c674x_mask_int13_isr .global _c674x_mask_int14_isr .global _c674x_mask_int15_isr ;********************************************************** ; Interrupt Fetch Packet ;********************************************************** VEC_ENTRY .macro addr STW B0,*--B15 MVKL addr,B0 MVKH addr,B0 B B0 LDW *B15++,B0 NOP 2 NOP NOP .endm ;********************************************************** ; Interrupt Vector Table ;********************************************************** .align 1024 _intcVectorTable: VEC_ENTRY _c_int00 VEC_ENTRY _c674x_nmi_isr VEC_ENTRY _c674x_rsvd_int2_isr VEC_ENTRY _c674x_rsvd_int3_isr VEC_ENTRY _c674x_mask_int4_isr VEC_ENTRY _c674x_mask_int5_isr VEC_ENTRY _c674x_mask_int6_isr VEC_ENTRY _c674x_mask_int7_isr VEC_ENTRY _c674x_mask_int8_isr VEC_ENTRY _c674x_mask_int9_isr VEC_ENTRY _c674x_mask_int10_isr VEC_ENTRY _c674x_mask_int11_isr VEC_ENTRY _c674x_mask_int12_isr VEC_ENTRY _c674x_mask_int13_isr VEC_ENTRY _c674x_mask_int14_isr VEC_ENTRY _c674x_mask_int15_isr
weihua li:
真正的子程序入口是通过后续的注册函数 IntRegister(); 实现的。
这里的 intcVectorTable 和 c674xISRtbl[16]数组,是一个东西。在interrupt.c里面你可以看到有这样的调用
interrupt void c6748_mask_int5_isr (viod)
{
c674xISRtbl[5];
}
注册就是将你的中断入口函数指针放到c674xISRtbl[]数组里面。
yuke yang:
回复 weihua li:
正解,终于明白了,谢谢!!!!