下图简要描绘了uC/OS中的TCB,其中OSTCBFreeList是系统中空闲TCB的单向队列,OSTCBList是已经分配的TCB队列,是双向队列,这两个队列的数据都存储在数组OSTCBTbl中。在函数OS_InitTCBList()中,OSTCBFreeList被初始化,建立队列连接关系。在OSTaskCreate()中调用OS_TCBInit()从OSTCBFreeList中分配一个没有使用的TCB,并将任务信息写入该TCB,同时将其从OSTCBFreeList中删除,加入到双向队列OSTCBList中。在OSTaskDel()中,若要删除优先级为prio的任务,则先通过OSTCBPrioTbl数组在OSTCBList中找到该任务,按照双向链表的方法删除该节点,并且把该TCB节点加入到OSTCBFreeList队首,以供下次使用。每次查找优先级为prio的任务时,当然可以遍历OSTCBList找到该任务,但是过于耗时。为了提高查找速度,uC/OS使用了OSTCBPrioTbl数组来指向相应的TCB指针,OSTCBPrioTbl[prio]指向优先级为prio的TCB指针,这样,增加任务、查找任务、修改任务、删除任务的速度无疑都是常数,优于任何类型的数据结构。当然,其代价是大大增加了对存储的需求。
uC/OS中的TCB
最新推荐文章于 2022-03-15 09:38:21 发布