我知道在使用MSP430F2619和TI的CCSv4时,我可以获得多个中断来使用相同的中断处理程序,代码看起来像这样:
#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){
ServiceWatchdogTimer();
}
我的问题是,当我发现自己处于那个中断时,有没有办法弄清楚这些中断中的哪一个让我来到这里?
答案 0 :(得分:5)
你的问题的一般答案是没有直接的方法来检测当前正在调用哪个中断。但是,每个中断都有自己的中断标志,因此您可以检查中断中的每个标志。你应该和带有enable的标志一起确保你正在处理实际被调用的中断。还有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();
}
答案 1 :(得分: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();
}
答案 2 :(得分:2)
查看MSP430x1xx Family User's Guide,看起来设备没有直接使用该信息维护中断状态寄存器。您需要有两个独立的中断向量,以便您可以直接识别差异,或者您需要查询两个设备以查看哪些需要服务。
如果您使用2个中断向量,他们当然可以调用或跳转(如果您正在使用程序集)到同一例程来执行answer given by Earlz中的大部分工作。
请注意,芯片已经有一个中断向量表,所以要在另一个答案的注释中执行您所说的内容,您只需将“未使用”中断的中断向量条目指向抛出错误的例程。