[ZLG-ARM] 高手们,救救小弟吧!关于LPC2132中断问题

[复制链接]
3303|9
 楼主| zzzpf 发表于 2007-6-13 16:16 | 显示全部楼层 |阅读模式
小弟根据ZLG的程序,自己改写了一个中断程序,现在遇到的问题是定义的全局变量串不到主程序中,请看程序:<br />#include&nbsp;&quot;config.h&quot;<br />//static&nbsp;uint32&nbsp;i;<br />uint32&nbsp;i;<br />uint32&nbsp;y;<br />uint32&nbsp;z;<br /><br />void&nbsp;__irq&nbsp;IRQ_Eint0(void)&nbsp;&nbsp;//外部中断EINT0服务函数<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=i+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i&gt8)i=0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//IO1CLR=(1&lt&lt(17+i));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/////////////////////高手们,请注意这句**********************<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(EXTINT&0x01)!=0&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;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x01;&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;清除EINT0中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00000000;&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;通知VIC向量中断结束<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;__irq&nbsp;IRQ_Eint3()&nbsp;&nbsp;//外部中断EINT3服务函数<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO1SET=0xFF&lt&lt18;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(EXTINT&0x08)!=0&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;&nbsp;&nbsp;&nbsp;&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;&nbsp;//&nbsp;清除EINT3中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00000000;&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;通知VIC向量中断结束<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />int&nbsp;main&nbsp;(void)<br />{//&nbsp;add&nbsp;user&nbsp;source&nbsp;code<br /><br />&nbsp;PINSEL2=PINSEL2&nbsp;&&nbsp;(~0x08);&nbsp;//P1[25:16]连接GPIO<br />&nbsp;PINSEL1=0X00000301;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置管脚连接
liujigan 发表于 2007-6-13 21:06 | 显示全部楼层

这句最好放到中断中执行

中断中更新i,而main()中对i进行操作,ARM有预取指令的快速特点,指令取来了,这时中断来了i=i+1;中断退出进入main()中把预取的指令执行,i还是原来的i,执行完IO1CLR=(1&lt&lt(17+i)),i没有发生改变。<br />  如非要在main()中进行加入一些delay可能要好些。延时越长,成功机率越大。<br />   个人意见,供参考。<br />
 楼主| zzzpf 发表于 2007-6-14 09:27 | 显示全部楼层

还是不行!不过,非常感谢liujigan的指导

liujigan兄,谢谢您的关注和指点!<br />&nbsp;&nbsp;&nbsp;1、如果把这句话放到中断中执行的话,好象中断程序就只能作为一个过程了,我们希望中断程序能向主程序传递数据,不知道这个问题您有什么好的想法没?<br />&nbsp;&nbsp;&nbsp;2、给main()中加入delay的方法我试过了,也还是不行。我是这样加的:z++;&nbsp;if(z&gt50000){z=0;IO1CLR=(1&lt&lt(17+i));},不知道这样做合适吗?
liujigan 发表于 2007-6-14 09:40 | 显示全部楼层

aa

main()<br />{<br />&nbsp;&nbsp;uint16&nbsp;z;<br /><br />&nbsp;&nbsp;IO1CLR=(1&lt&lt(17+i));&nbsp;<br />&nbsp;&nbsp;for(z=0;z&lt50000;z++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;<br />}<br />///////试一下&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 楼主| zzzpf 发表于 2007-6-14 11:05 | 显示全部楼层

还是不行

liujigan兄,加上延时结果也不对。<br />刚才试了,有这现象:如果把“IRQEnable();&nbsp;//使能IRQ中断”这句加到主程序的while语句中,结果就对了,即while(1)&nbsp;<br />{<br />IRQEnable();&nbsp;//使能IRQ中断<br />IO1CLR=(1&lt&lt(17+i));<br />}<br /><br />它就能行,疑惑中……<br /><br />liujigan兄,会不会有其他原因呢?小弟刚开始做,会不会有其他问题没考虑到。再次感谢liujigan兄的关注
liujigan 发表于 2007-6-14 14:24 | 显示全部楼层

是不是EINT3影响的?

当i=0时,IO1CLR=1<<17;和外部中断3脚冲突了吧,从IO1CLR=(1&lt&lt(18+i));开始吧,要不先取掉EINT3试试。&nbsp;
xiao李 发表于 2007-6-14 20:26 | 显示全部楼层

re

使用的全局变量有被编译器优化过,在定义i时使用volatile&nbsp;关键字限定一下就可了!
 楼主| zzzpf 发表于 2007-6-14 21:18 | 显示全部楼层

崩溃了要!

也不是和外部中断3脚冲突,试过了,从IO1CLR=(1&lt&lt(18+i));开始也不行。liujigan兄,是不是传递全局变量有什么规则没注意?
armecos 发表于 2007-6-15 09:43 | 显示全部楼层

程序可能还有潜在问题,

&nbsp;&nbsp;&nbsp;&nbsp;尽管结果正确。全局变量i在中断和主程序里都使用了,是临界资源,使用时要加保护,如信号量,开关中断等。可以进一步把程序反汇编,看看改动前和改动后(加了volatile)的代码有什么不同,特别是对i的操作,不要就此停止,这样能乘胜追击学更多东西。对于中断的调试可能你还没有掌握。另外,中断程序结构这样写太乱,有更简单通用的写法。www.armecos.com的《ecos增值包》里有这方面的内容。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

30

帖子

1

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