微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > UC/OS-II内核调度分析

UC/OS-II内核调度分析

时间:05-07 来源:互联网 点击:

一.内核概述:

多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU的占用时间一般在2到5个百分点之间。

UC/OS-II有一个精巧的内核调度算法,实时内核精小,执行效率高,算法巧妙,代码空间很少。

二.UC/OS-II内核调度特点:

1.只支持基于优先级的抢占式调度算法,不支持时间片轮训;

2.64个优先级,只能创建64个任务,用户只能创建56个任务;

3.每个任务优先级都不相同。

4.不支持优先级逆转;

5.READY队列通过内存映射表实现快速查询。效率非常高;

6.支持时钟节拍;

7.支持信号量,消息队列,事件控制块,事件标志组,消息邮箱任务通讯机制;

8.支持中断嵌套,中断嵌套层数可达255层,中断使用当前任务的堆栈保存上下文;

9.每个任务有自己的堆栈,堆栈大小用户自己设定;

10.支持动态修改任务优先级;

11.任务TCB为静态数组,建立任务只是从中获得一个TCB,不用动态分配,释放内存;

12.任务堆栈为用户静态或者动态创建,在任务创建外完成,任务创建本身不进行动态内存分配;

13.任务的总个数(OS_MAX_TASKS)由用户决定;

14.0优先级最高,63优先级最低;

15.有一个优先级最低的空闲任务,在没有用户任务运行的时候运行.

三.任务控制块OS_TCB描述:

UC/OS-II的TCB数据结构简单,内容容易理解,保存最基本的任务信息,同时还支持裁减来减小内存消耗,TCB是事先根据用户配置,静态分配内存的结构数组,通过优先级序号进行添加,查找,删除等功能。减少动态内存分配和释放。因为依靠优先级进行TCB分配,每个任务必须有自己的优先级,不能和其他任务具有相同的优先级。

typedefstructos_tcb

{

OS_STK*OSTCBStkPtr;

#ifOS_TASK_CREATE_EXT_EN

void*OSTCBExtPtr;

OS_STK*OSTCBStkBottom;

INT32UOSTCBStkSize;

INT16UOSTCBOpt;

INT16UOSTCBId;

#endif

structos_tcb*OSTCBNext;

structos_tcb*OSTCBPrev;

#if(OS_Q_EN(OS_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_EN

OS_EVENT*OSTCBEventPtr;

#endif

#if(OS_Q_EN(OS_MAX_QS>=2))||OS_MBOX_EN

void*OSTCBMsg;

#endif

INT16UOSTCBDly;

INT8UOSTCBStat;

INT8UOSTCBPrio;

INT8UOSTCBX;

INT8UOSTCBY;

INT8UOSTCBBitX;

INT8UOSTCBBitY;

#ifOS_TASK_DEL_EN

BOOLEANOSTCBDelReq;

#endif

}OS_TCB;

.OSTCBStkPtr是指向当前任务栈顶的指针。

.*OSTCBExtPtr;:任务扩展模块使用;

.*OSTCBStkBottom;

.OSTCBStkSize;.

.OSTCBOpt;

.OSTCBId;

.OSTCBNext和.OSTCBPrev用于任务控制块OS_TCBs的双重链接,

.OSTCBEventPtr是指向事件控制块的指针

.OSTCBMsg是指向传给任务的消息的指针。

.OSTCBDly当需要把任务延时若干时钟节拍时要用到这个变量,或者需要把任务挂起一段时间以等待某事件的发生,

.OSTCBStat是任务的状态字。

.OSTCBPrio是任务优先级。

.OSTCBX,.OSTCBY,.OSTCBBitX和.OSTCBBitY用于加速任务进入就绪态的过程或进入等待事件发生状态的过程

OSTCBY=priority>>3;

OSTCBBitY=OSMapTbl[priority>>3];

OSTCBX=priority0x07;

OSTCBBitX=OSMapTbl[priority0x07];

.OSTCBDelReq是一个布尔量,用于表示该任务是否需要删除

四.就绪表(ReadyList):

UC/OS-II采用内存映射的方式来实现READY队列的加入,查找,删除功能,效率非常高。但是也因此只能支持64个任务,每个任务都有自己的优先级,不能和其他任务优先级向同。

每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。就绪表OSRdyTbl[]数组的大小取决于OS_LOWEST_PRIO(见文件OS_CFG.H)。

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

当OSRdyTbl[i]中的任何一位是1时,OSRdyGrp的第i位置1。i从0到7。

使任务进入就绪态

OSRdyGrp|=OSMapTbl[prio>>3];

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

任务优先级

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

网站地图

Top