http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=2420121
hotpower 发表于 2007-1-30 07:26 ZLG-ARM ←返回版面 |
39楼: "不稳定"还是不明白,估计你还缺一步拦截 |
"不稳定"???是什么意思???
丢中断???中断号错位???
丢中断有点伪中断的味道,这要从LPCARM的中断机制推起:
当某个中断源被引发,IRQStatus或FIQStatus的某位将置'1', VectAddrs[x]将被装入VectAddr,从而跳入 LDR PC, [PC, #-0x0FF0];Vector from VicVectAddr 在此PC才将VectAddr装入后跳入VectAddr指出的地址,即散转了中断. 假设VectAddrs[x]没被被装入到VectAddr中,且前次中断退出时执行 了VIC->VectAddr = 0x00;/* 通知VIC中断处理结束*/ 那么本次的中断将会执行"软件复位",故中断肯定丢失.
所以我在实战中要避开VectAddrs[0],且以VectAddrs[0]为默认中断地址. 这样就可拦截非法中断了.当然其他不用的VectAddrs[x]我也指向默认中断地址.
假定该论证成立(我用软件仿真确实存在此隐患),那么我的第2个疑问"中断号错位"就自然成立了,因为VectAddrs[0]一般为正常的中断向量地址,如果经常性的 VectAddrs[0]被执行,那么病症肯定在此.
真正可靠的中断应该是类似PIC的单向量中断,即正确的中断应该是IRQStatus对应位上所对应的中断号的地址VectAddrs[x].
只有同时满足了这两个条件的才真正的是此时的中断.
VectAddr只是快速散转后的地址VectAddrs[x].
故可靠的ISR()应该是进入后立即判断IRQStatus对应位是否为'1',是则执行本ISR(),否则执行默认中断进行IRQStatus位比较分枝中断,此时实际是放弃了对 VectAddr的信任.
可能我说得不太明白或过于谨慎,但此法肯定能执行正确的中断(只要在向量中断被引发后).
若实际应该中断,但中断根本未被引发,那菜农也无力回天~~~
|
|
文章评论(0条评论)
登录后参与讨论