uCOSII任务的创建和删除之链表的插入和删除

  前几周重新梳理了一下C语言,学习了高级C部分,主要是c指针和结构体,链表,并了解了堆和栈,以及数据区的差别,有了一些基础之后再次跟着看uCOS,--朱老师课程

  今天晚上终于首次把task.c部分全部浏览了一边,再次加深指针和链表的熟悉。

  粗略的做了一些笔记,一遍后面翻看。

  任务创建调用了OS_TCBInit函数,此函数中有部分我链表的插入

OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = ptcb;
ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
ptcb->OSTCBPrev = (OS_TCB *)0;
if (OSTCBList != (OS_TCB *)0) {
OSTCBList->OSTCBPrev = ptcb;
}
OSTCBList = ptcb;
OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
OS_EXIT_CRITICAL();

任务删除,实际上是任务控制块从就绪链表中删除,同时插入到空闲链表中,当然就绪表,TCB清零等都要操作,这里只看链表的操作部分。

if (prio == OS_PRIO_SELF) {                         /* OS_PRIO_SELF=0xFF,即255,因此任务优先级最多到254?255只是表示自身的优先级,真实的优先级还是在自身TCB中查找See if requesting to delete self            */
        prio = OSTCBCur->OSTCBPrio;                     /* Set priority to delete to current           */
    }
    ptcb = OSTCBPrioTbl[prio];
……
……
 OSTCBPrioTbl[prio] = (OS_TCB *)0;                   /* Clear old priority entry                    */
    if (ptcb->OSTCBPrev == (OS_TCB *)0) {               /* 如下部分4句就是TCB双链表的删除动作Remove from TCB chain                       */
        ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
        OSTCBList                  = ptcb->OSTCBNext;
    } else {
        ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
        ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
    }
    ptcb->OSTCBNext     = OSTCBFreeList;                /* ptcb->OSTCBNext指向原来 OSTCBFreeList指向的TCB,这句是将释放的ptcb加入到了空闲链表中!Return TCB to free TCB list                 */
    OSTCBFreeList       = ptcb;

  

猜你喜欢

转载自www.cnblogs.com/Hw2SwGreat/p/9703955.html