任务就绪表
在系统中,所有已经就绪等待运行的任务都被放入一个所谓“就绪表”(ready list)中,该表包括两部分
- 就绪优先级位映射表
- 就绪任务列表
1.1 就绪优先级位映射表
每一位代表一个优先级,当某一优先级由任务就绪时,在就绪优先级位映射表中该优先级对应的位被置1,之所以按照上图的顺序映射,是为了便于使用一条特殊的指令“计算前导零”,该指令可以显著提高最高优先级查找的速度。
优先级操作函数
函数 | 说明 |
---|---|
OS_PrioGetHighest() | 查找就绪的最高优先级 |
OS-PrioInsert() | 置位优先级位映射表中对应优先级的位 |
OS_PrioRemove() | 清零优先级位映射表中对应优先级的位 |
1.2 就绪任务列表
struct os_rdy_list {
OS_TCB *HeadPtr; /* 当前优先级下,第一个就绪任务指针 */
OS_TCB *TailPtr; /* 最后一个就绪任务指针 */
OS_OBJ_QTY NbrEntries; /* 对应优先级下就绪任务的数量 */
};
就绪表操作函数
函数 | 说明 |
---|---|
OS_RdyListInit() | 初始化并清空就绪表 |
OS_RdyListInsert() | 在就绪表中插入一个任务控制块TCB |
OS_RdyListInsertHead() | 在就绪表头部插入一个任务控制块TCB |
OS_RdyListInsertTail() | 在就绪表尾部插入一个任务控制块TCB |
OS_RdyListMoveHeadToTail() | 将一个任务控制块TCB从链表头部移动到尾部 |
OS_RdyListRemove() | 将任务控制块从就绪表中删除 |
1.2.1 向就绪任务列表中增加任务
程序可以同过系统提供的多个服务将任务加入到就绪任务列表中。最常见的服务时创建任务OSTaskCreate(),该操作将创建一个就绪的任务并加入到就绪任务列表中,下图表示在已有优先级的就绪任务列表中新创建一个与其优先级相同的任务,并将该任务插入就绪任务列表中
如果一个任务进入就绪态时和当前正在运行的任务是同一任务优先级下,那么进入就绪态的任务就会被插入到相应优先级就绪任务列表的尾部,然而如果进入就绪的任务和当前正在运行的任务的优先级不一样,那么就绪态的任务将会被插入到相应优先级就绪任务列表的头部。