以中断向量表PieVectTable作为引子
1、定义
在DSP2803x_GlobalVariableDefs.c文件中
struct PIE_VECT_TABLE PieVectTable;
2、是怎么与中断向量函数入口地址对应上的
在DSP2803x_GlobalVariableDefs.c文件中
#ifdef __cplusplus
#pragma DATA_SECTION(“PieVectTableFile”)
#else
#pragma DATA_SECTION(PieVectTable,“PieVectTableFile”);
#endif
这是指定PieVectTable到指定的储存空间PieVectTableFile里面。
PieVectTableFile在哪里呢?看系统的CMD文件有一段代码
UNION run = PIE_VECT, PAGE = 1
{
PieVectTableFile
GROUP
{
EmuKeyVar
EmuBModeVar
FlashCallbackVar
FlashScalingVar
}
}
具体意思不清楚,但是大概是把PIE_VECT 作为 PieVectTableFile
PIE_VECT 的定义是
PIE_VECT : origin = 0x000D00, length = 0x000100
再看官方文档中中断的地址
这样就把PieVectTable成功定义到中断入口地址了
在使用的时候
PieVectTable.EPWM1_TZINT = &EPWM1_TZ_isr;
即可与指定函数EPWM1_TZ_isr对应上。
问题
在工程中有一段初始化代码
void InitPieVectTable(void)
{
int16 i;
PINT *pPieTable = (void *) &PieVectTable;
EALLOW;
for(i=0; i < 128; i++)
{
*pPieTable++ = rsvd_ISR;
}
EDIS;
// Enable the PIE Vector Table
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
}
之前我以为这是给定函数入口地址,但是后来发现入口地址已经定义好了,然后我以为是对应的中断函数,发现也不是。仔细查看发现所有都是初始化为rsvd_ISR,显然rsvd_ISR是被定义的中断函数。
int gErrorIntCnt;
interrupt void rsvd_ISR(void)
{
gErrorIntCnt++; //监控是否有错误进入中断的情况
}
所以这个初始化其实是没有作用的,只是用来统计是否有中断错误。就是没有使能这个中断,但是这个中断发生了,统计gErrorIntCnt就行。正常情况gErrorIntCnt应该是0。