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状态,并且,任务没有被删除时,修改OSRdyGrp和OSRdyTbl[]的值,将其变为就绪任务。其中OSTCBY、OSTCBBitX是任务控制块的元素。OSTCBY=priority>>3;OSTCBX=priority&0x07;OSTCBBitY=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