我知道,与MSP430F2619与TI的CCSv4工作时,我可以得到一个以上的中断使用相同的中断处理程序的代码看起来是这样的:TI MSP430中断源
#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){
ServiceWatchdogTimer();
}
我的问题是,当我发现自己处于中断状态时,是否有办法找出这些中断中的哪一个让我来到这里?
我知道,与MSP430F2619与TI的CCSv4工作时,我可以得到一个以上的中断使用相同的中断处理程序的代码看起来是这样的:TI MSP430中断源
#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();
}
您应该使用TAIV_NONE,TAIV_TACCR1,TAIV_TACCR2,TBIV_TBIFG替换交换机中的号码。 – eaanon01 2010-04-20 06:23:43
在MSP430F2122(可能还有其他)上,这些常量是'TA0IV_NONE','TA0IV_TACCR1','TA0IV_TACCR2'和'TA0IV_TAIFG'。 – 2012-05-25 01:58:37
不是一个“好”的答案,但为什么不让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();
}
另请注意,可能有一些平台特定的方法来确定当前正在执行的中断。我不知道这个平台。 – Earlz 2010-04-13 20:37:56
我不喜欢这个想法,因为我真正想要做的是设置特定处理程序的查找表,所以当中断被调用时,它会查看向量编号,查找该向量的中断处理程序。如果它的NULL,抛出一个错误,如果它不是NULL,则执行处理程序。你的解决方案会变得非常混乱。 – TheDelChop 2010-04-13 21:01:18
是的,它会的。可悲的是我没有看到它的方式。为PC(x86)创建一个操作系统我想做类似的事情,我不得不编写自修改/复制代码来在运行时填充查找表。它也不是很好,但是对于我处理的每个中断,超过32个重复函数都会更好。 – Earlz 2010-04-13 21:14:11
望着MSP430x1xx Family User's Guide,它看起来像设备不直接维护与信息的中断状态寄存器。您需要有两个独立的中断向量,以便您可以直接识别差异,或者需要查询两个设备以查看哪些服务需要。
如果您使用2个中断向量,他们肯定可以调用或跳转(如果您正在使用程序集)到同一个例程中执行大部分工作,如answer given by Earlz。
请注意,该芯片已经有一个中断向量表,所以要做你在另一个回答中做出的评论,你只需要将'未使用'中断的中断向量条目指向引发错误的例程。
为了使这篇文章清晰,我正在寻找表中的偏移量,基本上是上面代码中的“向量”的值。 – TheDelChop 2010-04-13 20:02:05
为什么你希望两者都有相同的中断?你必须使用不同interupts的知识,可以让你在那里找到答案。 – eaanon01 2010-04-14 11:08:37