任务控制块TCB:
OS_EXT OS_TCB *OSTCBCur;
OS_EXT OS_TCB *OSTCBFreeList;
OS_EXT OS_TCB *OSTCBHighRdy;
OS_EXT OS_TCB *OSTCBList;
OS_EXT OS_TCB *OSTCBPrioTbl[OS_LOWEST_PRIO + 1u];
OS_EXT OS_TCB OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];
OSTCBPrioTbl:该表用于查找TCB,用优先级作为索引,可以很方便的查找TCB,但是这是在所有任务优先级都不同的前提下的。像 u/COS III没有这个限制就不能这么用了,因为任务之间的优先级可以相同。
该表有几点好处:
1、方便查找任务控制块(TCB)
2、可以在创建任务的时候作为一个标志位,如果设置为保留标志,那么对该优先级的所有资源进行锁定,其他任务看到该标志就不再使用该任务资源,这样就可以在开中断的情况下从容进行后续工作,以减少关中断的时间。他也是一个优先级是否被使用的标志
3、节省空间。在优先级很多,但是不需要那么多实际的任务情况下,就不需要分配那么多实际的TCB了(和第一点有关系)。优先级数多于实际任务数主要是为了扩展,版本兼容,保留几个高优先级,以在将来升级使用,在实际任务之间插入一些优先级,如果后面需要加入新功能就可以在不改动其他任务的情况下添加任务。
OSTCBCur:始终指向当前任务的TCB,和OSTCBHighRdy结合使用,还有两个相关变量是 OSPrioHighRdy(查找的处于就绪态的最高优先级)和OSPrioCur(当前优先级),当进行任务切换时,会将找到的最高优先级保存到OSPrioHighRdy,通过OSTCBPrioTbl[OSPrioHighRdy]找到新任务的TCB地址,保存在OSTCBHighRdy,然后OSPrioHighRdy和OSPrioCur比较,如果不相等就进行任务切换(相等也就不需要进行切换)。
OSTCBFreeList:这个是空闲TCB的链表,所有没有使用的TCB都放在这里。
OSTCBList:这个是已使用的TCB的链表。所有任务创建后都把相应的TCB链接在这个表里。后链接的TCB作为新表头,因为系统任务比用户的任务先创建,所以在链表的末尾。在SysTick处理函数中,它会遍历所有的TCB,直到遇到空闲任务就放弃遍历,所以空闲任务必须在链表的尾巴部分。