μCOS-II中任务就绪表及任务调度的操作以及OSUnMapTbl[]优先级的计算

在整理这个学期老师发的ppt中想起来了这个知识点,感觉很重要,当时也是迷糊了很久才搞懂;
主要写一些任务就绪表的结构和操作,如何通过查找OSUnMapTbl[]找到任务优先级

先了解一下任务调度

多任务操作系统系统的核心工作就是任务调度(Task Scheduling)。
所谓调度,就是通过一个算法在多个任务中确定哪个任务来运行,做这项工作的函数就叫做调度器(Scheduler),英文还有一词叫dispatcher,也是调度器的意思。

μC/OS-Ⅱ进行任务调度的思想是,近似的每时每刻让优先级最高的就绪任务处于运行状态

μC/OS-Ⅱ进行任务调度的依据就是任务就绪表

(!!!!也就是说我们要通过任务就绪表找到处于就绪态的最高优先级的任务!!!)

任务就绪表的结构

1:

每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl[ ]

注意: 两个变量为OSRdyGrp和OSRdyTbl[ ],其中OSRdyGrp为一个数,但是OSRdyTbl[ ]为一个数组!!!!
这里很重要!!! 因为当时我也是卡在了这里,一直以为OSRdyGrp也是一个数组!!!但它是一个数!!!

2:

在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。
注意: OSRdyGrp为有八位的二级制数,一位代表一组,一组有八个任务,当该位置0时,代表该组任务中存在(不一定有几个)进入就绪态的任务

3:

任务进入就绪态时,就绪表OSRdyTbl[ ]中的相应元素的相应位也置位。


例如OSRdyTbl[0]是一个八位的二级制数,该二进制数中每一位代表一个优先级的任务,为1时就代表该任务处于就绪态


在这个网格中0,1,2,3。。。代表优先级,按序排列,对应优先级的就绪任务置1
(!!要注意优先级是从0开始,同时数组也是从0开始)至于为什么强调这一点,后面解释例题的时候可以感受一下

通过例题来了解一下


给了一个任务其优先级别为Prio=30(二进制为00011110)

如果直接填到表中的话,直接就是30/8 判断第几行,然后根据余数置1就好

但是通过二进制来看,任务优先级的低三位用于确定任务在总就绪表OSRdyTbl[]中的所在位。接下去的三位用于确定是在OSRdyTbl[]数组的第几个元素(同时也是确定OSRdyGrp那一位为置1)。
在画红圈的位置上置1

对任务就绪表的操作:

插入任务就绪表中

代码:

OSRdyGrp |= OSMapTbl[prio >>3];
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];

解释一下这个代码: prio 代表优先级
prio >>3的意思是 优先级右移三位,也就是优先级除以8的的值,也就是说,在任务就绪表中OSMapTbl数组中第几个元素,或者说这个任务应该放在第几个任务组中(一个任务组有八个任务),在上一个例子中优先级为30,30>>8=3,也就是说该优先级应该在第三组(注意我们是有第0组的)任务中,所以OSRdyGrp的第三位要置1(OSRdyGrp是有第0位的),置1的方式就是用过代码OSRdyGrp |= OSMapTbl[prio >>3];
可以观察一下OSMapTbl[prio >>3],还是以优先级30为例,OSMapTbl[30>>3]为OSMapTbl[3]=0000 1000,这个数与OSRdyGrp进行或运算,也就是将OSRdyGrp的第三位 置1(OSRdyGrp是有第0位的),意味着该优先级的任务要放在第三组

在对数组OSRdyTbl[]进行操作 ,其实也就是判断该优先级任务在第三组中的哪一个位置
还是以优先级30为例,OSRdyTbl[30 >> 3]=OSRdyTbl[3],即要对第三组任务进行操作,OSRdyTbl[3]代表一个八位的二进制数,每一位代表一个优先级的任务,在这一组任务中要将对应优先级的任务置1,prio & 0x07的意思是,进行相与操作,留下后面三位,类似于prio除以8的余数,以30为例,30&0x07=6,也就是说在第三组任务中的第六个任务要置1,(从0开始数),该操作要通过第二行代码实现

OSMapTbl[30& 0x07]= OSMapTbl[6]=0100 0000,要将OSRdyTbl[3]元素的第六位置1,即OSRdyTbl[3] |= OSMapTbl[6];

注意:所有计数都是从0开始,都是以插入优先级30为例

将任务从就绪表中删除

代码:

if((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) = = 0)
OSRdyGrp &= ~OSMapTbl[prio >> 3];

