打印
[ZLG-ARM]

高手们,救救小弟吧!关于LPC2132中断问题

[复制链接]
2044|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zzzpf|  楼主 | 2007-6-13 16:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟根据ZLG的程序,自己改写了一个中断程序,现在遇到的问题是定义的全局变量串不到主程序中,请看程序:
#include "config.h"
//static uint32 i;
uint32 i;
uint32 y;
uint32 z;

void __irq IRQ_Eint0(void)  //外部中断EINT0服务函数
    {
          
     i=i+1;
     if(i>8)i=0;

    //IO1CLR=(1<<(17+i));             /////////////////////高手们,请注意这句**********************
    
       while( (EXTINT&0x01)!=0 )                // 等待外部中断信号恢复为高电平    
       {  EXTINT = 0x01;                        // 清除EINT0中断标志
       }
     
       VICVectAddr = 0x00000000;                        // 通知VIC向量中断结束
    
    }
    
void __irq IRQ_Eint3()  //外部中断EINT3服务函数
    {
     i=0;
     IO1SET=0xFF<<18;
     
       while( (EXTINT&0x08)!=0 )                // 等待外部中断信号恢复为高电平    
       {  EXTINT = 0x08;                        // 清除EINT3中断标志
      }
   
       VICVectAddr = 0x00000000;                        // 通知VIC向量中断结束
    }


    
int main (void)
{// add user source code

 PINSEL2=PINSEL2 & (~0x08); //P1[25:16]连接GPIO
 PINSEL1=0X00000301;        //设置管脚连接

相关帖子

沙发
liujigan| | 2007-6-13 21:06 | 只看该作者

这句最好放到中断中执行

中断中更新i,而main()中对i进行操作,ARM有预取指令的快速特点,指令取来了,这时中断来了i=i+1;中断退出进入main()中把预取的指令执行,i还是原来的i,执行完IO1CLR=(1<<(17+i)),i没有发生改变。
  如非要在main()中进行加入一些delay可能要好些。延时越长,成功机率越大。
   个人意见,供参考。

使用特权

评论回复
板凳
zzzpf|  楼主 | 2007-6-14 09:27 | 只看该作者

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

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

使用特权

评论回复
地板
liujigan| | 2007-6-14 09:40 | 只看该作者

aa

main()
{
  uint16 z;

  IO1CLR=(1<<(17+i)); 
  for(z=0;z<50000;z++)
      ; 
}
///////试一下           

使用特权

评论回复
5
zzzpf|  楼主 | 2007-6-14 11:05 | 只看该作者

还是不行

liujigan兄,加上延时结果也不对。
刚才试了,有这现象:如果把“IRQEnable(); //使能IRQ中断”这句加到主程序的while语句中,结果就对了,即while(1) 
{
IRQEnable(); //使能IRQ中断
IO1CLR=(1<<(17+i));
}

它就能行,疑惑中……

liujigan兄,会不会有其他原因呢?小弟刚开始做,会不会有其他问题没考虑到。再次感谢liujigan兄的关注

使用特权

评论回复
6
liujigan| | 2007-6-14 14:24 | 只看该作者

是不是EINT3影响的?

当i=0时,IO1CLR=1<<17;和外部中断3脚冲突了吧,从IO1CLR=(1<<(18+i));开始吧,要不先取掉EINT3试试。 

使用特权

评论回复
7
xiao李| | 2007-6-14 20:26 | 只看该作者

re

使用的全局变量有被编译器优化过,在定义i时使用volatile 关键字限定一下就可了!

使用特权

评论回复
8
zzzpf|  楼主 | 2007-6-14 21:18 | 只看该作者

崩溃了要!

也不是和外部中断3脚冲突,试过了,从IO1CLR=(1<<(18+i));开始也不行。liujigan兄,是不是传递全局变量有什么规则没注意?

使用特权

评论回复
9
armecos| | 2007-6-15 09:43 | 只看该作者

程序可能还有潜在问题,

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

30

帖子

1

粉丝