uC/OS-II学习笔记(2012.12.11)任务就绪表之如何理解OSUnMapTbl[]
来源:互联网 发布:阿里云 linux 编辑:程序博客网 时间:2024/05/18 17:04
uC/OS-II学习笔记(2012.12.11)任务就绪表之如何理解OSUnMapTbl[]
1).查OSUnMapTbl[]表,由就绪表找出优先级最高的任务:
y = OSUnMapTbl[OSRdyGrp ];
x = OSUnMapTbl[ OSRdyTbl[y] ];
Prio = y<<3+x;
我们知道,在查找最高级就绪任务时,如果使用编写一个循环程序在就绪表中进行查找的方法。有2个缺点:一是耗时,二是运算时间不可预测--这可是犯了实时系统的大忌.赫赫。
所以Jean J.Labrosse 在设计的时候设置了这样一个数组,在查找最高级就绪任务时,只要以变量OSRdyGrp为下标,就可直接在数组OSUnMapTbl[]得到就绪任务的y值了;
这里,OSUnMapTbl[]是uC/OS-II为提高查找速度定义的一个数组,它共有256个元素(256这么来的:以变量OSRdyGrp为数组的下标,而OSRdyGrp是个8位二进制数,值域是2^8=256),其定义如下:
INT8U const 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
};
由于在使用数组OSUnMapTbl[]时是以OSRdyGrp为下标的因此这个数组一共有256个元素。也就是说,无论OSRdyGrp是多少,在数组OSUnMapTbl[]中总能找到对应的元素值,而且这个元素值就是最高级就绪任务优先级别的y。因为数组OSUnMapTbl[]各个元素的值是基于这样一个思想来设置的:表示任务组的变量OSRdyGrp是一个8位二进制数,从这个数的最低位向高位查找,碰到的第一个为1的位所对应的就绪任务足一定是最高优先级别任务所在的组,所以它的组号一定是最高优先级别就绪任务的级别(6位数)的高3位。例如:OSRdyGrp中第一个为1的位为D3,那么最高优先级别就绪任务级别的高3位一定为011(十进制的3),于是在数组OSUnMapTbl[]德256个元素中,凡是其下标的D3位1,且D2,D1,D0都为0的元素值均定义为3。
同样,这个数组也用来查找最高级就绪任务的x值。当然,这时是以OSRdyTbl[y]为下标来进行查找的。
2).那我们看看这个OSUnMapTbl[] 表是如何建立起来的
假设 OSRdyGrp=0x68 , 即二进制: 01101000
根据低位优先级高,可知OSRdyGrp 中bit3 优先级最高。在OSRdyTbl[3] 中查找,如果OSRdyTbl[3]=0xE4 ,即二进制 1110 0100 ,可知 bit2 优先级最高。 于是乎Prio = 3<<3+2=26
当OSRdyGrp= =0bxxxx xxx1 时,最高优先级在OSRdyTbl[0]中 ,即OSUnMapTbl[OSRdyGrp] = 0
同理
当OSRdyGrp= =0bxxxx xx10 时,最高优先级在OSRdyTbl[1]中 ,即OSUnMapTbl[OSRdyGrp] = 1 , 以此类推
接下来我们画一个表格来总结一下
OSRdyGrp
OSUnMapTbl[OSRdyGrp]
个数
0b xxxx xxx1
0
2^7
0b xxxx xx10
1
2^6
0b xxxx x100
2
2^5
0b xxxx 1000
3
2^4
0b xxx1 0000
4
2^3
0b xx10 0000
5
2^2
0b x100 0000
6
2^1
0b 1000 0000
7
2^0
个数总和为255个 ,另外加上无法计算的OSUnMapTbl [0 ] ,一共256个。
//下面是生成OSUnMapTbl[256]的代码
#include<stdio.h>
voidmain(void)
{
int i,t;
int tab[256]={0};
for(i=0;i<8;i++)
for(t=1;(t<<i)<256;t++) //算法有重复的部分
{
tab[t<<i]=i;
}
}
- uC/OS-II学习笔记(2012.12.11)任务就绪表之如何理解OSUnMapTbl[]
- uC/OS-II学习笔记(2012.12.11)任务就绪表
- uC/OS-II学习笔记(2012.12.12)任务就绪表和桶式排序
- uC/OS-II 学习笔记之:任务就绪表-举例详解!
- uc/os-II之OSUnMapTbl[]简单理解
- UC/OS-II任务就绪表的理解
- UC/OS II 任务管理(2)之就绪表和就绪组
- uC/OS II任务就绪表
- uc/os-ii任务就绪表
- uc/os-iii学习笔记-任务就绪表
- uC/OS-III之任务就绪表学习总结
- UC/OS基础知识之任务就绪表
- uC/OS-II如何使任务在就绪表中进入就绪态与退出就绪态
- uC/OS-II如何使任务在就绪表中进入就绪态与退出就绪态
- uC/OS-II如何使任务在就绪表中进入就绪态与退出就绪态(转载)
- uc/os之任务就绪表操作(一)
- uc/os之任务就绪表操作(二)
- uC/OS-II任务就绪表及任务调度
- 腾讯的一次惨败:搜搜输在哪?
- Codeforces Round #155 (Div. 2)
- 欧拉计划:第21题计算10000以下所有亲和数之和,22题文件中所有名字的得分之和
- insmod: error inserting 'xxx.ko': File exists
- Android系列之Android 命令行手动编译打包详解
- uC/OS-II学习笔记(2012.12.11)任务就绪表之如何理解OSUnMapTbl[]
- Android - LayoutInflater
- 常用的windows快捷键
- 获得与设置系统默认设备主音量音量大小以及静音控制函数
- java处理高并发高负载类网站的优化方法
- 小人物吃金币_android小游戏(2)
- iPhone/android的viewport 解决网页自动缩放的问题
- android搜索框实现
- 最新eclipse中android插件安装下载地址