OS_TaskInitTCB(p_tcb); /* Initialize the TCB to default values */ /* -------------- CLEAR THE TASK'S STACK -------------- */ if (((opt & OS_OPT_TASK_STK_CHK) != 0u) || /* See if stack checking has been enabled */ ((opt & OS_OPT_TASK_STK_CLR) != 0u)) { /* See if stack needs to be cleared */ if ((opt & OS_OPT_TASK_STK_CLR) != 0u) { p_sp = p_stk_base; for (i = 0u; i < stk_size; i++) { /* Stack grows from HIGH to LOW memory */ *p_sp = 0u; /* Clear from bottom of stack and up! */ p_sp++; } } }
p_tcb->Prio = prio; /* Save the task's priority */
p_tcb->StkPtr = p_sp; /* Save the new top-of-stack pointer */ p_tcb->StkLimitPtr = p_stk_limit; /* Save the stack limit pointer */ p_tcb->ExtPtr = p_ext; /* Save pointer to TCB extension */ p_tcb->Opt = opt; /* Save task options */
OSTaskCreateHook(p_tcb); /* Call user defined hook */
OS_TRACE_TASK_CREATE(p_tcb); OS_TRACE_TASK_SEM_CREATE(p_tcb, p_name); /* -------------- ADD TASK TO READY LIST -------------- */ CPU_CRITICAL_ENTER(); OS_PrioInsert(p_tcb->Prio); OS_RdyListInsertTail(p_tcb);
OSTaskQty++; /* Increment the #tasks counter */
if (OSRunning != OS_STATE_OS_RUNNING) { /* Return if multitasking has not started */ CPU_CRITICAL_EXIT(); return; }