μC/OS-Ⅱ之任务控制块、任务就绪表

来源:互联网 发布:linux复制整个文件夹 编辑:程序博客网 时间:2024/06/04 17:47

μC/OS-Ⅱ中任务控制块分为两个部分:

1、 空任务链表

因为此链表中这些控制块还没有与具体任务相关联,所以叫做空任务链表。

大小为μC/OS-Ⅱ.H中定义的OS_MAX_TASKS + OS_N_SYS_TASKS(即用户任务最大数+系统任务总数)个。其初始化由系统初始化函数OSInit()完成。

其头指针为OSTCBFreeList,其为一个OS_TCB类型的数组。

即OS_TCB    OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];

 

2、 任务链表

每当应用程序调用系统函数OSTaskCreate()OSTaskCreateExt()创建一个任务的时候,系统就会将空任务链表头指针OSTCBFreeList 指向的任务控制块分配给该任务。在给任务控制块中的成员赋值后,就将其加入OSTCBList所指向的任务控制链表中,于是,就出现了任务链表。在任务链表中,系统任务(如空闲任务、统计任务)都存放在其优先级最低的地方,其中空闲任务的优先级最低,统计任务(如果有的话)的优先级次低

任务控制块访问优化:

为了加快对任务控制块的访问速度,任务链表为双向链表。同时,设置了一个OS_TCB*类型的指针数组OS_TCBPrioTbl[]。其中以任务的优先级为顺序在各数组元素中存放指向该任务控制块的指针。

 

同样,为了能随时访问正在运行任务的任务控制块,还定义了一个OS_TCB*类型的OSTCBCur,专门用于存放当前正在运行的任务的任务控制块的指针。

 

最后,在讲任务调度之前还需要了解一个概念,就是任务的优先级。

任务的优先级是在任务创建时便定义了的。μC/OS-Ⅱ中prior为0的任务的优先级最高。

那么当定义了一大堆任务的时候,系统怎么样去分辨哪个就绪任务的优先级别最高呢?什么是就绪任务呢?这时候就要提到任务就绪表的概念了。任务就绪表就是系统中的每个任务都在这个表里面占据了一个位置,并用这个位置的状态(1或者0)来表示任务是否处于就绪状态。有了任务就绪表,我们就能很快的知道该时刻哪个就绪任务的优先级别最高。下面具体来了解一下任务就绪表的结构。

μC/OS-Ⅱ定义了一个类型为INT8U类型的数组OSRdyTbl[]来充当这个任务就绪表。该数组中每一个元素分别用于描述8个任务(即一个任务组)的就绪状态。系统又定义了另一个INT8U类型的变量OSRdyGrp,它中间的每一位分别对应于OSRdyTbl[]中的一个元素,用于表示该任务组中是否有任务处于就绪状态。例如OSRdyGrp=1000 0101,则表示OSRdyTbl[7]、OSRdyTbl[2]、OSRdyTbl[0]中又任务处于就绪状态。

那么我们怎么样确定这些处于就绪状态的任务的优先级呢?这时候,我们便要借助一个系统定义好的数组OSUnMapTbl[]来达到这个目的。OSUnMapTbl[]是系统定义的一个INT8U类型的数组,它表示的是一个8bit数据最低位为1的位置是哪一位。

如OSUnMapTbl[1001 0100] = 2;



6a4b57e3491f2df7fc67c&690.png

怎样从任务就绪表中获取最高的就绪任务

y = OSUnMapTbl[OSRdyGrp];                              //获取OSRdyGrp中为1的最低位是第几位

x = OSUnMapTbl[OSRdyTbl[y]];                           //获取该任务组中为1的最低位是第几位

prio = (y << 3) + x;                                                   //prio即为最高优先级













0 0
原创粉丝点击