例如一个外部中断,在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(),具体干了哪些事情也看不到。
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
这两句把2440的中断状态给清除了,但wince好像有中断清理的工作没有做,也就是interruptdone的工作没有做,这个工作具体该如何做?能否进一步明确一下?
系统定时器在将中断标志位清除后调用了OALTimerIntrHandler(),具体干了哪些事情也看不到。
#6
你不是说不要用IST吗?OALTimerIntrHandler不知道你这个timer是做什么用的。要是是做TICK的话,就不能改它的东西。。
至于不能产生中断。完全是因为你没有清除mask位,顺便把中断状态位清掉
至于不能产生中断。完全是因为你没有清除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。
}
这样的做法是错的,系统初次启动时就会一直停在这里,好像是中断状态位没有清除似的。
{
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这个函数。
你可以在interrupthandler里把你要做的事情做完。
1:加一个判断你需要的中断
2:进入你的判断选项后清中断并屏蔽
3:中断处理(一定要简短)
4:把屏蔽的中断打开
这只适合arm和x86架构。mips和sh架构好像没有interrupthandler这个函数。
#9
如你所述,我的程序
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
加打印。。贴出信息
#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(),具体干了哪些事情也看不到。
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
这两句把2440的中断状态给清除了,但wince好像有中断清理的工作没有做,也就是interruptdone的工作没有做,这个工作具体该如何做?能否进一步明确一下?
系统定时器在将中断标志位清除后调用了OALTimerIntrHandler(),具体干了哪些事情也看不到。
#6
你不是说不要用IST吗?OALTimerIntrHandler不知道你这个timer是做什么用的。要是是做TICK的话,就不能改它的东西。。
至于不能产生中断。完全是因为你没有清除mask位,顺便把中断状态位清掉
至于不能产生中断。完全是因为你没有清除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。
}
这样的做法是错的,系统初次启动时就会一直停在这里,好像是中断状态位没有清除似的。
{
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这个函数。
你可以在interrupthandler里把你要做的事情做完。
1:加一个判断你需要的中断
2:进入你的判断选项后清中断并屏蔽
3:中断处理(一定要简短)
4:把屏蔽的中断打开
这只适合arm和x86架构。mips和sh架构好像没有interrupthandler这个函数。
#9
如你所述,我的程序
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
加打印。。贴出信息