现在的位置: 首页 > 综合 > 正文

ucos-ii 中OSTaskResume函数理解

2013年09月10日 ⁄ 综合 ⁄ 共 2092字 ⁄ 字号 评论关闭

OSTaskResume() 的返回值为下述之一:

* OS_NO_ERR:函数调用成功。

* OS_TASK_RESUME_PRIO:要唤醒的任务不存在。

* OS_TASK_NOT_SUSPENDED:要唤醒的任务不在挂起状态。

* OS_PRIO_INVALID:参数指定的优先级大于或等于OS_LOWEST_PRIO。

 

#if OS_TASK_SUSPEND_EN > 0

INT8U OSTaskResume (INT8U prio)

{

#if OS_CRITICAL_METHOD == 3                     

    OS_CPU_SR cpu_sr;

#endif

    OS_TCB    *ptcb;                  //创建临时变量ptcb,用来指向任务控制块

#if OS_ARG_CHK_EN > 0

    if (prio >= OS_LOWEST_PRIO) {                               //检查优先级的有效性

        return (OS_PRIO_INVALID);

    }

#endif             

OS_ENTER_CRITICAL();

//获得该优先级的任务控制块,并判断是否存在。如果不存在,返回OS_TASK_RESUME_PRIO

if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {          

       OS_EXIT_CRITICAL();

              return (OS_TASK_RESUME_PRIO);

}

(说明:

uCOS_II.H中定义的:

#define OS_STAT_RDY              0x00         /* Ready to run                         00000000     

#define OS_STAT_SEM              0x01        /* Pending on semaphore                00000001

#define OS_STAT_MBOX          0x02        /* Pending on mailbox                   00000010

#define OS_STAT_Q                 0x04         /* Pending on queue                      00000100

#define OS_STAT_SUSPEND          0x08        /* Task is suspended                     00001000

#define OS_STAT_MUTEX            0x10     /* Pending on mutual exclusion semaphore      00010000

#define OS_STAT_FLAG              0x20        /* Pending on event flag group             00100000

)

    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != 0x00) {                     //判断是否是被挂起的任务

        if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) &&    

             (ptcb->OSTCBDly == 0)) {                                    

(说明:后3位置0,即将其转为OS_STAT_RDY状态,并且,任务没有被删除时,修改OSRdyGrpOSRdyTbl[]的值,将其变为就绪任务。其中OSTCBYOSTCBBitX是任务控制块的元素。OSTCBY=priority>>3OSTCBX=priority&0x07OSTCBBitY=OSMapTbl[priority>>3]OSTCBBitX=OSMapTbl[priority&0x07])

            OSRdyGrp               |= ptcb->OSTCBBitY;                   

            OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;

            OS_EXIT_CRITICAL();

            OS_Sched();                                                     //任务切换

        } else {

            OS_EXIT_CRITICAL();

        }

        return (OS_NO_ERR);

    }

    OS_EXIT_CRITICAL();

    return (OS_TASK_NOT_SUSPENDED);

}

#endif

抱歉!评论已关闭.