请问下,关于中断嵌套方面需要做哪些处理。
我项目上,有两个中断。中断A和中断B。B优先极高。
当A在执行中断函数,B可以打断,进入B的中断,这时候A的堆栈是否需要软件手动保留?还是自动压栈?
如果是自动压栈,A执行完中断后就会回到B的中断,最后回到最初压栈的地方?
我可否这么理解:
只需要在A的中断函数里第一行就清除所有中断标志位,打开所有除了A中断的中断?这样就可以优先级高的B中断就没问题了?
B中断函数按照正常中断来就行。不可以被打断?
Seven Han:
您好,
可参考WIKI链接:http://processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28
以及例程:C:\ti\controlSUITE\device_support\f2803x\v130\DSP2803x_examples_ccsv5\sw_prioritized_interrupts
请问下,关于中断嵌套方面需要做哪些处理。
我项目上,有两个中断。中断A和中断B。B优先极高。
当A在执行中断函数,B可以打断,进入B的中断,这时候A的堆栈是否需要软件手动保留?还是自动压栈?
如果是自动压栈,A执行完中断后就会回到B的中断,最后回到最初压栈的地方?
我可否这么理解:
只需要在A的中断函数里第一行就清除所有中断标志位,打开所有除了A中断的中断?这样就可以优先级高的B中断就没问题了?
B中断函数按照正常中断来就行。不可以被打断?
Emma Wang:
您好,
我们设定中断A使用ADCINT2,中断B使用ADCINT1。
这样中断B的优先级高于中断A。
B中断,代码与平时无异:
interrupt void B(void)
{
//user code
AdcRegs.ADCINTFLGCLR.all = 0x1; //Clear interrupt flag;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
AdcRegs.ADCINTFLGCLR.all = 0x1; //Clear interrupt flag;
}
在被打断的A中断中,代码修改如下:
interrupt void A(void)
{ volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER1.all;
IER |= M_INT1;
IER &= M_INT1;
PieCtrlRegs.PIEIER1.all &= 0x01; // Only allow ADCINT1 to interrupt
PieCtrlRegs.PIEACK.all = 0xFFFF;
EINT;
…………
//user code
DINT;
AdcRegs.ADCINTFLGCLR.all = 0x2; //Clear interrupt flag;
PieCtrlRegs.PIEIER1.all = TempPIEIER;
}
请问下,关于中断嵌套方面需要做哪些处理。
我项目上,有两个中断。中断A和中断B。B优先极高。
当A在执行中断函数,B可以打断,进入B的中断,这时候A的堆栈是否需要软件手动保留?还是自动压栈?
如果是自动压栈,A执行完中断后就会回到B的中断,最后回到最初压栈的地方?
我可否这么理解:
只需要在A的中断函数里第一行就清除所有中断标志位,打开所有除了A中断的中断?这样就可以优先级高的B中断就没问题了?
B中断函数按照正常中断来就行。不可以被打断?
user5089339:
回复 Seven Han:
我其实知道例程,但是感觉好乱,很反感,直接不想看。还是谢谢!
请问下,关于中断嵌套方面需要做哪些处理。
我项目上,有两个中断。中断A和中断B。B优先极高。
当A在执行中断函数,B可以打断,进入B的中断,这时候A的堆栈是否需要软件手动保留?还是自动压栈?
如果是自动压栈,A执行完中断后就会回到B的中断,最后回到最初压栈的地方?
我可否这么理解:
只需要在A的中断函数里第一行就清除所有中断标志位,打开所有除了A中断的中断?这样就可以优先级高的B中断就没问题了?
B中断函数按照正常中断来就行。不可以被打断?
jiangfeng li40:
弄明白的就不觉得乱了