我知道在使用 MSP430F2619 和 TI 的 CCSv4 时,我可以获得多个中断来使用相同的中断处理程序,代码如下所示:
#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){
ServiceWatchdogTimer();
}
我的问题是,当我发现自己被打断时,有没有办法弄清楚是哪一个打断让我来到了这里?
我知道在使用 MSP430F2619 和 TI 的 CCSv4 时,我可以获得多个中断来使用相同的中断处理程序,代码如下所示:
#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){
ServiceWatchdogTimer();
}
我的问题是,当我发现自己被打断时,有没有办法弄清楚是哪一个打断让我来到了这里?
您的问题的一般答案是没有直接的方法来检测当前正在调用哪个中断。但是,每个中断都有自己的中断标志,因此您可以检查中断中的每个标志。您应该使用启用标志来确保您正在处理实际调用的中断。此外,MSP430 上的定时器还有矢量 TAIV,它可以告诉您在 A1 处理程序中要处理什么。TAIV 的情况 0 是 A1 处理程序没有中断,因此对于这种情况,您可以假设它是 A0 处理程序。
我会做类似以下的事情。
#pragma vector=TIMERA0_VECTOR
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
switch (TAIV) // Efficient switch-implementation
{
case TAIV_NONE: // TACCR0 TIMERA0_VECTOR
break;
case TAIV_TACCR1: // TACCR1 TIMERA1_VECTOR
break;
case TAIV_TACCR2: // TACCR2 TIMERA1_VECTOR
break;
case TBIV_TBIFG: // Timer_A3 overflow TIMERA1_VECTOR
break;
default;
break;
}
ServiceWatchdogTimer();
}
不是一个“好”的答案,但为什么不让 2 个单独的中断处理程序调用同一个函数呢?
就像是
__interrupt void Timer_A0_handler (void){
Timer_Handler(0);
}
__interrupt void Timer_A1_handler (void){
Timer_Handler(1);
}
void Timer_Handler(int which){
if(which==1){
...
}else{
...
}
...
ServiceWatchdogTimer();
}
查看MSP430x1xx 系列用户指南,看起来该设备没有直接使用该信息维护中断状态寄存器。您要么需要有 2 个独立的中断向量,以便直接识别差异,要么需要查询两个设备以查看哪些设备需要服务。
如果您使用 2 个中断向量,它们当然可以调用或跳转(如果您使用汇编)到相同的例程来执行Earlz 给出的答案中的大部分工作。
请注意,该芯片已经有一个中断向量表,因此要执行您在另一个答案中所做的评论中所说的内容,您只需将“未使用”中断的中断向量条目指向抛出的例程一个错误。