jzhang123 发表于 2013-11-7 11:43:38

uC/OS-II学习笔记-任务的建立

任务的建立有两个函数,OSTaskCreate和OSTaskCreateExt#if OS_TASK_CREATE_EXT_EN > 0
INT8UOSTaskCreateExt (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;具体这些参数有什么用,还不是很清楚,继续研究代码和原理

jzhang123 发表于 2013-11-7 11:45:03

如果有大神能帮我解答,那感激不尽了
页: [1]
查看完整版本: uC/OS-II学习笔记-任务的建立