解释一下这个代码
从就绪表中删除任务,也就是说,要将对应优先级的位置置01,对于OSRdyTbl[]变量的操作,也就是通过对应优先级,找到这个任务属于哪一个组,比如说属于第n组,也就是OSRdyTbl[n]这个变量要改变,我们已经知道这个数组的元素是一个八位的二进制数,找到该优先级在该组任务中处于第几个,比如说处于m个,即要将OSRdyTbl[n]第m位置0

对于OSRdyGrp变量的操作,我们已知OSRdyGrp是一个八位的二进制数,一位代表一组任务,当某一位为1时,即对应的一组任务中有处于就绪态的任务,当我们通过优先级找到任务所处于的组数时,比如说属于第n组,由于我们是删除操作,当n组任务中只有一个任务时,当我们删除操作完成后,即n组任务没有就绪状态的任务,所以OSRdyGrp的第n位为0,反之,如果n组有多个处于就绪态的任务,当我们删除操作执行完后,n组还有其他的就绪态任务,所以,OSRdyGrp的第n位不变,还是1,代表n组还有就绪态任务

再说一下这个代码
prio & 0x07这一步操作是要知道对应优先级处于第n组的第几个任务,也就是说求m,prio >> 3是在求对应优先级处于第几组,也就是求n,
OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]可以变为OSRdyTbl[n] &= ~OSMapTbl[m],对应上面的表,可以知道这一步是将对应位置的任务置0,
if((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) = = 0),在这个语句中判断OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]),是否为全0,也就是说,置0后,该组任务是不是全都为0,如果全0,则该组对应的OSRdyGrp的位置就要置0,如果不是全0,则代表该组任务还有就绪态任务,所以不需要更改OSRdyGrp的值

注意:所有计数都是从0开始

查找就绪表中优先级最高的任务

通过例题来感受一下

例:

已知OSRdyGrp=01101000B(0x68),OSRdyTbl[3]=11100100B(0xE4),找出进入就绪态的优先级最高的任务

