如果一个中断只在ISR中就执行完成,而不需要到IST中,应该如何做呢?

时间:2022-08-12 12:23:41
以上的目的是加快中断的响应速度。

例如一个外部中断,在ISR中OEMInterruptHandler函数中
if(irq == IRQ_EINT1)
{
         mask = 1 << irq;
SETREG32(&g_pIntrRegs->INTMSK, mask);
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
(*touchtimes)++;

我只需要完成计数这样的简单工作就好了。不需要再转到IST中。但我总该返回一个sysintr值,或者重新打开中断啥的。

上面的一段程序我还缺少些啥,麻烦大家帮忙一下。

11 个解决方案

#1


你只是想技术吗?可以啊。。。你可以做完之后直接返回return嘛。。不需要return systintr,是可以的

#2


直接return是不行的,下次的中断就不会再产生了。
有江沪上面的朋友吗?我带上我的目标板登门讨教,费用面谈。

#3


为什么不会产生是因为你没有interruptdone();你完全可以在你的这个ISR里面去做清状态。。不需要interruptdone。不需要IST

#4


你看看系统定时器中断是怎么处理的就知道了。

#5


谢谢两位的援助。我的理解如下:
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
这两句把2440的中断状态给清除了,但wince好像有中断清理的工作没有做,也就是interruptdone的工作没有做,这个工作具体该如何做?能否进一步明确一下?

系统定时器在将中断标志位清除后调用了OALTimerIntrHandler(),具体干了哪些事情也看不到。

#6


你不是说不要用IST吗?OALTimerIntrHandler不知道你这个timer是做什么用的。要是是做TICK的话,就不能改它的东西。。

至于不能产生中断。完全是因为你没有清除mask位,顺便把中断状态位清掉

#7


if(irq == IRQ_EINT1)   
{
mask = 1 << irq;
SETREG32(&g_pIntrRegs->INTMSK, mask);
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
(*touchtimes)++;
CLRREG32(&g_pIntrRegs->INTMSK, mask);//这里清除mask位,好让下一个中断有效
sysIntr = SYSINTR_NOP;//这里通知系统不做处理,也就是不进入IST。
}
这样的做法是错的,系统初次启动时就会一直停在这里,好像是中断状态位没有清除似的。

#8


OALTimerIntrHandler在time.c里,你看不到?
你可以在interrupthandler里把你要做的事情做完。
1:加一个判断你需要的中断
2:进入你的判断选项后清中断并屏蔽
3:中断处理(一定要简短)
4:把屏蔽的中断打开
这只适合arm和x86架构。mips和sh架构好像没有interrupthandler这个函数。

#9


引用 8 楼 un_chairman 的回复:
OALTimerIntrHandler在time.c里,你看不到?
你可以在interrupthandler里把你要做的事情做完。
1:加一个判断你需要的中断
2:进入你的判断选项后清中断并屏蔽
3:中断处理(一定要简短)
4:把屏蔽的中断打开
这只适合arm和x86架构。mips和sh架构好像没有interrupthandler这个函数。

如你所述,我的程序
if(irq == IRQ_EINT1)   //1:加一个判断你需要的中断

{
mask = 1 << irq;
SETREG32(&g_pIntrRegs->INTMSK, mask); //2:进入你的判断选项后清中断并屏蔽
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
(*touchtimes)++;        //3:中断处理(一定要简短)
CLRREG32(&g_pIntrRegs->INTMSK, mask);//4:把屏蔽的中断打开
sysIntr = SYSINTR_NOP;//这里通知系统不做处理,也就是不进入IST。
}

比较的困惑,我的QQ:153268666

#10


中断请求确认发到

#11


引用 7 楼 qianjun1978 的回复:
if(irq == IRQ_EINT1)   
{
mask = 1 << irq;
SETREG32(&amp;g_pIntrRegs->INTMSK, mask);
OUTREG32(&amp;g_pIntrRegs->SRCPND, mask);
OUTREG32(&amp;g_pIntrRegs->INTPND, mask);
(*touchtimes)++;
CLRRE……



加打印。。贴出信息

#1


你只是想技术吗?可以啊。。。你可以做完之后直接返回return嘛。。不需要return systintr,是可以的

#2


直接return是不行的,下次的中断就不会再产生了。
有江沪上面的朋友吗?我带上我的目标板登门讨教,费用面谈。

#3


为什么不会产生是因为你没有interruptdone();你完全可以在你的这个ISR里面去做清状态。。不需要interruptdone。不需要IST

#4


你看看系统定时器中断是怎么处理的就知道了。

#5


谢谢两位的援助。我的理解如下:
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
这两句把2440的中断状态给清除了,但wince好像有中断清理的工作没有做,也就是interruptdone的工作没有做,这个工作具体该如何做?能否进一步明确一下?

系统定时器在将中断标志位清除后调用了OALTimerIntrHandler(),具体干了哪些事情也看不到。

#6


你不是说不要用IST吗?OALTimerIntrHandler不知道你这个timer是做什么用的。要是是做TICK的话,就不能改它的东西。。

至于不能产生中断。完全是因为你没有清除mask位,顺便把中断状态位清掉

#7


if(irq == IRQ_EINT1)   
{
mask = 1 << irq;
SETREG32(&g_pIntrRegs->INTMSK, mask);
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
(*touchtimes)++;
CLRREG32(&g_pIntrRegs->INTMSK, mask);//这里清除mask位,好让下一个中断有效
sysIntr = SYSINTR_NOP;//这里通知系统不做处理,也就是不进入IST。
}
这样的做法是错的,系统初次启动时就会一直停在这里,好像是中断状态位没有清除似的。

#8


OALTimerIntrHandler在time.c里,你看不到?
你可以在interrupthandler里把你要做的事情做完。
1:加一个判断你需要的中断
2:进入你的判断选项后清中断并屏蔽
3:中断处理(一定要简短)
4:把屏蔽的中断打开
这只适合arm和x86架构。mips和sh架构好像没有interrupthandler这个函数。

#9


引用 8 楼 un_chairman 的回复:
OALTimerIntrHandler在time.c里,你看不到?
你可以在interrupthandler里把你要做的事情做完。
1:加一个判断你需要的中断
2:进入你的判断选项后清中断并屏蔽
3:中断处理(一定要简短)
4:把屏蔽的中断打开
这只适合arm和x86架构。mips和sh架构好像没有interrupthandler这个函数。

如你所述,我的程序
if(irq == IRQ_EINT1)   //1:加一个判断你需要的中断

{
mask = 1 << irq;
SETREG32(&g_pIntrRegs->INTMSK, mask); //2:进入你的判断选项后清中断并屏蔽
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
(*touchtimes)++;        //3:中断处理(一定要简短)
CLRREG32(&g_pIntrRegs->INTMSK, mask);//4:把屏蔽的中断打开
sysIntr = SYSINTR_NOP;//这里通知系统不做处理,也就是不进入IST。
}

比较的困惑,我的QQ:153268666

#10


中断请求确认发到

#11


引用 7 楼 qianjun1978 的回复:
if(irq == IRQ_EINT1)   
{
mask = 1 << irq;
SETREG32(&amp;g_pIntrRegs->INTMSK, mask);
OUTREG32(&amp;g_pIntrRegs->SRCPND, mask);
OUTREG32(&amp;g_pIntrRegs->INTPND, mask);
(*touchtimes)++;
CLRRE……



加打印。。贴出信息