?? os_task.c
字號:
INT8U err; OS_TCB *ptcb; if (prio == OS_IDLE_PRIO) { /* Not allowed to delete idle task */ return (OS_TASK_DEL_IDLE); } if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */ return (OS_PRIO_INVALID); } if (prio == OS_PRIO_SELF) { /* See if a task is requesting to ... */ OS_ENTER_CRITICAL(); /* ... this task to delete itself */ stat = OSTCBCur->OSTCBDelReq; /* Return request status to caller */ OS_EXIT_CRITICAL(); return (stat); } else { OS_ENTER_CRITICAL(); if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) { /* Task to delete must exist */ ptcb->OSTCBDelReq = OS_TASK_DEL_REQ; /* Set flag indicating task to be DEL. */ err = OS_NO_ERR; } else { err = OS_TASK_NOT_EXIST; /* Task must be deleted */ } OS_EXIT_CRITICAL(); return (err); }}#endif/*$PAGE*//*********************************************************************************************************** RESUME A SUSPENDED TASK** Description: This function is called to resume a previously suspended task. This is the only call that* will remove an explicit task suspension.** Arguments : prio is the priority of the task to resume.** Returns : OS_NO_ERR if the requested task is resumed* OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed * (i.e. >= OS_LOWEST_PRIO)* OS_TASK_RESUME_PRIO if the task to resume does not exist* OS_TASK_NOT_SUSPENDED if the task to resume has not been suspended**********************************************************************************************************/#if OS_TASK_SUSPEND_ENINT8U OSTaskResume (INT8U prio){ OS_TCB *ptcb; if (prio >= OS_LOWEST_PRIO) { /* Make sure task priority is valid */ return (OS_PRIO_INVALID); } OS_ENTER_CRITICAL(); if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) { /* Task to suspend must exist */ OS_EXIT_CRITICAL(); return (OS_TASK_RESUME_PRIO); } else { if (ptcb->OSTCBStat & OS_STAT_SUSPEND) { /* Task must be suspended */ if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) && /* Remove suspension */ (ptcb->OSTCBDly == 0)) { /* Must not be delayed */ OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */ OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; OS_EXIT_CRITICAL(); OSSched(); } else { OS_EXIT_CRITICAL(); } return (OS_NO_ERR); } else { OS_EXIT_CRITICAL(); return (OS_TASK_NOT_SUSPENDED); } }}#endif/*$PAGE*//*********************************************************************************************************** STACK CHECKING ** Description: This function is called to check the amount of free memory left on the specified task's* stack.** Arguments : prio is the task priority** pdata is a pointer to a data structure of type OS_STK_DATA.** Returns : OS_NO_ERR upon success* OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed * (i.e. > OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.* OS_TASK_NOT_EXIST if the desired task has not been created* OS_TASK_OPT_ERR if you did NOT specified OS_TASK_OPT_STK_CHK when the task was created**********************************************************************************************************/#if OS_TASK_CREATE_EXT_ENINT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata){ OS_TCB *ptcb; OS_STK *pchk; INT32U free; INT32U size; pdata->OSFree = 0; /* Assume failure, set to 0 size */ pdata->OSUsed = 0; if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Make sure task priority is valid */ return (OS_PRIO_INVALID); } OS_ENTER_CRITICAL(); if (prio == OS_PRIO_SELF) { /* See if check for SELF */ prio = OSTCBCur->OSTCBPrio; } ptcb = OSTCBPrioTbl[prio]; if (ptcb == (OS_TCB *)0) { /* Make sure task exist */ OS_EXIT_CRITICAL(); return (OS_TASK_NOT_EXIST); } if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* Make sure stack checking option is set */ OS_EXIT_CRITICAL(); return (OS_TASK_OPT_ERR); } free = 0; size = ptcb->OSTCBStkSize; pchk = ptcb->OSTCBStkBottom; OS_EXIT_CRITICAL();#if OS_STK_GROWTH == 1 while (*pchk++ == 0) { /* Compute the number of zero entries on the stk */ free++; }#else while (*pchk-- == 0) { free++; }#endif pdata->OSFree = free * sizeof(OS_STK); /* Compute number of free bytes on the stack */ pdata->OSUsed = (size - free) * sizeof(OS_STK); /* Compute number of bytes used on the stack */ return (OS_NO_ERR);}#endif/*$PAGE*//*********************************************************************************************************** SUSPEND A TASK** Description: This function is called to suspend a task. The task can be the calling task if the* priority passed to OSTaskSuspend() is the priority of the calling task or OS_PRIO_SELF.** Arguments : prio is the priority of the task to suspend. If you specify OS_PRIO_SELF, the* calling task will suspend itself and rescheduling will occur.** Returns : OS_NO_ERR if the requested task is suspended* OS_TASK_SUSPEND_IDLE if you attempted to suspend the idle task which is not allowed.* OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed * (i.e. >= OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.* OS_TASK_SUSPEND_PRIO if the task to suspend does not exist** Note : You should use this function with great care. If you suspend a task that is waiting for* an event (i.e. a message, a semaphore, a queue ...) you will prevent this task from* running when the event arrives.**********************************************************************************************************/#if OS_TASK_SUSPEND_ENINT8U OSTaskSuspend (INT8U prio){ BOOLEAN self; OS_TCB *ptcb; if (prio == OS_IDLE_PRIO) { /* Not allowed to suspend idle task */ return (OS_TASK_SUSPEND_IDLE); } if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */ return (OS_PRIO_INVALID); } OS_ENTER_CRITICAL(); if (prio == OS_PRIO_SELF) { /* See if suspend SELF */ prio = OSTCBCur->OSTCBPrio; self = TRUE; } else if (prio == OSTCBCur->OSTCBPrio) { /* See if suspending self */ self = TRUE; } else { self = FALSE; /* No suspending another task */ } if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) { /* Task to suspend must exist */ OS_EXIT_CRITICAL(); return (OS_TASK_SUSPEND_PRIO); } else { if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* Make task not ready */ OSRdyGrp &= ~ptcb->OSTCBBitY; } ptcb->OSTCBStat |= OS_STAT_SUSPEND; /* Status of task is 'SUSPENDED' */ OS_EXIT_CRITICAL(); if (self == TRUE) { /* Context switch only if SELF */ OSSched(); } return (OS_NO_ERR); }}#endif/*$PAGE*//*********************************************************************************************************** QUERY A TASK** Description: This function is called to obtain a copy of the desired task's TCB.** Arguments : prio is the priority of the task to obtain information from. ** Returns : OS_NO_ERR if the requested task is suspended* OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed * (i.e. > OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.* OS_PRIO_ERR if the desired task has not been created **********************************************************************************************************/INT8U OSTaskQuery (INT8U prio, OS_TCB *pdata){ OS_TCB *ptcb; if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */ return (OS_PRIO_INVALID); } OS_ENTER_CRITICAL(); if (prio == OS_PRIO_SELF) { /* See if suspend SELF */ prio = OSTCBCur->OSTCBPrio; } if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) { /* Task to query must exist */ OS_EXIT_CRITICAL(); return (OS_PRIO_ERR); } *pdata = *ptcb; /* Copy TCB into user storage area */ OS_EXIT_CRITICAL(); return (OS_NO_ERR);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -