打印

中断服务函数问题(内有少量代码)

[复制链接]
2417|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duthongbin|  楼主 | 2012-6-6 09:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ARM 型号:S3C2410A
Flash型号:AM29LV320DB
调试工具:H-JTAG
/*********************************************************************************************************
代码如下:

#include  "config.h"
// 串口接收字符临时变量
uint8 g_getch = 0;
uint8 rcount=0;
uint8 flag=0;
uint8 item=0;
/*********************************************************************************************************
** Function name: DelayNS
** Descriptions: 长软件延时。
**              延时时间与系统时钟有关。
** Input: dly 延时参数,值越大,延时越久
** Output: 无
********************************************************************************************************/
void  DelayNS(uint32  dly)
{  
uint32  i;
    for(; dly>0; dly--)
       for(i=0; i<50000; i++);
}
/*********************************************************************************************************
** Function name: IRQ_Uart0
** Descriptions: Uart0中断服务程序。     
** Input: 无
** Output: 无
********************************************************************************************************/
void __irq UART0_Interrupt(void)
{
uint8 temp;
if(rUTRSTAT0 & 0x1)
{
temp=UART_GetKey();
switch(flag)
{
case 0:
if(temp==0xaa)
{
  flag=1;
  rcount=1;
}
break;
case 1:
if(temp==0xbb)    //receive:aa bb cc---------------------"握手"---------------------sendback:0xaa bb cc
{
  flag=2;
  rcount=2;
}
else
{
  flag=0;
  rcount=0;
}
break;
case 2:
  if(temp==0xcc)
  {
     rcount=0;
     flag=0;
UART_SendByte(0xaa);
     UART_SendByte(0xbb);
     UART_SendByte(0xcc);                                                
   }
break;
default :
break;
}
rSRCPND|=(1<<28);//清中断源挂起
rINTPND|=(1<<28);//清中断挂起
rSUBSRCPND|=(1<<0);//清子中断源挂起
}
}
/*********************************************************************************************************
** Function name: main
** Descriptions: 主函数,程序入口。            
** Input: 无
** Output: 系统返回值0
********************************************************************************************************/
int  main(void)
{
    int  i;
     
    UART_Select(0);     // 选择UART0
    UART_Init();        // 初始化UART0
   VICVectAddr[28]=(uint32)UART0_Interrupt;//终端服务函数入口地址
  
  
    rSRCPND|=(1<<28);//清中断源挂起
    rINTPND|=(1<<28);//清中断挂起
    rSUBSRCPND|=(1<<0);//清子中断源挂起  
    rPRIORITY = 0x00000000;     // 使用默认的固定的优先级
    rINTMOD &= 0x00000000;     // 所有中断均为IRQ中断
   
    rINTMSK &= (0<<28);   // 开总中断屏蔽   
    rINTSUBMSK &= ~((1<<1)|(1<<0));// 开子中断屏蔽
   
IRQEnable(); // 使能IRQ中断 (清零CPSR寄存器的I位)   
   
    for(i=0; i<5; i++)//串口输出5次"Hello World!"
    {
      UART_SendStr("Hello World!\n");
    }
   
    while(1);  // 等待串口中断
    return(0);
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/
调试出现的问题如下:
第一种情况:开始DEBUG,F5直接到main函数开始处,单步运行(F10)到 IRQEnable() 处时,直接跳回main函数开始处;
第二种情况:开始DEBUG,F5直接到main函数开始处,然后把main函数开始处的断点取消,单步运行(F10)到 IRQEnable() 处时,程序跑飞;
第三种情况:直接注掉 IRQEnable(),F5直接到main函数开始,单步运行(F10)到 while(1) 处,串口输出5次"Hello World!",但进入不了中断函数,即PC发送"AA BB CC",没有得到回发(串口发送接收已经调试,硬件没有问题)。

部分子函数:
IRQEnable
        ; 开IRQ中断
        MRS     R0, SPSR
        BIC     R0, R0, #I_BIT
        MSR     SPSR_c, R0
        MOVS    PC, LR
/********************************
void __irq  IRQ_Exception(void)
{
void    (*__Handler)(void);
int     irq_no;
uint32  bak;  

// 找出当前中断号
bak = rINTPND;    // 读取INTPND的值
for(irq_no=0; irq_no<32; irq_no++)
{
     bak = bak>>1;
  if(bak == 0) break;
}

// 取得中断服务程序地址并执行
__Handler = (void (*)(void)) VICVectAddr[irq_no];
__Handler();
}
********************************************************************************************************/
各位大侠有没有遇到过类似的情况,请指教~~~

相关帖子

沙发
mindshare| | 2012-6-6 09:35 | 只看该作者
重点分析,enable IRQ后是不是还有其他中断进来,而这个中断服务函数又是 "野地址"

使用特权

评论回复
板凳
duthongbin|  楼主 | 2012-6-6 12:51 | 只看该作者
怎么判断是不是这种情况呢?别的中断应该都是屏蔽状态啊。 2# mindshare

使用特权

评论回复
地板
duthongbin|  楼主 | 2012-6-6 13:57 | 只看该作者
考虑到可能寄存器初始化的问题,我将main修改了一下:
rSRCPND=(rSRCPND&(~0xffffffff))|(1<<28);
//
清中断源挂起

rINTPND=(rINTPND&(~0xffffffff))|(1<<28);
//
清中断挂起

rSUBSRCPND=(rSUBSRCPND&(~0xffffffff))|(1<<0);
//
清子中断源挂起


rPRIORITY&= 0x00000000;


//
使用默认的固定的优先级

rINTMOD&= 0x00000000;


//
所有中断均为IRQ中断

   
rINTMSK=(rINTMSK|0xffffffff)&(0<<28);
//
开总中断屏蔽   
rINTSUBMSK=0x7ff;

rINTSUBMSK&=~((1<<1)|(1<<0));
//
开子中断屏蔽


按照第二种情况调试,同样程序还是跑飞,但貌似能回到main函数的开始处......不解~~

2# mindshare

使用特权

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

本版积分规则

0

主题

33

帖子

1

粉丝