微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > μC/OS-II的内核结构

μC/OS-II的内核结构

时间:10-08 来源:互联网 点击:

数(OS_MAX_TASKS)是在文件OS_CFG.H中定义的。这个

最多任务数也是μC/OS-Ⅱ分配给用户程序的最多任务控制块OS_TCBs的数目。将

OS_MAX_TASKS的数目设置为用户应用程序实际需要的任务数可以减小RAM的需求量。所有

的任务控制块OS_TCBs都是放在任务控制块列表数组OSTCBTbl[]中的。请注意,μC/OS-Ⅱ

分配给系统任务OS_N_SYS_TASKS若干个任务控制块,见文件μC/OS-Ⅱ.H,供其内部使

用。目前,一个用于空闲任务,另一个用于任务统计(如果OS_TASK_STAT_EN是设为

1的)。在μC/OS-Ⅱ初始化的时候,如图3.2所示,所有任务控制块OS_TCBs被链接成单

向空任务链表。当任务一旦建立,空任务控制块指针OSTCBFreeList指向的任务控制块便

赋给了该任务,然后OSTCBFreeList的值调整为指向下链表中下一个空的任务控制块。一

旦任务被删除,任务控制块就还给空任务链表。

图3.2空任务列表

3.4 就绪表(ReadyList)

每个任务被赋予不同的优先级等级,从0级到最低优先级OS_LOWEST_PR1O,包括0和S_LOWEST_PR1O在内(见文件OS_CFG.H)。当μC/OS-Ⅱ初始化的时候,最低优先级OS_LOWEST_PR1O总是被赋给空闲任务idletask。注意,最多任务数目OS_MAX_TASKS和最低优先级数是没有关系的。用户应用程序可以只有10个任务,而仍然可以有32个优先级的级别(如果用户将最低优先级数设为31的话)。

每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRedyGrp和OSRdyTbl[]。在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。就绪表OSRdyTbl[]数组的大小取决于OS_LOWEST_PR1O(见文件OS_CFG.H)。当用户的应用程序中任务数目比较少时,减少OS_LOWEST_PR1O的值可以降低μC/OS-Ⅱ对RAM(数据空间)的需求量。

为确定下次该哪个优先级的任务运行了,内核调度器总是将OS_LOWEST_PR1O在就绪表中相应字节的相应位置1。OSRdyGrp和OSRdyTbl[]之间的关系见图3.3,是按以下规则给出的:

当OSRdyTbl[0]中的任何一位是1时,OSRdyGrp的第0位置1,

当OSRdyTbl[1]中的任何一位是1时,OSRdyGrp的第1位置1,

当OSRdyTbl[2]中的任何一位是1时,OSRdyGrp的第2位置1,

当OSRdyTbl[3]中的任何一位是1时,OSRdyGrp的第3位置1,

当OSRdyTbl[4]中的任何一位是1时,OSRdyGrp的第4位置1,

当OSRdyTbl[5]中的任何一位是1时,OSRdyGrp的第5位置1,

当OSRdyTbl[6]中的任何一位是1时,OSRdyGrp的第6位置1,

当OSRdyTbl[7]中的任何一位是1时,OSRdyGrp的第7位置1,

程序清单3.5中的代码用于将任务放入就绪表。Prio是任务的优先级。

程序清单L3.5使任务进入就绪态

OSRdyGrp|=OSMapTbl[prio>>3];

OSRdyTbl[prio>>3]|=OSMapTbl[prio0x07];

表T3.1OSMapTbl[]的值

读者可以看出,任务优先级的低三位用于确定任务在总就绪表OSRdyTbl[]中的所在位。接下去的三位用于确定是在OSRdyTbl[]数组的第几个元素。OSMapTbl[]是在ROM中的(见文件OS_CORE.C)屏蔽字,用于限制OSRdyTbl[]数组的元素下标在0到7之间,见表3.1

图3.3μC/OS-Ⅱ就绪表

如果一个任务被删除了,则用程序清单3.6中的代码做求反处理。

程序清单L3.6从就绪表中删除一个任务

if((OSRdyTbl[prio>>3]=~OSMapTbl[prio0x07])==0)

OSRdyGrp=~OSMapTbl[prio>>3];

以上代码将就绪任务表数组OSRdyTbl[]中相应元素的相应位清零,而对于OSRdyGrp,

只有当被删除任务所在任务组中全组任务一个都没有进入就绪态时,才将相应位清零。也

就是说OSRdyTbl[prio>>3]所有的位都是零时,OSRdyGrp的相应位才清零。为了找到那个

进入就绪态的优先级最高的任务,并不需要从OSRdyTbl[0]开始扫描整个就绪任务表,只

需要查另外一张表,即优先级判定表OSUnMapTbl([256])(见文件 OS_CORE.C)。OSRdyTbl[]

中每个字节的8位代表这一组的8个任务哪些进入就绪态了,低位的优先级高于高位。利用

这个字节为下标来查OSUnMapTbl这张表,返回的字节就是该组任务中就绪态任务中优先级

最高的那个任务所在的位置。这个返回值在0到7之间。确定进入就绪态的优先级最高的任

务是用以下代码完成的,如程序清单L3.7所示。

程序清单 L3.7 找出进入就绪态的优先级最高的任务

y=OSUnMapTbl[OSRdyGrp];

x=OSUnMapTbl[OSRdyTbl[y]];

prio=(y3)+x;

例如,如果OSRdyGrp的值为二进制01101000,查OSUnMapTbl[OSRdyGrp]得到的值是

3,它相应于OSRdyGrp中的第3位bit3,这里假设最右边的一位是

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top