这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ucos,RESET,int0 为什么我的ucos老是跳到RESET B _c_

共2条 1/1 1 跳转至

ucos,RESET,int0 为什么我的ucos老是跳到RESET B _c_int0

院士
2006-09-17 18:14:16     打赏
ucos,RESET,int0 为什么我的ucos老是跳到RESET B _c_int0



关键词: RESET     为什么     我的     老是     跳到    

院士
2006-12-22 22:43:00     打赏
2楼
问 我在2407a上移植了ucos,经调试可以运行了,建了两个任务,但循环两次后经过任务调度后就跳到RESET B _c_int0这里了,分析不出原因;下面是我的源码:
void HardwareInit(void)
{
  asm(" setc INTM");
  asm(" clrc CNF");
  asm(" clrc SXM");
  asm(" clrc OVM");
  *IFR=0X0FFFF;
  *IMR=0X0002;            //27                 
  *SCSR1=0X02FE;
  *EVAIMRA=0;
  *EVAIFRA=0xffff;
  KickDog();
}

void T1_Init(void)
{
  *EVAIMRA=*EVAIMRA|0x0080;
  *EVAIFRA=*EVAIFRA|0x0080;
  *T1CON=0x1506;   //x/32,             
  *T1PR=12500;      //10ms  12500
  *T1CNT=0x0000;
}
void main(void)
{  

    HardwareInit();
    T1_Init();
    OSInit();
    OSTaskCreate(TaskStart, (void *)0, (void *)&TaskStartStk[0], TaskStartPri);
    OSStart();
}
void TaskStart(void *pdata)              //  任务初始化
{
    INT32U i;
    OSTaskCreate(TestTask0, (void *)0, &TestTask0Stk[0], TestTask0Pri);
    OSTaskCreate(TestTask1, (void *)0, &TestTask1Stk[0], TestTask1Pri);
    T1_Start();
    Enable_Int();
    /* Delete itself */
    OSTaskDel(OS_PRIO_SELF);
}

void TestTask0(void *pdata)
{
    INT16U b;
    pdata=pdata;
    while(1) {
        for(b=0;b<50000;b++) ;
        OSTimeDly(50);
    }
}

void TestTask1(void *pdata)
{
    INT32U b;
    pdata=pdata;
    while(1) {
        for(b=0;b<50000;b++)
          b=b;
        OSTimeDly(50);
    }
}
1: 重启了WATCHDOG关了吗? 2: !关了,在HardwareInit()中关了,如下:

void KickDog(void)
{
  *WDKEY=0X00AA;
  *WDKEY=0X00AA;
  *WDKEY=0X0055;
  *WDKEY=0X0055;
  *WDKEY=0X00AA;
  *WDKEY=0X00AA;
  *WDCR=0X6f;
  return;
}     

我的任务调度函数如下:

_OSCtxSw:
    CALL    I$$SAVE
    LDPK     _OSTCBCur        ; OSTCBCur->OSTCBStkPtr = SP;
    LAR     AR3, _OSTCBCur    ;
    MAR        *, AR3
    SAR        AR1, * , AR1
    
_OSIntCtxSw:
    CALL    _OSTaskSwHook
    LDPK    _OSTCBHighRdy    
    BLDD    _OSTCBHighRdy,#_OSTCBCur
    LDPK    _OSPrioHighRdy    
    BLDD    _OSPrioHighRdy,#_OSPrioCur
    LDPK     _OSTCBHighRdy
    LAR        AR3, _OSTCBHighRdy    
    ;LDPK     _OSTCBCur
    ;LAR        AR3, _OSTCBCur
    MAR        *, AR3
    LAR        AR1, *
    
    MAR        *, AR1
    B        I$$REST

好像不错啊,我对照了好几个版本的ucos,都一样,
我跟踪汇编,在经过OSTickISR()后再进行_OSCtxSw()就会跳到
RESET B _c_int0,是在I$$REST中的PSHD    *- 将0x0000压到了TOS中,所以RET后就到RESET B _c_int0,说明还是任务保存和任务提取有问题,可跟踪了好几天还是找不到在哪出错! 3: 有两个地方可能有问题1。void KickDog(void)
{
  *WDKEY=0X00AA;
  *WDKEY=0X00AA;
  *WDKEY=0X0055;
  *WDKEY=0X0055;
  *WDKEY=0X00AA;
  *WDKEY=0X00AA;
  *WDCR=0X6f;
  return;
}     
在0X0055后是不允许*WDKEY=0X00AA;的否则复位
2。SCSR2的第六位是否为1,否则不能软件观看门狗

如果你不确定可以看看WDCNTR在设断点执行是否变化。
如果不变就有可能是其他的原因

4: !不是这两个问题,是ucos运行时,要是不进中断没事,一进中断后就出问题了,还是ucos的问题,我搞不清到底哪出了问题,但用c编程的都应该会有这问题,不知高手都怎么解决?

共2条 1/1 1 跳转至

回复

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