任务管理之就绪表与就绪租
2015-12-27 19:30
267 查看
任务就绪表
每个任务的就绪态标志放入在就绪表中,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。
在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。
n假设优先级为12的任务进入就绪状态,12=1100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为:
OSRdyGrp |=0x02;
OSRdyTbl[1] |=0x10;
n而优先级为21的任务就绪21=10 101b,则OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为:
OSRdyGrp |=0x04;
OSRdyTbl[2] |=0x20;
n从上面的计算可知:若OSRdyGrp及OSRdyBbl[]的第n位置1,则应该把OSRdyGrp及OSRdyBbl[]的值与2^n 相或。uC/OS中,把2^n的n=0-7的8个值先计算好存在数组OSMapTbl[7]中,也就是:
OSMapTbl[0] = 2^0 = 0x01(0000 0001)
OSMapTbl[1] = 2^1 = 0x02(0000 0010)
……
OSMapTbl[7] = 2^7 = 0x80(1000 0000)
n如果prio是任务的优先级,即任务的标识号,则将任务放入就绪表,即使任务进入就绪态的方法是:
OSRdyGrp |= OSMapTbl[prio>>3];
OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07];
n假设优先级为12——1100b
OSRdyGrp |=0x02;
OSRdyTbl[1] |=0x10;
n将任务就绪表OSRdyTbl[prio>>3]相应元素的相应位清零,而且当OSRdyTbl[prio>>3]中的所有位都为零时,即该任务所在组的所有任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。
if((OSRdyTbl[prio>>3] &=
~OSMapTbl[prio&0x07]) == 0)
OSRdyGrp &= ~OSMapTbl[prio>>3];
根据就绪表确定最高优先级
两个关键:
将优先级数分解为高三位和低三位分别确定;
高优先级有着小的优先级号;
每个任务的就绪态标志放入在就绪表中,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。
在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。
n假设优先级为12的任务进入就绪状态,12=1100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为:
OSRdyGrp |=0x02;
OSRdyTbl[1] |=0x10;
n而优先级为21的任务就绪21=10 101b,则OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为:
OSRdyGrp |=0x04;
OSRdyTbl[2] |=0x20;
n从上面的计算可知:若OSRdyGrp及OSRdyBbl[]的第n位置1,则应该把OSRdyGrp及OSRdyBbl[]的值与2^n 相或。uC/OS中,把2^n的n=0-7的8个值先计算好存在数组OSMapTbl[7]中,也就是:
OSMapTbl[0] = 2^0 = 0x01(0000 0001)
OSMapTbl[1] = 2^1 = 0x02(0000 0010)
……
OSMapTbl[7] = 2^7 = 0x80(1000 0000)
n如果prio是任务的优先级,即任务的标识号,则将任务放入就绪表,即使任务进入就绪态的方法是:
OSRdyGrp |= OSMapTbl[prio>>3];
OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07];
n假设优先级为12——1100b
OSRdyGrp |=0x02;
OSRdyTbl[1] |=0x10;
n将任务就绪表OSRdyTbl[prio>>3]相应元素的相应位清零,而且当OSRdyTbl[prio>>3]中的所有位都为零时,即该任务所在组的所有任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。
if((OSRdyTbl[prio>>3] &=
~OSMapTbl[prio&0x07]) == 0)
OSRdyGrp &= ~OSMapTbl[prio>>3];
根据就绪表确定最高优先级
两个关键:
将优先级数分解为高三位和低三位分别确定;
高优先级有着小的优先级号;
相关文章推荐
- git配置
- [Python标准库]struct——二进制数据结构
- 从Unity引擎过度到Unreal4引擎(最终版)
- Java多线程-并发中的集合详解
- Mysql学习历程(一)
- Jquery easyui开启行编辑模式增删改操作
- Linux常用命令总结(1)
- UIPickerView
- 从大数据的应用谈如何成为大数据大师的历程
- Java多线程中异常的处理UncaughtExceptionHandler
- 面试题32:字符串的排列
- 编程易错点
- 文章标题
- iOS- 极光推送
- 高中数学必修4 之 三角函数
- 负定矩阵
- 程序员常见面试之 数据库 知识点小结(三)
- 如若平淡,挺好:站在听讲人的角度去备课
- Linux-001-nginx index 中文乱码
- FZOJ--2212--Super Mobile Charger(水题)