?? ucos ii v2.9 ?
字號:
BOOLEAN self;
OS_TCB *ptcb;
INT8U y;
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
#if OS_ARG_CHK_EN > 0u
if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to suspend idle task */
return (OS_ERR_TASK_SUSPEND_IDLE);
}
if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
if (prio != OS_PRIO_SELF) {
return (OS_ERR_PRIO_INVALID);
}
}
#endif
OS_ENTER_CRITICAL();
if (prio == OS_PRIO_SELF) { /* See if suspend SELF */
prio = OSTCBCur->OSTCBPrio;
self = OS_TRUE;
} else if (prio == OSTCBCur->OSTCBPrio) { /* See if suspending self */
self = OS_TRUE;
} else {
self = OS_FALSE; /* No suspending another task */
}
ptcb = OSTCBPrioTbl[prio];
if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_SUSPEND_PRIO);
}
if (ptcb == OS_TCB_RESERVED) { /* See if assigned to Mutex */
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_NOT_EXIST);
}
y = ptcb->OSTCBY;
OSRdyTbl[y] &= (OS_PRIO)~ptcb->OSTCBBitX; /* Make task not ready */
if (OSRdyTbl[y] == 0u) {
OSRdyGrp &= (OS_PRIO)~ptcb->OSTCBBitY;
}
ptcb->OSTCBStat |= OS_STAT_SUSPEND; /* Status of task is 'SUSPENDED' */
OS_EXIT_CRITICAL();
if (self == OS_TRUE) { /* Context switch only if SELF */
OS_Sched(); /* Find new highest priority task */
}
return (OS_ERR_NONE);
}
#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.
*
* p_task_data is a pointer to where the desired task's OS_TCB will be stored.
*
* Returns : OS_ERR_NONE if the requested task is suspended
* OS_ERR_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_ERR_PRIO if the desired task has not been created
* OS_ERR_TASK_NOT_EXIST if the task is assigned to a Mutex PIP
* OS_ERR_PDATA_NULL if 'p_task_data' is a NULL pointer
*********************************************************************************************************
*/
#if OS_TASK_QUERY_EN > 0u
INT8U OSTaskQuery (INT8U prio,
OS_TCB *p_task_data)
{
OS_TCB *ptcb;
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
#if OS_ARG_CHK_EN > 0u
if (prio > OS_LOWEST_PRIO) { /* Task priority valid ? */
if (prio != OS_PRIO_SELF) {
return (OS_ERR_PRIO_INVALID);
}
}
if (p_task_data == (OS_TCB *)0) { /* Validate 'p_task_data' */
return (OS_ERR_PDATA_NULL);
}
#endif
OS_ENTER_CRITICAL();
if (prio == OS_PRIO_SELF) { /* See if suspend SELF */
prio = OSTCBCur->OSTCBPrio;
}
ptcb = OSTCBPrioTbl[prio];
if (ptcb == (OS_TCB *)0) { /* Task to query must exist */
OS_EXIT_CRITICAL();
return (OS_ERR_PRIO);
}
if (ptcb == OS_TCB_RESERVED) { /* Task to query must not be assigned to a Mutex */
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_NOT_EXIST);
}
/* Copy TCB into user storage area */
OS_MemCopy((INT8U *)p_task_data, (INT8U *)ptcb, sizeof(OS_TCB));
OS_EXIT_CRITICAL();
return (OS_ERR_NONE);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* GET THE CURRENT VALUE OF A TASK REGISTER
*
* Description: This function is called to obtain the current value of a task register. Task registers
* are application specific and can be used to store task specific values such as 'error
* numbers' (i.e. errno), statistics, etc. Each task register can hold a 32-bit value.
*
* Arguments : prio is the priority of the task you want to get the task register from. If you
* specify OS_PRIO_SELF then the task register of the current task will be obtained.
*
* id is the 'id' of the desired task register. Note that the 'id' must be less
* than OS_TASK_REG_TBL_SIZE
*
* perr is a pointer to a variable that will hold an error code related to this call.
*
* OS_ERR_NONE if the call was successful
* OS_ERR_PRIO_INVALID if you specified an invalid priority
* OS_ERR_ID_INVALID if the 'id' is not between 0 and OS_TASK_REG_TBL_SIZE-1
*
* Returns : The current value of the task's register or 0 if an error is detected.
*
* Note(s) : The maximum number of task variables is 254
*********************************************************************************************************
*/
#if OS_TASK_REG_TBL_SIZE > 0u
INT32U OSTaskRegGet (INT8U prio,
INT8U id,
INT8U *perr)
{
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
INT32U value;
OS_TCB *ptcb;
#if OS_ARG_CHK_EN > 0u
if (prio >= OS_LOWEST_PRIO) {
if (prio != OS_PRIO_SELF) {
*perr = OS_ERR_PRIO_INVALID;
return (0u);
}
}
if (id >= OS_TASK_REG_TBL_SIZE) {
*perr = OS_ERR_ID_INVALID;
return (0u);
}
#endif
OS_ENTER_CRITICAL();
if (prio == OS_PRIO_SELF) { /* See if need to get register from current task */
ptcb = OSTCBCur;
} else {
ptcb = OSTCBPrioTbl[prio];
}
value = ptcb->OSTCBRegTbl[id];
OS_EXIT_CRITICAL();
*perr = OS_ERR_NONE;
return (value);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* SET THE CURRENT VALUE OF A TASK VARIABLE
*
* Description: This function is called to change the current value of a task register. Task registers
* are application specific and can be used to store task specific values such as 'error
* numbers' (i.e. errno), statistics, etc. Each task register can hold a 32-bit value.
*
* Arguments : prio is the priority of the task you want to set the task register for. If you
* specify OS_PRIO_SELF then the task register of the current task will be obtained.
*
* id is the 'id' of the desired task register. Note that the 'id' must be less
* than OS_TASK_REG_TBL_SIZE
*
* value is the desired value for the task register.
*
* perr is a pointer to a variable that will hold an error code related to this call.
*
* OS_ERR_NONE if the call was successful
* OS_ERR_PRIO_INVALID if you specified an invalid priority
* OS_ERR_ID_INVALID if the 'id' is not between 0 and OS_TASK_REG_TBL_SIZE-1
*
* Returns : The current value of the task's variable or 0 if an error is detected.
*
* Note(s) : The maximum number of task variables is 254
*********************************************************************************************************
*/
#if OS_TASK_REG_TBL_SIZE > 0u
void OSTaskRegSet (INT8U prio,
INT8U id,
INT32U value,
INT8U *perr)
{
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
OS_TCB *ptcb;
#if OS_ARG_CHK_EN > 0u
if (prio >= OS_LOWEST_PRIO) {
if (prio != OS_PRIO_SELF) {
*perr = OS_ERR_PRIO_INVALID;
return;
}
}
if (id >= OS_TASK_REG_TBL_SIZE) {
*perr = OS_ERR_ID_INVALID;
return;
}
#endif
OS_ENTER_CRITICAL();
if (prio == OS_PRIO_SELF) { /* See if need to get register from current task */
ptcb = OSTCBCur;
} else {
ptcb = OSTCBPrioTbl[prio];
}
ptcb->OSTCBRegTbl[id] = value;
OS_EXIT_CRITICAL();
*perr = OS_ERR_NONE;
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* CATCH ACCIDENTAL TASK RETURN
*
* Description: This function is called if a task accidentally returns without deleting itself. In other
* words, a task should either be an infinite loop or delete itself if it's done.
*
* Arguments : none
*
* Returns : none
*
* Note(s) : This function is INTERNAL to uC/OS-II and your application should not call it.
*********************************************************************************************************
*/
void OS_TaskReturn (void)
{
OSTaskReturnHook(OSTCBCur); /* Call hook to let user decide on what to do */
#if OS_TASK_DEL_EN > 0u
(void)OSTaskDel(OS_PRIO_SELF); /* Delete task if it accidentally returns! */
#else
for (;;) {
OSTimeDly(OS_TICKS_PER_SEC);
}
#endif
}
/*$PAGE*/
/*
*********************************************************************************************************
* CLEAR TASK STACK
*
* Description: This function is used to clear the stack of a task (i.e. write all zeros)
*
* Arguments : pbos is a pointer to the task's bottom of stack. If the configuration constant
* OS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high
* memory to low memory). 'pbos' will thus point to the lowest (valid) memory
* location of the stack. If OS_STK_GROWTH is set to 0, 'pbos' will point to the
* highest memory location of the stack and the stack will grow with increasing
* memory locations. 'pbos' MUST point to a valid 'free' data item.
*
* size is the number of 'stack elements' to clear.
*
* opt contains additional information (or options) about the behavior of the task. The
* LOWER 8-bits are reserved by uC/OS-II while the upper 8 bits can be application
* specific. See OS_TASK_OPT_??? in uCOS-II.H.
*
* Returns : none
*********************************************************************************************************
*/
#if (OS_TASK_STAT_STK_CHK_EN > 0u) && (OS_TASK_CREATE_EXT_EN > 0u)
void OS_TaskStkClr (OS_STK *pbos,
INT32U size,
INT16U opt)
{
if ((opt & OS_TASK_OPT_STK_CHK) != 0x0000u) { /* See if stack checking has been enabled */
if ((opt & OS_TASK_OPT_STK_CLR) != 0x0000u) { /* See if stack needs to be cleared */
#if OS_STK_GROWTH == 1u
while (size > 0u) { /* Stack grows from HIGH to LOW memory */
size--;
*pbos++ = (OS_STK)0; /* Clear from bottom of stack and up! */
}
#else
while (size > 0u) { /* Stack grows from LOW to HIGH memory */
size--;
*pbos-- = (OS_STK)0; /* Clear from bottom of stack and down */
}
#endif
}
}
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -