这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于非屏蔽中断的问题

共8条 1/1 1 跳转至

关于非屏蔽中断的问题

菜鸟
2008-09-16 15:32:44     打赏
最近,在用按键中断,经常会出现程序停到反汇编的"BRK"或"UND"处,无法运行.
"BRK"或"UND"是非屏蔽中断,程序无法设置.是什么原因会出现这样的问题呢?请高手指点一下,谢谢!



关键词: 关于     屏蔽     中断     问题    

菜鸟
2008-09-16 17:10:59     打赏
2楼
楼主能不能把您的程序发上来?

助工
2008-09-16 17:54:39     打赏
3楼

估计是程序跑飞了


菜鸟
2008-09-16 18:07:13     打赏
4楼
中断向量没有设对吧,程序传上来看看

菜鸟
2008-09-17 09:23:52     打赏
5楼

程序不方便上传,我大概描述一下吧.按键中断服务程序在论坛曾经发过,如下:
#include <sfr62p.h>

void ki_init (void);
#pragma INTERRUPT ki_ISR
void ki_ISR(void);

unsigned int F1Flag;
unsigned int F2Flag;
unsigned int F3Flag;
unsigned int F4Flag;
unsigned int F5Flag;
unsigned int F6Flag;
unsigned int F7Flag;
unsigned int F8Flag;
unsigned int F9Flag;
unsigned int F0Flag;
unsigned int FAFlag;
unsigned int FBFlag;
unsigned int FCFlag;
unsigned int FDFlag;
unsigned int FEFlag;
unsigned int FFFlag;

void main(void)
{
 ki_init();
 p1=0xff;
 p2=0xff;
 while (1)
  {
    if(F1Flag ==1){p1=0xff;F1Flag=0;}//控制LED显示,现在的程序是所有标志位都清零
    if(F2Flag ==1){p2=0xff;F2Flag=0;}
    if(F3Flag ==1){p1=0x00;F3Flag=0;}
    if(F4Flag ==1){p2=0x00;F4Flag=0;}
 if(F5Flag ==1){p1=0xff;F5Flag=0;}
 if(F6Flag ==1){p2=0xff;F6Flag=0;}
 if(F7Flag ==1){p1=0x00;F7Flag=0;}
 if(F8Flag ==1){p2=0x00;F8Flag=0;}
 if(F9Flag ==1){p1=0xff;F9Flag=0;}
 if(F0Flag ==1){p2=0xff;F0Flag=0;}
 if(FAFlag ==1){p1=0x00;FAFlag=0;}
 if(FBFlag ==1){p2=0x00;FBFlag=0;}
 if(FCFlag ==1){p1=0xff;FCFlag=0;}
 if(FDFlag ==1){p2=0xff;FDFlag=0;}
 if(FEFlag ==1){p1=0x00;FEFlag=0;}
 if(FFFlag ==1){p2=0x00;FFFlag=0;}
 }
}

void ki_ISR(void)
{
  unsigned int p;
  unsigned char mask1=0,mask2=0,mask=0;
  unsigned int timeout;

  for (p=0;p<0x400;p++);  //按键消除抖动
  mask=0;
  timeout=0;
    while (mask==0x0) {
    timeout++;
    if (timeout>=1000) {    
     break;
  }  
   
    mask1= ~p10 & 0xF0;
    pd10=0xf0;
    pur2=0x10;
 
    mask2= ~p10 & 0x0F;
    mask=mask1|mask2;
    pd10=0x0f;
    pur2=0x20;
    }
   switch (mask){
   case 0x88:F1Flag=1;break;
   case 0x84:F2Flag=1;break;
   case 0x82:F3Flag=1;break;
   case 0x81:F4Flag=1;break;
   case 0x48:F5Flag=1;break;
   case 0x44:F6Flag=1;break;
   case 0x42:F7Flag=1;break;
   case 0x41:F8Flag=1;break;
   case 0x28:F9Flag=1;break;
   case 0x24:F0Flag=1;break;
   case 0x22:FAFlag=1;break;
   case 0x21:FBFlag=1;break;
   case 0x18:FCFlag=1;break;
   case 0x14:FDFlag=1;break;
   case 0x12:FEFlag=1;break;
   case 0x11:FFFlag=1;
   }
   ir_kupic=0;//后增加的。
}
 
void ki_init (void)
{
  pd10= 0x0F;
  pur2=0x20;
  asm(" FCLR I");    
  kupic = 6;       
  asm(" FSET I");  
  F1Flag=0;
  F2Flag=0;
  F3Flag=0;
  F4Flag=0;
  pd1=0xff;
  pd2=0xff;
}

主要是当按F键的时候,从子程序退出返回主程序,这时就会出现程序停止的现象,停在'BRK'或'UND'上.现在的问题是不知道是中断服务程序的问题,还是子程序的问题.
中断向量表更改如下:
;---------------------------------------------------------------------
; variable vector section
;---------------------------------------------------------------------
  .section vector,ROMDATA
  .org  __VECTOR_ADR__

.if 1
  .lword dummy_int  ; vector  0  BRK
  .lword dummy_int  ; vector  1
  .lword dummy_int  ; vector  2
  .lword dummy_int  ; vector  3
  .lword dummy_int  ; vector  4  (for user) int3
  .lword dummy_int  ; vector  5  (for user) timerB5
  .lword dummy_int  ; vector  6  (for user) timerB4
  .lword dummy_int  ; vector  7  (for user) timerB3
  .lword dummy_int  ; vector  8  (for user) si/o4/int5
  .lword dummy_int  ; vector  9  (for user) si/o3/int4
  .lword dummy_int  ; vector 10  (for user) Bus collision detection
  .lword dummy_int  ; vector 11  (for user) DMA0
  .lword dummy_int  ; vector 12  (for user) DMA1
  ;.lword dummy_int  ; vector 13  (for user) Key input interrupt
  .glb    _ki_ISR
  .lword  _ki_ISR
  .lword dummy_int  ; vector 14  (for user) A-D
  .lword dummy_int  ; vector 15  (for user) uart2 transmit
  .lword dummy_int  ; vector 16  (for user) uart2 receive
  .lword dummy_int  ; vector 17  (for user) uart0 transmit
  .lword dummy_int  ; vector 18  (for user) uart0 receive
  .lword dummy_int  ; vector 19  (for user) uart1 transmit


菜鸟
2008-09-17 11:39:18     打赏
6楼

从中断的设定上看,好像没有什么问题。
但我不明白,为什么在中断处理程序里面修改KEY输入终端引脚的值?
    mask1= ~p10 & 0xF0;
    pd10=0xf0;
    pur2=0x10;

 
    mask2= ~p10 & 0x0F;
    mask=mask1|mask2;
    pd10=0x0f;
    pur2=0x20;


菜鸟
2008-09-17 13:20:10     打赏
7楼
为什么在中断处理程序里面修改KEY输入终端引脚的值?
由于使用4*4的按键,需要扫描确定是哪一个键被按下.所以要切换端口10的输入输出方向.如果使用4个按键就不用了.
上午实验了一下,在中断程序中,将寄存器入栈和出栈,发现一个现象,就是有规律的第26次运行到E键的时候,提示程序指令被更改,终止运行,也就是停在'BRK'地方,PC指到了F4002H.

菜鸟
2008-09-19 17:12:19     打赏
8楼

是堆栈溢出了,使得USP和ISP的数据重合,变量被随意改变.即使把堆栈改大,不能彻底解决,程序还得再改.哪位有更好的建议解决这个问题.


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]