打印
[ZLG-ARM]

ucos的IRQ问题

[复制链接]
1899|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wubren|  楼主 | 2007-8-31 17:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ucos, TI, ic, IO, vi
我使用了外部中断1,程序如下
     Exint1_Handler      HANDLER      Exint1_Exception
     EXTMODE=0X02;         
    
    
    VICVectAddr2=(uint32)Exint1_Handler;
    VICVectCntl2=(0x02|0x0f);
    VICIntEnable=0x00008000;

void Exint1_Exception()
{
     int i;
     OS_ENTER_CRITICAL();
     
     //IO0CLR=0x00000080;
     //while(1);
     EXTINT=0x02;
     VICVectAddr=0;
     OS_EXIT_CRITICAL();
     i++;
     IO0CLR=0x00000080;
}

为什么每次外部有中断时都是跳到
        void IRQ_Exception(void)
{
    while(1);                   // 这一句替换为自己的代码
}



我用的是周功2200的板子,
哪位好心的大哥帮一下忙呀,
先谢谢了

相关帖子

沙发
lpf336| | 2007-8-31 19:50 | 只看该作者

使用特权

评论回复
板凳
wubren|  楼主 | 2007-8-31 20:34 | 只看该作者

ucos的IRQ问题


楼上lpf336,这是什么意思呀?
$IRQ_Label HANDLER $IRQ_Exception_Function

使用特权

评论回复
地板
Ice_River| | 2007-9-1 15:22 | 只看该作者

就是说你的跳转标号定义不对!

使用特权

评论回复
5
zlgARM| | 2007-9-1 15:42 | 只看该作者

wubren

您好!

  在uc/os-II使用ISR和前后台系统里使用ISR有所不同,uc/os-II使用ISR的步骤如下所示:
  1、 在IRQ.S添加中断句柄;
  例:
    Exint1_Handler      HANDLER      Exint1_Exception
  2、 在target.C文件配置向量中断控制器和初始化中断源:
  例:
    VICVectAddr2 = (uint32)Exint1_Handler;
      VICVectCntl2 = (0x20 | 0x0f);

      VICIntEnable = 0x00008000;
  3、 编写中断服务程序,如:void Exint1_Exception(void)……

  现在回到您所提的问题。您对向量控制寄存器(VICVectCntl)的初始化有错:
    VICVectCntl2=(0x02|0x0f);
而正确的设置是:    
    VICVectCntl2=(0x20|0x0f);
  您的初始化程序使得向量IRQ没有使能,系统把外部中断1中断请求默认为非向量IRQ,而非向量IRQ的ISR正是IRQ_Exception。所以运行程序时,每次有外部中断时就进入IRQ_Exception函数了。

使用特权

评论回复
6
wubren|  楼主 | 2007-9-1 22:05 | 只看该作者

回复主题:ucos的IRQ问题

谢谢周功悉心指点,确实是VICVectCntl2=(0x20|0x0f);这里错了,
改正后可以运行了,
但是有时产生是断后会指令预取失败.一般什么情况下会有这样的问题出现?

使用特权

评论回复
7
wubren|  楼主 | 2007-9-2 12:42 | 只看该作者

回复主题:ucos的IRQ问题

我的中断程序如下:

void Eint2_Exception(void)
{
    
    IO0CLR=outenable;
    OS_ENTER_CRITICAL();
    VICIntEnClr=(1 <<4)|(1<<16);
    VICVectAddr=0;
    EXTINT=0X04;
    
    *Msg=WAN_ADDR;
    
    OS_EXIT_CRITICAL();
    OSQPost(WANMsgQ,(void*)Msg);
    VICIntEnable = (1 <<4)|(1<<16);
}

每次中断返回时都会指令预取失败,不知道是什么原因.
帮我看一下可以吗?

使用特权

评论回复
8
lammy| | 2007-9-3 10:16 | 只看该作者

可能是*Msg它是一个空指针

可能是因为*Msg它是一个空指针。建议你用编译器跟踪它在什么地方发生了预取指中断。然后分析之。

使用特权

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

本版积分规则

2

主题

6

帖子

1

粉丝