[ZLG-ARM] 请教为什么外部中断不进ISR而是跳到Undefined异常

[复制链接]
3340|11
 楼主| zh_m 发表于 2007-11-29 10:04 | 显示全部楼层 |阅读模式
使用P0.14脚EINT1功能,从该脚飞出一导线,通过触地产生低脉冲,配置为降沿触发。代码如下:<br />void&nbsp;__irq&nbsp;IRQ_Eint1(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;……<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x02;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0;<br />}<br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;.<br />&nbsp;&nbsp;&nbsp;&nbsp;.<br />&nbsp;&nbsp;&nbsp;&nbsp;.<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;|=&nbsp;0x20000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能EINT1中断<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTMODE&nbsp;=&nbsp;0x02;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置EINT1中断为边沿触发模式<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTPOLAR&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置EINT1中断为降沿触发<br />&nbsp;&nbsp;&nbsp;&nbsp;//打开EINT1中断(设置向量控制器,即使用向量IRQ)<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置所有中断分配为IRQ中断<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;0x2F;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;分配EINT1中断到向量中断0<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(uint32)IRQ_Eint1;&nbsp;//&nbsp;设置中断服务程序地址<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除EINT1中断标志&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;0x00008000;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能EINT1中断<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />}<br /><br />在startup.s中已使能了IRQ中断。当运行到while(1)时若飞线碰一下地,程序并未停在IRQ_Eint1()中的断点,停止AXD的运行会看到EXTINT变为0x02,说明EINT1位由于产生了降沿被置位,但程序却跑到了Undefined&nbsp;B&nbsp;Undefined处而没有进入IRQ_Eint1()。<br />从AXD&nbsp;reload程序重新运行调试,此时EXTINT外部中断1职位标志尚未被清0,当startup.s运行到初始化堆栈时(BL&nbsp;InitStack),系统又会根据所设中断处理程序地址跳转过去执行ISR,然后再从main()开始执行,但问题依然。<br /><br />请教大家这有可能是什么问题啊,感觉main()里对中断的配置应该不会有错,是不是运行环境的初始化有什么工作没做到啊??<br />大家觉得有什么可能都请提出来,我都会试试的,自己尝试着改了一些地方但还是不行,求教了!!!!!
 楼主| zh_m 发表于 2007-11-29 10:35 | 显示全部楼层

未定义指令Undefined

产生中断后没跳到中断处理函数地址,而是跑到数据区了才引发Undefined未定义指令异常???如果这样的话又怎么会跑到数据区了呢
 楼主| zh_m 发表于 2007-11-29 11:21 | 显示全部楼层

还有

通过R14找到进入异常前的位置是0xE0028000,即IO0PIN的地址<br />这个现象能说明什么吗?
极限思考 发表于 2007-11-29 12:48 | 显示全部楼层

检查下电源!

接一个电阻再碰下试试!电源检查下,主要考虑下电源功率。
 楼主| zh_m 发表于 2007-11-29 14:55 | 显示全部楼层

谢谢

感谢楼上,你是说电源功率可能不足吗?该脚是3.3v的,要串多大的电阻试啊??<br /><br />btw,太急了忘了说是lpc2292!<br />
armecos 发表于 2007-11-29 15:26 | 显示全部楼层

调试一下就知道了

已经进入ISR中断了,这点不用怀疑,不过你的中断处理程序可能没设计好,导致多次重入中断,产生Undefined异常。<br />另外查查EINT1是否和其他引脚复用。<br /><br />关于中断操作详见:<br /><b>《ecos中断操作&nbsp;》</b>
 楼主| zh_m 发表于 2007-11-29 16:52 | 显示全部楼层

谢谢

谢谢楼上的回复,你的**我认为很有价值,有闲的时候会认真看看<br /><br />关于你的意见中“导致多次重入中断”,我看到你的**中“EINT写‘1’清除还是必须的,不然还会反复陷入中断”,但我的ISR里已经有了“EXTINT&nbsp;=&nbsp;0x02;”,将EINT1中断标识清除了;<br />另外我又尝试在ISR里第一句屏蔽IRQ中断(设置CPSR的I位),而退出ISR前再使能IRQ中断,我想这样在处理中断时一定不会受到其他中断或多次同一中断的干扰了,但很遗憾仍然是“Undefined”……<br />最后,当然你并不了解我这的具体情况,其实我已经把ISR写成了最最简单的形式,如果进去后便会点亮一个led,并且整个程序没有关闭该led的控制,就是说哪怕进入了一次ISR,那个led也应该亮起来,所以现在我估计真的一次中断处理函数都没执行啊!<br /><br />再次感谢&nbsp;极限思考&nbsp;和&nbsp;armecos&nbsp;的回复<br />我会接个电阻试试的,但总觉得串个电阻和直接接地效果应该一样的……<br /><br />还希望大家能帮着判断一下问题的所在啊!!我也很急,这个问题已经是第四天了……
zlgarm 发表于 2007-11-29 18:36 | 显示全部楼层

re

检查您的模板,看模板是否对中断异常已做过处理,如果做过处理,用户编写中断服务程序就不需要加__irq,否则就会出现不可预知情况!
lyl831015 发表于 2007-11-29 20:01 | 显示全部楼层

勘误表

看一下勘误表,外部中断有BUG。
 楼主| zh_m 发表于 2007-11-29 20:18 | 显示全部楼层

OMG

谢谢zlgarm,加不加__irq都是一样的<br /><br />楼上lyl831015,LPC2292的刊误表哪儿有啊,暂时还未找到啊,请给个下载地址吧,谢谢
 楼主| zh_m 发表于 2007-11-29 20:28 | 显示全部楼层

有些像是bug了

我把smartarm(lpc2292)的VICVect_C例子放在外部ram调试是好的<br />但是下到片内flash进行调试便出现上述异常……<br /><br />有谁也能试一下,这样大约就能有个结论了<br /><br />如果此处真有bug,该如何解决啊??!
 楼主| zh_m 发表于 2007-11-30 11:44 | 显示全部楼层

好了

实在是惭愧<br />MEMMAP没设置啊真晕……设为flash模式就ok了<br />不过通过求解这个问题对多方面都有了进一步理解。<br />谢谢大家了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

25

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部