论坛» 嵌入式开发» MCU

关于非屏蔽中断的问题

菜鸟
2008-09-16 15:32 1楼
最近,在用按键中断,经常会出现程序停到反汇编的"BRK"或"UND"处,无法运行.
"BRK"或"UND"是非屏蔽中断,程序无法设置.是什么原因会出现这样的问题呢?请高手指点一下,谢谢!
菜鸟
2008-09-16 17:10 2楼
楼主能不能把您的程序发上来?
助工
2008-09-16 17:54 3楼

估计是程序跑飞了

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

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

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 6楼

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


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

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

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

共8条 1/1 1 跳转至

回复

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