神来之笔, us/os-II的就绪表
来源:互联网 发布:跳过网络验证 编辑:程序博客网 时间:2024/05/17 17:18
3.0 就绪表(Ready List)
每个任务被赋予不同的优先级等级,从0级到最低优先级OS_LOWEST_PR1O,包括0和OS_LOWEST_PR1O在内(见文件OS_CFG.H)。当μC/OS-Ⅱ初始化的时候,最低优先级OS_LOWEST_PR1O总是被赋给空闲任务idle task。注意,最多任务数目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 使任务进入就绪态 (这两行代码简直是神来之笔啊!!!)
/*
这行代码功能是找到列, 把列上的值置为1
不妨假设prio的值为13, 即优先级为13. prio>>3 右移3位后值为1, 可以查表T3.1找出 OSMapTbl[1] 的值为 0000 0010. 再用 0000 0010 和 OSRdyGrp 进行异或运算
*/
OSRdyGrp |= OSMapTbl[prio >> 3];
/*
*/
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
表 T3.1 OSMapTbl[]的值
Index
Bit Mask (Binary)
0
00000001
1
00000010
2
00000100
3
00001000
4
00010000
5
00100000
6
01000000
7
10000000
读者可以看出,任务优先级的低三位用于确定任务在总就绪表OSRdyTbl[]中的所在位。接下去的三位用于确定是在OSRdyTbl[]数组的第几个元素。OSMapTbl[]是在ROM中的(见文件OS_CORE.C)屏蔽字,用于限制OSRdyTbl[]数组的元素下标在0到7之间,见表3.1
图3.3μC/OS-Ⅱ就绪表
如果一个任务被删除了,则用程序清单3.6中的代码做求反处理。
程序清单 L3.6 从就绪表中删除一个任务
if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)
OSRdyGrp &= ~OSMapTbl[prio >> 3];
以上代码将就绪任务表数组OSRdyTbl[]中相应元素的相应位清零,而对于OSRdyGrp,只有当被删除任务所在任务组中全组任务一个都没有进入就绪态时,才将相应位清零。也就是说OSRdyTbl[prio>>3]所有的位都是零时,OSRdyGrp的相应位才清零。为了找到那个进入就绪态的优先级最高的任务,并不需要从OSRdyTbl[0]开始扫描整个就绪任务表,只需要查另外一张表,即优先级判定表OSUnMapTbl([256])(见文件OS_CORE.C)。OSRdyTbl[]中每个字节的8位代表这一组的8个任务哪些进入就绪态了,低位的优先级高于高位。利用这个字节为下标来查OSUnMapTbl这张表,返回的字节就是该组任务中就绪态任务中优先级最高的那个任务所在的位置。这个返回值在0到7之间。确定进入就绪态的优先级最高的任务是用以下代码完成的,如程序清单L3.7所示。
程序清单 L3.7 找出进入就绪态的优先级最高的任务
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
prio = (y << 3) + x;
- 神来之笔, us/os-II的就绪表
- 神来之笔, us/os-II的就绪表
- uc/os-ii的最高级就绪表
- UC/OS-II任务就绪表的理解
- uC/OS-II就绪任务的管理
- uC/OS-II就绪任务的管理
- uC/OS II任务就绪表
- uc/os-ii任务就绪表
- uCos ii的就绪组和就绪表
- μC/OS-II中的任务就绪表概述
- uC/OS-II任务就绪表及任务调度
- uC/OS-II如何使任务在就绪表中进入就绪态与退出就绪态
- uC/OS-II如何使任务在就绪表中进入就绪态与退出就绪态
- uC/OS-II如何使任务在就绪表中进入就绪态与退出就绪态(转载)
- UC/OS II 任务管理(2)之就绪表和就绪组
- uC/OS-II 就绪表解疑
- us/os ii 学习笔记 20100421 关于os的一点宏观理解
- 理解uC/OS的任务切换和任务就绪表、就绪组
- .net2.0数据绑定语法
- 一点一点学ASP.NET之基础概念——HttpHandler
- 一点一点学ASP.NET之示例——HttpModule 示例
- 进销存第二版开发完成
- 如何用Java去访问WebSphere MQ
- 神来之笔, us/os-II的就绪表
- 几家最好的IT公司面试全揭秘!
- Top 10 New Things You Need to Know About Java 6
- 让PHP跑得更快的6种方式
- How to do research
- 试用Zend 框架编写PHP程序
- 如何进行批量索引重建?
- Java软件开发中几种认识误区
- Hibernate