打印
[ZLG-ARM]

一个向量中断的疑惑

[复制链接]
1701|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
smallbear|  楼主 | 2007-4-5 08:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
周工及各位前辈,我在使用arm2100实验板做向量中断实验是,出现了下面的一个症状,如果将主程序的while(1);这句里面加一条别的语句,例如while(1){IO0SET=0x03c00000;};结果就不能跳转到相应的中断处理程序,请众位帮忙。具体的程序如下:

#include  "config.h"
  

#define   LED1CON       (1<<22)              
#define   LED4CON       (1<<25)             


void   __irq IRQ_Eint0(void)
{  uint32  i;

   i = IO0SET;                        
 if( (i&LED1CON)==0 )                
   {  IO0SET = LED1CON;
   }
   else
   {  IO0CLR = LED1CON;
   }
   
   EXTINT = 0x01;                
   
   VICVectAddr = 0x00;   
}        




void   __irq IRQ_Eint3(void)
{  uint32  i;

   i = IO0SET;                        

   if( (i&LED4CON)==0 )                
   {  IO0SET = LED4CON;
   }
   else
   {  IO0CLR = LED4CON;
   }
   
   EXTINT = 0x08;                       
   VICVectAddr = 0x00;
}
            

/

int  main(void)
{  PINSEL0 = 0x00000000;            
   PINSEL1 = 0x00000301;            


   IO0DIR = LED1CON|LED4CON|0x03c00000;        


   
   EXTMODE = 0x0F;                    
   EXTPOLAR = 0x00;                    
   
   
   VICIntSelect = 0x00000000;        
   VICVectCntl0 = 0x20|14;            
   VICVectAddr0 = (int)IRQ_Eint0;     
   VICVectCntl1 = 0x20|17;            
   VICVectAddr1 = (int)IRQ_Eint3;     
   EXTINT = 0x09;                        
   
   VICIntEnable = (1<<14)|(1<<17);    
   
   while(1);
   {IO0CLR=0x03c00000;};    //问题就出在这里                    

   return(0);
}

相关帖子

沙发
microlab| | 2007-4-5 18:20 | 只看该作者

smallbear

   while(1);
   {IO0CLR=0x03c00000;};    //问题就出在这里 
能编译通过??这个有语法错误吧,好像多了一个分号地说...

/////////////////////////////////////////////////////////////
改为这样试试:

  while(1);
  IO0CLR=0x03c00000;    //问题就出在这里 

或者
   while(1);
  {IO0CLR=0x03c00000;}    //问题就出在这里 

或者
     while(1)
  {IO0CLR=0x03c00000;}    //问题就出在这里 

或者
     while(1)
  IO0CLR=0x03c00000;    //问题就出在这里 

使用特权

评论回复
板凳
smallbear|  楼主 | 2007-4-5 19:57 | 只看该作者

是我发帖子的时候不小心

我不小心弄错了, 我使用的是 while(1)
                           {IO0CLR=0x03c00000;},如果将后一行注释掉,在while(1)后面加上分号,则一切正常,这也是实验教程上的样子,恳请各位指点

使用特权

评论回复
地板
zlgARM| | 2007-4-5 21:03 | 只看该作者

smallbear

    进入中断,需要一些条件的。LZ不妨把它当成功课,先自己整理归纳出需要哪些条件,然后再把您说的语句加进去运行,再逐一检查这些条件是否被破坏。这也不过是个体力活罢了,耐心点即可。

使用特权

评论回复
5
luhuaren| | 2007-4-5 21:04 | 只看该作者

RE

我不小心弄错了, 我使用的是 
while(1)
{
   IO0CLR=0x03c00000;
}
不知道你为什么要把P0的几个口总拉低。。。。要清清一次也就够了。。 

使用特权

评论回复
6
smallbear|  楼主 | 2007-4-5 21:16 | 只看该作者

其实我并非是要把它拉低

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

使用特权

评论回复
7
microlab| | 2007-4-6 08:58 | 只看该作者

smallbear

我现在使用的就是EasyARM2200,不知道你是否方便把你有问题的工程发给我,我试试看是不是也有同样的问题?
zurong@sunnorth.com.cn

使用特权

评论回复
8
smallbear|  楼主 | 2007-4-6 12:07 | 只看该作者

microlab

我已经把这个工程发送到了你的邮箱,感谢你,如果您有了答案,请不要保留,再次感谢!

使用特权

评论回复
9
liujigan| | 2007-4-6 12:47 | 只看该作者

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

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

使用特权

评论回复
10
microlab| | 2007-4-6 14:00 | 只看该作者

smallbear

我已经在我开发板上试过了
使用源文件或者使用你注释掉的那3句都可以正常进中断啊




使用特权

评论回复
11
smallbear|  楼主 | 2007-4-6 18:58 | 只看该作者

RE microlab

 // IO0CLR=0x03c00000;                    
  // while(1);
   while(1);    
   //{IO0CLR=0x03c00000;}
这是我给你发的相关代码,如果把它变成
 IO0CLR=0x03c00000;                    
   while(1);
   //while(1);    
   {IO0CLR=0x03c00000;}
这样肯定是能进入中断的,我说的情况是变成
 // IO0CLR=0x03c00000;                    
  // while(1);
   while(1) 
   {IO0CLR=0x03c00000;}
只要是在while循环中做些工作,程序就不能正确进入中断

使用特权

评论回复
12
smallbear|  楼主 | 2007-4-6 19:18 | 只看该作者

一叶障目

原来是能进入中断程序,只不过是在中断执行的太快,我没有加延时,真的是愚蠢啊,谢谢microlab和liujigan的热情帮助,太感激你们了,我的思维不够缜密,再次感谢

使用特权

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

本版积分规则

5

主题

20

帖子

0

粉丝