打印

求救贴:UCOSII系统的消息队列,程序进入异常

[复制链接]
2887|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
e08610318|  楼主 | 2013-2-22 13:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 e08610318 于 2013-2-22 14:03 编辑

    ARM-CortexM3处理器,使用广州致远的ucosii移植代码。设计使用消息队列来调度任务,结果,当中断向某个任务传递消息(指针)时,程序在
红色部分函数内执行OS_EXIT_CRITICAL()语句后进入异常
void __sysTickIsr (void)
{
    STCTRL;

    OSIntEnter();
    OSTimeTick();                                                       /*  系统节拍处理                */
    OSIntExit();
}




还有一种情况,我自己测试的

在一个任务内向本任务传递一条消息,即OSQPost()后立马执行OSQPend(),在OSQPend()语句内的红色部分语句执行后立马进入异常。



void  *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif
    void      *msg;
    OS_Q      *pq;


    if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
        *err = OS_ERR_PEND_ISR;                  /* ... can't PEND from an ISR                         */
        return ((void *)0);
    }
#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) {               /* Validate 'pevent'                                  */
        *err = OS_ERR_PEVENT_NULL;
        return ((void *)0);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type                          */
        *err = OS_ERR_EVENT_TYPE;
        return ((void *)0);
    }
#endif
    OS_ENTER_CRITICAL();
    pq = (OS_Q *)pevent->OSEventPtr;             /* Point at queue control block                       */
    if (pq->OSQEntries > 0) {                    /* See if any messages in the queue                   */
        msg = *pq->OSQOut++;                     /* Yes, extract oldest message from the queue         */
        pq->OSQEntries--;                        /* Update the number of entries in the queue          */
        if (pq->OSQOut == pq->OSQEnd) {          /* Wrap OUT pointer if we are at the end of the queue */
            pq->OSQOut = pq->OSQStart;
        }
        OS_EXIT_CRITICAL();
        *err = OS_NO_ERR;
       return (msg);                            /* Return message received                            */
    }
    OSTCBCur->OSTCBStat |= OS_STAT_Q;            /* Task will have to pend for a message to be posted  */
    OSTCBCur->OSTCBDly   = timeout;              /* Load timeout into TCB                              */
    OS_EventTaskWait(pevent);                    /* Suspend task until event or timeout occurs         */
    OS_EXIT_CRITICAL();
    OS_Sched();                                  /* Find next highest priority task ready to run       */
    OS_ENTER_CRITICAL();
    msg = OSTCBCur->OSTCBMsg;
    if (msg != (void *)0) {                      /* Did we get a message?                              */
        OSTCBCur->OSTCBMsg      = (void *)0;     /* Extract message from TCB (Put there by QPost)      */
        OSTCBCur->OSTCBStat     = OS_STAT_RDY;
        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event                        */
        OS_EXIT_CRITICAL();
        *err                    = OS_NO_ERR;
        return (msg);                            /* Return message received                            */
    }
    OS_EventTO(pevent);                          /* Timed out                                          */
    OS_EXIT_CRITICAL();
    *err = OS_TIMEOUT;                           /* Indicate a timeout occured                         */
    return ((void *)0);                          /* No message received                                */
}



最终程序死在异常中(红色部分):
void defaultVectorHandle3 (void)
{
#ifdef DEBUG
        while (1);
#else
    zyReset(ZY_HARD_RESET);
#endif                                                                  /*  DEBUG                       */
}


我暂时找不到原因啊,自己对ARM还没有很深的了解,希望前辈能够给我点提示。

相关帖子

沙发
delin17| | 2013-2-22 13:56 | 只看该作者
是不是传进去的指针或堆栈设置有问题,自己检查一下。
你可以通过查CM3的内核寄存器,可以看出是出现什么错误,并且是在那条语句出错了

使用特权

评论回复
板凳
e08610318|  楼主 | 2013-2-22 14:10 | 只看该作者
delin17 发表于 2013-2-22 13:56
是不是传进去的指针或堆栈设置有问题,自己检查一下。
你可以通过查CM3的内核寄存器,可以看出是出现什么错 ...

谢谢!刚刚找到原因,是代码错误导致野指针的问题。请问前辈,进入异常一般都和指针或者堆栈设置有关?会不会还有其他情况会触发异常?还有,一般看拿几个寄存器可以追踪到问题?PSR?

使用特权

评论回复
地板
delin17| | 2013-2-23 11:29 | 只看该作者
有很多情况可以触发的,Cortex-M3权威指南Cn有叫你怎么找到出错的语句和出现什么错误
基本大部分时候是指针问题/堆栈问题

使用特权

评论回复
5
e08610318|  楼主 | 2013-3-1 11:28 | 只看该作者
delin17 发表于 2013-2-23 11:29
有很多情况可以触发的,Cortex-M3权威指南Cn有叫你怎么找到出错的语句和出现什么错误
基本大部分时候是指针 ...

呵呵,谢谢了。还不知道有这个资料,之前都是看芯片的资料

使用特权

评论回复
6
HORSE7812| | 2013-8-17 15:34 | 只看该作者
学习

使用特权

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

本版积分规则

个人签名:你可能不知道今天所做的事情会对未来有多大的干预能力!

67

主题

310

帖子

12

粉丝