新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > μC/OS-II的内核结构

μC/OS-II的内核结构

作者: 时间:2016-10-08 来源:网络 收藏

了任务,栈检验功能报告的栈使用情况将是错误的。如果任务一旦建立就决不会被删除,

而用户初始化时,已将RAM清过零,则OS_TASK_OPT_STK_CLR不需要再定义,这可以节约程

序执行时间。传递了OS_TASK_OPT_STK_CLR将增加TaskCreateExt()函数的执行时间,因为

要将栈空间清零。栈容量越大,清零花的时间越长。最后一个选择项

OS_TASK_OPT_SAVE_FP通知TaskCreateExt(),任务要做浮点运算。如果微处理器有硬件的

浮点协处理器,则所建立的任务在做任务调度切换时,浮点寄存器的内容要保存。

.OSTCBId用于存储任务的识别码。这个变量现在没有使用,留给将来扩展用。

.OSTCBNext 和.OSTCBPrev 用于任务控制块OS_TCBs的双重链接,该链表在时钟节拍函数

OSTimeTick()中使用,用于刷新各个任务的任务延迟变量.OSTCBDly,每个任务的任务控制

块OS_TCB在任务建立的时候被链接到链表中,在任务删除的时候从链表中被删除。双重连

接的链表使得任一成员都能被快速插入或删除。

.OSTCBEventPtr是指向事件控制块的指针,后面的章节中会有所描述(见第6章任务间通

讯与同步)。

.OSTCBMsg是指向传给任务的消息的指针。用法将在后面的章节中提到(见第6章任务间通

讯与同步)。

.OSTCBDly 当需要把任务延时若干时钟节拍时要用到这个变量,或者需要把任务挂起一段

时间以等待某事件的发生,这种等待是有超时限制的。在这种情况下,这个变量保存的是

任务允许等待事件发生的最多时钟节拍数。如果这个变量为0,表示任务不延时,或者表

示等待事件发生的时间没有限制。

.OSTCBStat是任务的状态字。当.OSTCBStat为0,任务进入就绪态。可以给.OSTCBStat赋

其它的值,在文件uCOS_II.H中有关于这个值的描述。

.OSTCBPrio是任务优先级。高优先级任务的.OSTCBPrio值小。也就是说,这个值越小,任

务的优先级越高。

.OSTCBX,.OSTCBY,.OSTCBBitX和.OSTCBBitY 用于加速任务进入就绪态的过程或进入等

待事件发生状态的过程(避免在运行中去计算这些值)。这些值是在任务建立时算好的,

或者是在改变任务优先级时算出的。这些值的算法见程序清单L3.4。

程序清单 L3.4 任务控制块OS_TCB中几个成员的算法

OSTCBY=priority>>3;

OSTCBBitY=OSMapTbl[priority>>3];

OSTCBX=priority0x07;

OSTCBBitX=OSMapTbl[priority0x07];

.OSTCBDelReq是一个布尔量,用于表示该任务是否需要删除,用法将在后面的章节中描述

(见第4章任务管理)

应用程序中可以有的最多任务数(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[]的值



关键词:

评论


相关推荐

技术专区

关闭