原创 如何拦截向量中断

2007-1-30 07:38 5470 6 6 分类: MCU/ 嵌入式

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的信任.

可能我说得不太明白或过于谨慎,但此法肯定能执行正确的中断(只要在向量中断被引发后).

若实际应该中断,但中断根本未被引发,那菜农也无力回天~~~




200713072624498.jpg

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条