uC/OS II 函数说明 之–OS_TCBInit()

来源:互联网 发布:手机文件解压软件 编辑:程序博客网 时间:2024/04/29 19:05

TCB初始化函数,被OSTaskCreate()与OSTaskCreateExt()调用,需要注意的是,这个函数是对内的,即此函数可以被uC/OS II调用,用户应用程序不可以直接调用此函数。OSTcbInit()函数的参数是与OSTaskCreateExt()的参数对应的,对于OSTaskCreate(),部分参数被设置为0。
    err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); /* 对应OSTaskCreate()                */
    err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);   /* 对应OSTaskCreateExt()             */
   
    函数源码如下:

INT8U  OS_TCBInit (INT8U prio,                            /* 优先级                                    */
                   OS_STK *ptos,                          /* 指向堆栈顶部                              */
                   OS_STK *pbos,                          /* 指向堆栈底部                              */
                   INT16U id,                           
                   INT32U stk_size,                       /* 堆栈大小                                  */
                   void *pext,                            /* 扩展指针                                  */
                   INT16U opt)                            /* 存放与任务操作相关的信息,详见uCOS-II.H   */
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif   
    OS_TCB    *ptcb;

    OS_ENTER_CRITICAL();
    ptcb = OSTCBFreeList;                                  /* 从空链表中获取一个TCB                    */
    if (ptcb != (OS_TCB *)0) {                             /* 空链表存在                               */
        OSTCBFreeList        = ptcb->OSTCBNext;            /* 指向下一个链接位置,此位置已被占用       */
        OS_EXIT_CRITICAL();
        ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
        ptcb->OSTCBPrio      = (INT8U)prio;                /* Load task priority into TCB              */
        ptcb->OSTCBStat      = OS_STAT_RDY;                /* Task is ready to run                     */
        ptcb->OSTCBDly       = 0;                          /* Task is not delayed                      */

#if OS_TASK_CREATE_EXT_EN > 0                              /* 如果是OSTaskCreateExt()创建,附加下列参数*/
        ptcb->OSTCBExtPtr    = pext;                       /* Store pointer to TCB extension           */
        ptcb->OSTCBStkSize   = stk_size;                   /* Store stack size                         */
        ptcb->OSTCBStkBottom = pbos;                       /* Store pointer to bottom of stack         */
        ptcb->OSTCBOpt       = opt;                        /* Store task options                       */
        ptcb->OSTCBId        = id;                         /* Store task ID                            */
#else
        pext                 = pext;                       /* 避免编译器警告或报错                     */
        stk_size             = stk_size;
        pbos                 = pbos;
        opt                  = opt;
        id                   = id;
#endif

#if OS_TASK_DEL_EN > 0
        ptcb->OSTCBDelReq    = OS_NO_ERR;
#endif

        ptcb->OSTCBY         = prio >> 3;                  /* 提前计算X, Y, BitX and BitY,用于查表    */
        ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];     /* 详见任务就绪表                           */
        ptcb->OSTCBX         = prio & 0×07;
        ptcb->OSTCBBitX      = OSMapTbl[ptcb->OSTCBX];

#if OS_EVENT_EN > 0
        ptcb->OSTCBEventPtr  = (OS_EVENT *)0;              /* Task is not pending on an event          */
#endif

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) && (OS_TASK_DEL_EN > 0)
        ptcb->OSTCBFlagNode  = (OS_FLAG_NODE *)0;          /* Task is not pending on an event flag     */
#endif

#if (OS_MBOX_EN > 0) || ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
        ptcb->OSTCBMsg       = (void *)0;                  /* No message received                      */
#endif

#if OS_VERSION >= 204
        OSTCBInitHook(ptcb);
#endif

        OSTaskCreateHook(ptcb);                            /* Call user defined hook                   */
        OS_ENTER_CRITICAL();
        OSTCBPrioTbl[prio] = ptcb;                       /* TCB指针按照优先级放入OSTCBPrioTbl[]对应位置*/
        ptcb->OSTCBNext    = OSTCBList;                  /* OSTCBList总是指向队列头位置,ptcb插入其前面*/
        ptcb->OSTCBPrev    = (OS_TCB *)0;                /* 由于ptcb在最前面,它的OSTCBPrev为空        */
        if (OSTCBList != (OS_TCB *)0) {                  /* 判断是否为第一个任务,如不是,则链接前后   */
            OSTCBList->OSTCBPrev = ptcb;                 /* 任务,形成任务链                           */
        }
        OSTCBList               = ptcb;                  /* OSTCBList依然是队列的第一个元素            */

        OSRdyGrp               |= ptcb->OSTCBBitY;       /* 任务加入就绪表,准备运行                   */
        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
        OS_EXIT_CRITICAL();
        return (OS_NO_ERR);
    }
    OS_EXIT_CRITICAL();
    return (OS_NO_MORE_TCB);
}

 

原创粉丝点击