uC/OS-II 就绪表解疑
来源:互联网 发布:mjpeg转换为rgb的算法 编辑:程序博客网 时间:2024/05/16 11:30
看书上的就绪表不太明白,这一篇讲的很明白
就绪是什么呢?它就是一切准备就绪了,准备运行了。任务一旦建立,它就会进入了就绪态(task ready),准备运行了。任务的建立可以是在多任务运行开始之前,也可以动态地由一个运行着的任务建立。
那么,如果有多个任务就绪,那怎么办呢?这就牵涉到了就绪表的问题了。就绪表(ready list)在存放就绪任务的。就绪表中有两个变量,OSRdyGrp和OSRdyTbl[]。因为任务最多一般只能是64个,JeanJ.Labrosse就把就绪表分成8*8的一个矩阵形表(table),这样就刚好能存放64个就绪的任务了。下面表格里面的数字代表优先级。那么,OSRdyGrp和OSRdyTbl[]又代表什么呢?
见上图,作者见任务太多,就按优先级将它分成了八组,每一行作为一组,每组八个任务,(也即按Y坐标分组)。而OSRdyGrp是一个有八位二进制数的数,它的每一位代表一个组。比如:OSRdyGrp的第0位代表了第一行0到7这八个优先级。第一位代表了8到15这八个优先级,以此类推。只要哪一组中的任何一位置位(即哪一组中有任何一个任务进入就绪表),那么OSRdyGrp相应的位就置1。比如:第一行中优先级0到7,只要有一个任务进入就绪表,那么OSRdyGrp的第0位就会置1(有更多任务进入就绪表也会置1),表示这一行中有任务进入就绪表啦,但是有多少呢?不知道!
那不知道,怎么办呢?这就要看OSRdyTbl[]了。先来介绍一个掩码的知识:ucos里面有一个数组,叫OSMapTbl[],它来帮助我们查一个任务是否进入优先级。
具体如下:
OSMapTbl[]的下标
OSMapTbl[](即位掩码)
0
00000001 01
1
00000010 02
2
00000100 04
3
00001000 10
4
00010000 20
5
00100000 40
6
01000000 00
7
10000000 00
我们来看,一个任务优先级将它化成二进制数,它的低三位与它在哪一组没有任务关系!因为逢八才换组,而低三位最大才是七!但它能决定这个任务在一组的某个地方(即能决定X的值)而它的接下去三位与它在一组中的哪个位置没有任何关系!因为去掉低三位,接下去三位始终是八的倍数,始终指向组的首地址!但它能决定Y的值!这样,在一个矩阵中,X的值和Y的值都决定了,那么这个任务所在的位置就决定了。这样,使一个任务进入就绪状态和脱离就绪状态也就简单了。
其实我们不用这么麻烦,我们看,我们可以把表中的数看成是八进制的数,低三位看成是个位,接下来三位看成是进位,进位代表OSRdyGrp,个位代表OSRdyTbl[],个位无论怎么变,它都不会影响进位的位置,所以在哪一行只取决于OSRdyGrp,在哪一列只取决于OSRdyTbl[],口算也算出来了,呵呵。这样比较好理解一些。
这里可能大家有疑问:那不只取了优先级的六位吗?还有两位呢?这个不用着急,还有两位为零!因为最大才63,只需要用到六位,如果最高两位有任何1位为一的话,就会出错。所以我们就不用管最高两位了。
使任务进入就绪状态的程序为:
OSRdyGrp |= OSMapTbl[prio>>3];//确定它的行,置1
OSRdyTbl[prio>>3] |=OSMapTbl[prio&0x07];//确定它的列,置1
找出进入就绪态的俦优先级最高的任务
明白了上面的内容,这里也不难明白了。这里作者Jean J.Labrosse提供了一个查找表的,只要按照一定算法查找,很快就查出来了。
代码为:y = OSUnMapTbl[OSRdyGrp];
x= OSUnMapTbl[OSRdyTbl[y]];
prio = y<<3 +x;
这个表为:INT8U const OSUnMapTbl[] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x00 to 0x0F */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x10 to 0x1F */
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x20 to 0x2F */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x30 to 0x3F */
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x40 to 0x4F */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x50 to 0x5F */
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x60 to 0x6F */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x70 to 0x7F */
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x80 to 0x8F */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x90 to 0x9F */
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xA0 to 0xAF */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xB0 to 0xBF */
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xC0 to 0xCF */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xD0 to 0xDF */
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xE0 to 0xEF */
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* 0xF0 to 0xFF */
};
- uC/OS-II 就绪表解疑
- uC/OS-II就绪任务的管理
- uc/os-ii的最高级就绪表
- uC/OS-II就绪任务的管理
- uC/OS II任务就绪表
- uc/os-ii任务就绪表
- UC/OS-II任务就绪表的理解
- uC/OS-II任务就绪表及任务调度
- UC/OS II 任务管理(2)之就绪表和就绪组
- uC/OS-II如何使任务在就绪表中进入就绪态与退出就绪态
- uC/OS-II如何使任务在就绪表中进入就绪态与退出就绪态
- uC/OS-II如何使任务在就绪表中进入就绪态与退出就绪态(转载)
- uC/OS-II学习笔记(2012.12.11)任务就绪表
- uC/OS-II学习笔记(2012.12.11)任务就绪表之如何理解OSUnMapTbl[]
- uC/OS-II学习笔记(2012.12.12)任务就绪表和桶式排序
- uC/OS-II 学习笔记之:任务就绪表-举例详解!
- uC/OS-II学习笔记—空闲链表和就绪链表
- 对uC/OS-II查找最高优先级就绪任务算法的理解
- android ActivityManagerService 源码分析----Activity管理(二)
- 归并排序
- 回京上班第二天
- [VC/MFC]实现程序运行时隐藏窗口 (多种方法,推荐方法2)
- 错误:maximum open cursors exceeded的解决办法
- uC/OS-II 就绪表解疑
- 不用软件给文件夹加密
- 600多家沿河化工公司际遇“生死门”
- Bash shell中的位置参数$#,$*,$@,$0,$1,$2...及特殊参数$?,$-等的含义
- oracle账号过期
- 读卡器应用函数整理 4.将自定义卡号存储到dat文件
- 运用El表达式截取字符串/获取list的长度
- HTML5 tag 大全
- 服务提供者框架(Service Provider Framework)