TI DSP使用中断中,中断函数运行机制

以中断向量表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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值