前几周重新梳理了一下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;