uC/OS-II学习笔记-任务的建立
任务的建立有两个函数,OSTaskCreate和OSTaskCreateExt#if OS_TASK_CREATE_EXT_EN > 0INT8UOSTaskCreateExt (void (*task)(void *p_arg),
void *p_arg,
OS_STK*ptos,
INT8U prio,
INT16U id,
OS_STK*pbos,
INT32U stk_size,
void *pext,
INT16U opt)
{
OS_STK *psp;
INT8U err;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SRcpu_sr = 0;
#endif
#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
return (OS_ERR_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
if (OSIntNesting > 0) { /* Make sure we don't create the task from within an ISR*/
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_CREATE_ISR);
}
if (OSTCBPrioTbl == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority*/
OSTCBPrioTbl = OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ...*/
/* ... the same thing until task is created. */
OS_EXIT_CRITICAL();
#if (OS_TASK_STAT_STK_CHK_EN > 0)
OS_TaskStkClr(pbos, stk_size, opt); /* Clear the task stack (if needed) */
#endif
psp = OSTaskStkInit(task, p_arg, ptos, opt); /* Initialize the task's stack */
err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
if (err == OS_ERR_NONE) {
if (OSRunning == OS_TRUE) { /* Find HPT if multitasking has started */
OS_Sched();
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl = (OS_TCB *)0; /* Make this priority avail. to others*/
OS_EXIT_CRITICAL();
}
return (err);
}
OS_EXIT_CRITICAL();
return (OS_ERR_PRIO_EXIST);
}
#endif
相比OSTaskCreate函数而言, 多了一段代码;这段代码从字面上就可以看出其作用是清零任务的堆栈。
#if (OS_TASK_STAT_STK_CHK_EN > 0)
OS_TaskStkClr(pbos, stk_size, opt); /* Clear the task stack (if needed) */
#endif
还有一点不同的是,在TCB模块的初始化时,会将 id, stk_size, pext, opt这些参数写进去;而OSTaskCreate函数
都是默认写0;具体这些参数有什么用,还不是很清楚,继续研究代码和原理 如果有大神能帮我解答,那感激不尽了
页:
[1]