[ZLG-ARM] 一个向量中断的疑惑

[复制链接]
2869|11
 楼主| smallbear 发表于 2007-4-5 08:16 | 显示全部楼层 |阅读模式
周工及各位前辈,我在使用arm2100实验板做向量中断实验是,出现了下面的一个症状,如果将主程序的while(1);这句里面加一条别的语句,例如while(1){IO0SET=0x03c00000;};结果就不能跳转到相应的中断处理程序,请众位帮忙。具体的程序如下:<br /><br />#include&nbsp;&nbsp;&quot;config.h&quot;<br />&nbsp;&nbsp;<br /><br />#define&nbsp;&nbsp;&nbsp;LED1CON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&lt22)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />#define&nbsp;&nbsp;&nbsp;LED4CON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&lt25)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />void&nbsp;&nbsp;&nbsp;__irq&nbsp;IRQ_Eint0(void)<br />{&nbsp;&nbsp;uint32&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;IO0SET;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;if(&nbsp;(i&LED1CON)==0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;IO0SET&nbsp;=&nbsp;LED1CON;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;IO0CLR&nbsp;=&nbsp;LED1CON;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br /><br />void&nbsp;&nbsp;&nbsp;__irq&nbsp;IRQ_Eint3(void)<br />{&nbsp;&nbsp;uint32&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;IO0SET;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;if(&nbsp;(i&LED4CON)==0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;IO0SET&nbsp;=&nbsp;LED4CON;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;IO0CLR&nbsp;=&nbsp;LED4CON;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x08;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />/<br /><br />int&nbsp;&nbsp;main(void)<br />{&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;PINSEL1&nbsp;=&nbsp;0x00000301;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;IO0DIR&nbsp;=&nbsp;LED1CON|LED4CON|0x03c00000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;EXTMODE&nbsp;=&nbsp;0x0F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;EXTPOLAR&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;0x20|14;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(int)IRQ_Eint0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICVectCntl1&nbsp;=&nbsp;0x20|17;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICVectAddr1&nbsp;=&nbsp;(int)IRQ_Eint3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x09;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;(1&lt&lt14)|(1&lt&lt17);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;&nbsp;{IO0CLR=0x03c00000;};&nbsp;&nbsp;&nbsp;&nbsp;//问题就出在这里&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;return(0);<br />}
microlab 发表于 2007-4-5 18:20 | 显示全部楼层

smallbear

&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;&nbsp;{IO0CLR=0x03c00000;};&nbsp;&nbsp;&nbsp;&nbsp;//问题就出在这里&nbsp;<br />能编译通过??这个有语法错误吧,好像多了一个分号地说...<br /><br />/////////////////////////////////////////////////////////////<br />改为这样试试:<br /><br />&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;IO0CLR=0x03c00000;&nbsp;&nbsp;&nbsp;&nbsp;//问题就出在这里&nbsp;<br /><br />或者<br />&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;{IO0CLR=0x03c00000;}&nbsp;&nbsp;&nbsp;&nbsp;//问题就出在这里&nbsp;<br /><br />或者<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{IO0CLR=0x03c00000;}&nbsp;&nbsp;&nbsp;&nbsp;//问题就出在这里&nbsp;<br /><br />或者<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;IO0CLR=0x03c00000;&nbsp;&nbsp;&nbsp;&nbsp;//问题就出在这里&nbsp;
 楼主| smallbear 发表于 2007-4-5 19:57 | 显示全部楼层

是我发帖子的时候不小心

我不小心弄错了,&nbsp;我使用的是&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{IO0CLR=0x03c00000;},如果将后一行注释掉,在while(1)后面加上分号,则一切正常,这也是实验教程上的样子,恳请各位指点
zlgARM 发表于 2007-4-5 21:03 | 显示全部楼层

smallbear

&nbsp;&nbsp;&nbsp;&nbsp;进入中断,需要一些条件的。LZ不妨把它当成功课,先自己整理归纳出需要哪些条件,然后再把您说的语句加进去运行,再逐一检查这些条件是否被破坏。这也不过是个体力活罢了,耐心点即可。
luhuaren 发表于 2007-4-5 21:04 | 显示全部楼层

RE

我不小心弄错了,&nbsp;我使用的是&nbsp;<br />while(1)<br />{<br />&nbsp;&nbsp;&nbsp;IO0CLR=0x03c00000;<br />}<br />不知道你为什么要把P0的几个口总拉低。。。。要清清一次也就够了。。&nbsp;<br />
 楼主| smallbear 发表于 2007-4-5 21:16 | 显示全部楼层

其实我并非是要把它拉低

我是两天前写了一个程序,是想让主程序控制发光二极管间歇闪亮,外部中断可以停止或从新开始,并顺便计时,可是怎么也无法跳到中断处理程序,在反汇编中查看,各个中断相关的寄存器里面内容也正常,郁闷了好几天,今天突然想起用周工的样板程序实验一下,于是在while中随便写了几句,发现结果都是不能进入中断程序,于是来讨教
microlab 发表于 2007-4-6 08:58 | 显示全部楼层

smallbear

我现在使用的就是EasyARM2200,不知道你是否方便把你有问题的工程发给我,我试试看是不是也有同样的问题?<br />zurong@sunnorth.com.cn<br /><br />
 楼主| smallbear 发表于 2007-4-6 12:07 | 显示全部楼层

microlab

我已经把这个工程发送到了你的邮箱,感谢你,如果您有了答案,请不要保留,再次感谢!
liujigan 发表于 2007-4-6 12:47 | 显示全部楼层

改个值,如IO0CLR=0x01800000;试下

改个值,如IO0CLR=0x01800000;试一下
microlab 发表于 2007-4-6 14:00 | 显示全部楼层

smallbear

我已经在我开发板上试过了<br />使用源文件或者使用你注释掉的那3句都可以正常进中断啊<br /><br /><br /><br /><br />
 楼主| smallbear 发表于 2007-4-6 18:58 | 显示全部楼层

RE microlab

&nbsp;//&nbsp;IO0CLR=0x03c00000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//&nbsp;while(1);<br />&nbsp;&nbsp;&nbsp;while(1);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//{IO0CLR=0x03c00000;}<br />这是我给你发的相关代码,如果把它变成<br />&nbsp;IO0CLR=0x03c00000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;&nbsp;//while(1);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;{IO0CLR=0x03c00000;}<br />这样肯定是能进入中断的,我说的情况是变成<br />&nbsp;//&nbsp;IO0CLR=0x03c00000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//&nbsp;while(1);<br />&nbsp;&nbsp;&nbsp;while(1)&nbsp;<br />&nbsp;&nbsp;&nbsp;{IO0CLR=0x03c00000;}<br />只要是在while循环中做些工作,程序就不能正确进入中断
 楼主| smallbear 发表于 2007-4-6 19:18 | 显示全部楼层

一叶障目

原来是能进入中断程序,只不过是在中断执行的太快,我没有加延时,真的是愚蠢啊,谢谢microlab和liujigan的热情帮助,太感激你们了,我的思维不够缜密,再次感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

20

帖子

0

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