通过观察OSRdyGrp=01101000B(0x68),可以知道第3组,第5,6组有就绪态任务;(优先级值越小,优先级越高)。所以最高优先级任务在第三组,也就是说OSRdyGrp从右向左看,第一个为1的位置,就是优先级最高任务所在的组数,观察SRdyTbl[3]=11100100B(0xE4),可以知道,在第三组中从右向左看,第2个,第5,6,7个任务处于就绪态,所以优先级最高的任务,在第2个位置上,所以优先级为3*8+2=26(还是要强调一点:所有计数都是从0开始

代码:

int bitscan(int num){//找到一个八位的二进制数中第一个是1的位置int n,mask;mask=1;for(n=0;n<8;n++){if(num&mask)//如果num和mask相与不为0,即num的第n位为1break;mask=mask<<1;}return n;
}y=bitscan(OSRdyGrp);//y等于OSRdyGrp的第一个为1的位置
x=bitscan(OSRdyTbl[y]);//同理y
prio=(y<<3)+x;
到这里应该知道一点,当寻找优先级最高的任务时,也就是说我们要寻找OSRdyGrp的第一个为1的位置,以及对应的OSRdyTbl[y]中第一个为1的位置(从低位向高位看)

通过OSUnMapTbl[] 数组来查找任务最高优先级


设计思想: OSUnMapTbl[]表中每个元素的值表示该元素的索引值的最低为1位的位置。
例如,第4个元素OSUnMapTbl[4] ,其索引值4的二进制表示为(00000100), 其最低为1的位是第2位,所以OSUnMapTbl[]表的第4个元素值是2。再比如第5个元素,其索引值5的二进制表示为(00000101),其最低为1的位是第0位,所以第5个元素值为0。
优缺点: OSUnMapTb的好处是查找时间确定(以空间换时间),但是要占用256个字节的RAM空间。如果应用系统的内存很宝贵,是否可以直接用代码替OSUnMapTb。

所以当我们寻找一个数的最低为1的位置时可以通过OSUnMapTbl[]来寻找,

还是上面那个例题

第二种方式:

y    = OSUnMapTbl[OSRdyGrp];//找到OSRdyGrp的最低为1的位
x    = OSUnMapTbl[OSRdyTbl[y]];//同理y
prio = (y << 3) + x;

一定要分清!!OSUnMapTbl[]数组只是来查找最低为1的位的一个方式,比如说一个数n,通过OSUnMapTbl[n]=y,所以数n中从右向左第一个为1的位置为y

μCOS-II中的任务就绪表及任务调度相关推荐

  1. UCOSIII---任务就绪表及任务调度和切换

    多任务操作系统的主要工作是为系统中处于就绪状态的任务分配CPU资源,其中涉及的两个关键是:判断哪些任务处于就绪状态.确定哪个任务应该马上得到执行,即任务调度. 任务就绪表 在UCOSIII中,所有已经 ...

  2. uCOS-II系统中的任务就绪表

      多任务操作系统的主要工作是为系统中处于就绪状态的任务分配CPU资源,其中涉及的两个关键是:判断哪些任务处于就绪状态.确定哪个任务应该马上得到执行,即任务调度. 1. 任务就绪表   任务就绪表记录 ...

  3. uC/OS-II如何使任务在就绪表中进入就绪态与退出就绪态

    程序清单:使任务进入就绪态 OSRdyGrp               |= OSMapTbl[prio>>3];                                     ...

  4. linux 内核态 cos函数,浅析μCOS/II v2.85内核OSMboxPend()和OSMboxPost()函数工作原理

    浅析μCOS/II v2.85内核OSMboxPend()和OSMboxPost()函数工作原理 文章来源:http://gliethttp.cublog.cn[转载请声明出处] //-------- ...

  5. [原创].怎样制作一个简单ip,以方便在Quartus II和Nios II中使用?

    概述:此处,我以Lcd12864(ST7920)作为范例,进行粗浅讲解,望各位网友踊跃拍砖.   0 软硬件环境 软件:Altera Quartus II 9.1 + Nios II  9.1 Sof ...

  6. μC/OS Ⅱ之任务就绪表的操作_2012.5.31

    任务的登记: 1 OSRdyGrp |= OSMapTbl[prio>>3]; 2 OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; ...

  7. μC-/OS II(一) PC编译环境的搭建

    这个系列博文是关于对<嵌入式实时操作系统 μC-/OS II>(第二版)的学习笔记 μC-/OS II (一)  PC编译器环境的搭建 1.关于编译器 采用Borland C++ 4.5作 ...

  8. python tcl quartus_TCL脚本在Quartus II中的应用

    本文讨论的话题: -TCL脚本在Quartus II中 -创建一个工程 -编译工程 -查看报告数据 -时序分析 TCL脚本的优势 -顾客分析:只提取你所需要的信息 -自动设置:在GUI界面中节省手动设 ...

  9. [转载].怎样制作一个简单ip,以方便在Quartus II和Nios II中使用?

    1 硬件部分 1.1 Avalon-MM接口(读作:阿窝龙妹妹接口) Avalon Memory-Mapped接口,简称为 Avalon-MM接口,用于在存储映射系统中描述主从元件(component ...

最新文章

  1. 史上最全的正则表达式
  2. 浅谈如何在C#Winform程序中正确使用登录窗体
  3. JavaScript test() 方法
  4. 最近在北京做银行软件项目亲身感受小总结
  5. m1芯片Mac安装pandas库(Rosetta2转译版)
  6. 算法导论( FFT 自动机 最优二叉搜索树 !!!)
  7. HDU 5517---Triple(二维树状数组)
  8. 【机器学习】【计算机视觉】非常全面的图像数据集《Actions》
  9. 如何免费编辑PDF文档?
  10. 搜索引擎提交入口总结
  11. 文件上传4-uploads靶场6-10
  12. 鸿蒙和米家啥区别,魅族家居接入鸿蒙!
  13. php后缀名隐藏,php怎样隐藏后缀名
  14. 【spring事务管理】
  15. 模型复现 | YOLOR入门教程
  16. html图片标签 imag
  17. 【RegNet】《Designing Network Design Spaces》
  18. GMM Kmeans代码示例
  19. 3.1 数据报表之Excel操作模块 XlsxWriter
  20. Linux下CPU使用率过高的排查方法

热门文章

  1. 你需要启用steam社区界面功能以进行购买_Steam新功能正式上线!游戏库更加酷炫,玩家终于能白嫖了?...
  2. 清除无效的隧道适配器
  3. ADI Blackfin DSP处理器-BF533的开发详解66:MP3解码(含源码)
  4. 王爽汇编语言实验8:分析一个奇怪的程序
  5. 十条网站盈利模式分析总结 1
  6. 如何提高固态硬盘读取速度?
  7. HTTP协议 | 一文详解HTTP报文结构
  8. QYFB-02无线风力报警仪 风速报警仪 塔吊门吊建筑使用
  9. 单片机节日彩灯实训报告_《单片机的原理与应用》节日彩灯的设计
  10. layui 表格隐藏id列