清除中断问题
__inline void ClearPending(int bit)
{
register i;
rSRCPND = bit;
rINTPND = bit;
i = rINTPND; //为何要定义i,rINTPND赋给i有什么作用?
}
__inline void ClearSubPending(int bit)
{
register i;
rSUBSRCPND = bit;
i = rINTPND; //为何要定义i,rINTPND赋给i有什么作用?
}
清除子中断时,为什么不清除SRCPND 与INTPND呢??? i = rINTPND;是什么意思??
还有一个问题:在中断子程序中为什么不先屏蔽所有中断呢?
rINTMSK =0xffffffff;
一个最重要的问题:在进入中断子程序之前为什么先要清除中断标志呢??
SRCPND SUBSRCPND 默认就是0x0000000
什么情况下,不需要手动清除中断呢,系统会自动清除呢???
------解决方案--------------------这个不是linux kernel的代码吧。
------解决方案--------------------务必把代码沾全 如果你把代码已经沾全的话
i = rINTPND; 相当于读取了一次rINTPND 寄存器
清中断操作并不具有通用性,每一个IC都有自己的清中断的方法,你得看具体的芯片手册再对照代码看
只从代码看,你这个芯片是写1清零,同时还要读一次保证清中断操作同步到了硬件
清中断操作并不具有通用性,有的ic能自动清,有的ic必须手动清,看具体的芯片手册
还有一个问题:在中断子程序中为什么不先屏蔽所有中断呢?
------------
你的代码看起来不是linux 无法回答
------解决方案--------------------清除子中断时,为什么不清除SRCPND 与INTPND呢???
是清中断子悬挂寄存器,SRCPND和INTPND也要同时清,但是可以同时调用ClearPending(int bit)。
在中断子程序中为什么不先屏蔽所有中断呢?
ARM9中,进入中断后,CPSR中的I比特(或F比特)自动置1,已经禁止其他中断进入(快速中断抢占除外),所以,不需要另外再屏蔽。
在进入中断子程序之前为什么先要清除中断标志呢??
进入中断后,相应的中断标志已经置位。不清除该位,退出中断后,将再重复产生中断,所以必须给对应比特写1清除。
------解决方案--------------------不如先说说你的cpu和os
------解决方案--------------------习惯上,启动时为了避免随机的悬挂中断而清零(上电过程中,防止某些部件不稳定造成的)。
还有一种可能,仿真调试阶段的重新运行时也清零(此时并不一定会复位)。
不光是ARM,51系统也会这样做。
------解决方案--------------------呵呵,你说的就是和x86里面的cli 类似啦,要清中断要清cli (内部),还得清ISR位(外部)(普通中断),外部中断清掉,有几个办法,读PORT,或者直接ISR CLEAR。。。。
我没仔细看你的代码,但是大概猜到你的问题是什么了.......