找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4076|回复: 0
打印 上一主题 下一主题
收起左侧

UCOS的任务就绪表表算法

[复制链接]
跳转到指定楼层
楼主
ID:82781 发表于 2015-6-13 16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一直在看UCOS,终于今天有所长进,仅仅是一点点,很微不足道的,对于我来说却是很难很难!



操作系统建立任务后任务的优先级便建立了,这个优先级是上下文切换的参照,内核的关键在于擦看当前任务的优先级并总是执行优先级最高的任务,ucos不支持时间片轮转调度,所以内部的任务必须各不相同,也是内核切换的核心,但是内核又是有什么依据来调度任务的呢,ucos里的调度是靠建立任务就绪表作为参照,所以这个任务就绪表是个重点,就绪的任务都在表里,内核只要查表就可以知道哪些任务或者说哪些优先级搞的任务已经准备好了,内核就取出优先级最高的任务开始执行,是怎样做的呢?

首先就绪任务写入就绪表:
      OSRdyGrp  |=OSMapTbl[prio>>3];
    OSRdyTab[prio>>3]  |=OSMapTbl[prio&0x07];
在CORE.C文件中定义
INT8U const DT_XDATA OSMapTbl[]   = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
就构成了写入就绪表算法,
例如:任务优先级=10,则首先计算组=OSMapTbl[prio>>3]=OSMapTbl[10>>3]=OSMapTbl[1]=0x02;
                                                      计算位=OSRdyTab[1] =OSMapTbl[10&0x07]=OSMapTbl[2]=0x04;
                                                       这事位于矩阵上的10个单元置1,他的坐标分别是(4,2)点。就绪表就写入了,
                                                       至此优先级为10的任务完成了优先级的写就绪表。

其次删除就绪表中的就绪任务:
if((OSRdyTab[prio>>3] )&=~OSMapTbl[prio&0x07])==0)
OSRdyGrp&=~OSMapTbl[prio>>3]  ;
例如:任务优先级=10;删除就绪表操作
if(OSRdyTab[1]&=~0x04==0)保证OSRdyTab[1]=0;表示没有任务进入就绪列表才可以执行下面的操作,
OSRdyGrp&=~0x04;
即矩阵的(4,2)点的值变为0;也就清了就绪表

最后是找到优先级最高的任务:
牵扯到另一个数组也在CORE.C中定义为:
INT8U const DT_XDATA OSUnMapTbl[] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};

计算矩阵坐标
y=OSUnMapTbl[OSRdyGrp] ;
x=OSUnMapTbl[OSRdyTab[y]];
prio=(y<<3)+x;
例如:OSRdyGrp=0x06;OSRdyTab[1]=0x03;
y=OSUnMapTbl[OSRdyGrp] =1;
x=OSUnMapTbl[OSRdyTab[1]]=OSUnMapTbl[3]=0;
最高级任务=8+0=8;
表示:在就绪表组=6,表示行1和行2都有任务就绪,单是查表得行优先级最高的是1,所以令Y=1,而在这第一行里又有3个任务就绪了,在在他们里面找到优先级最高的就是第0位,所以X=0,这时候就可以找到优先级最高的点坐标(1,0)其他的都比他低,比他高的没有就绪,所以当让就是娶她的值为8,内核就知道了原来这么多就绪的任务当中就绪的是你小子啊,找出来了!







分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表