0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ucOSII操作系统就绪表分析

CHANBAEK 来源:博客园-LSWen 作者:博客园-LSWen 2023-02-15 14:56 次阅读

ucOSII的绪表中使用一个很妙的查找方式,下面对其查找过程进行详细分析(目的就是加快查找速度)

对于ucOSII而言,其最大的任务数是64个,因此为了标记其任务的状态,ucOSII使用了八个变量表示每个任务的状态,每个变量每个位对应任务的状态:

如果我们直接去查找就绪任务的最高优先级任务,那我们需要遍历这八个变量,去判断最高位是1,很显然在最坏情况下需要遍历64次,那有没有更好的方法呢,仔细观察发现一个规律,当任务优先级是8的时候,其就绪标志位在OSRdyTbl[1]中的第0位,8对应的二进制是00001000,这样00001正好是1,000正好是0, 我们在看看其他是不是这样,例如7的二进制00000111,00000对应的是0,也就是OSRdy[0],111对应7,也就是第7位,继续验证发现确实所有的优先级都满足这个规律,因此我们可以利用这一点来加快查找速度。 这样我们就有如下结构:

实际上有OSRdyl的下标表示中只有3,4,5三位有效,因为这里只有8组,不过这个无所谓,都是一样的。 为了表示这些组中有没有就绪任务,ucOSII中定义了一个OSRdyGrp这个变量,该变量是一个8位的无符号整型,这样每一位表示每个组有无就绪任务:

这样OSRdyGrp的初始值为0,当有一个任务创建时,那就将该任务所在的组(即OSRdyTbl)对应的OSRdyGrp相应的位设置为1,当有任务删除时,那就将该任务所在的组对应的OSRdyGrp相应的位设置为0,如下:

创建任务(登记):

OSRdyTbl[prio>>3] |= (prio&0x07);

OSRdyGrp |= (prio>>3);

删除任务(注销):

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

OSRdyGrp &= ~(prio>>3);

在ucOSII中为了加快速度,定义了一个数组const UINT8 OSMapTbl[8](说明:这里可以看到OSRdyGrp对其一个变量位操作会通过很多指令完成,但是如果对一个固定的常量进行位操作就减少很多指令)

这样上面的操作就变为了如下操作:

创建任务(登记):

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

OSRdyGrp |= OSMapTbl [(prio>>3)];

删除任务(注销):

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

OSRdyGrp &= ~OSMapTbl [(prio>>3)];

这样就完成了任务创建和删除时对就绪表的操作,在ucOSII中还需要涉及到最高优先级查找,因为当当前运行任务进入阻塞态时,下一个运行任务就应该时最高优先级任务,因此我们必须找到最高优先级的任务,显然,我们需要找到数组中OSRdyTbl的为1的最高位在哪。 最然这个过程很简单,但是我们需要加快查找速度,在ucOSII中定义了一个查找表,这个表可以直接索引到对应的为1的最高位(也就是就绪表中最高优先级),其实这个过程和上面对OSRdyGrp的操作是一个反过程,首先我们要确定哪个组(OSRdyTbl[8])中有就绪任务,那这个如何做呢? 假设此时OSRdyGrp=5(00000101),可以看到最高优先级的组在2组(最高位为2位),现在我们还需要确定组中的哪个位,那又如何确定呢? 上面说过了,需要定义一个查找表,这样我们就从这个方面下手。

首先我们需要完成OSRdyGrp=5映射到2类似这种映射(其实就是找出OSRdyGrp的最高位),其次就是找出OSRdyTb[]中的最高位,有趣的事情出现了,这两个过程其实是同一个过程,都是找一个变量的最高位,因此我们只需要设计一张表就可以完成此工作哦,这个就是ucOSII中查找就绪任务的妙处所在。 好了,下面我们来设计这张表:

再次强调查找表的目的是找到一个变量最高位,比如5的最高位是2,3的最高位是1,1的最高位是0.....

最直接的办法是枚举,你没有看错,就是这么简单粗暴,总共有2的8次方就是256种情况,天啊,这我弄不了,这辈子都弄不了,其实不用你一个一个去枚举,数学家说:不就是找出一个最高位么,简单,log2X就这么easy!,好了,我们就可到了查找表:

UnMapTbl[256]={0,log21,日志22,日志23,日志24,日志25,日志26,日志27......};

通过excel计算得到UnMapTbl[256]={ 0,0,1,2,2,2,3,3,3......};

马上有人开始说了,这不对吧,这个和源码中的不一样,确实,别急,且听我说, 这里由于ucOSII中的优先级是反的,也就是数值越大,其优先级越低,因此,我们不是找到最高位,而是找到最低位,这样查找表就变成了源码中的那样了,也就是

INT8U  const  OSUnMapTbl[256] = {
    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                             */
};

确定最高优先级的过程就是这样:

grp = OSUnMapTbl [OSRdyGrp];

prio = (grp <<3) + OSUnMapTbl [OSRdyTbl [grp] ;

至此,整个ucOSII的就绪表的分析结束了,思想很重要,不要仅仅拘泥据源码。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6293

    浏览量

    121906
  • 变量
    +关注

    关注

    0

    文章

    597

    浏览量

    28115
  • UCOSIII
    +关注

    关注

    2

    文章

    26

    浏览量

    5858
  • 就绪表
    +关注

    关注

    0

    文章

    2

    浏览量

    1440
收藏 人收藏

    评论

    相关推荐

    UCOSII操作系统怎样与周立功GUI的程序结合的

    操作系统的界面用的是周立功的GUI,有GUI的程序,但是弄不清GUI的程序该怎样与UCOSII的程序结合,放在UCOSII的哪里还是单独让UCOSII建立任务调用他?
    发表于 10-20 22:43

    操作系统例程 51ucosii

    操作系统例程51ucosii
    发表于 11-10 16:56

    移植的ucosii操作系统有时候会卡死

    我移植的ucosii操作系统,怎么有时候会卡死? 加了系统的程序2015.3.7.0000调整按键完成会卡死.rar (4.94 MB )
    发表于 04-08 08:01

    熟悉的uCosII实时操作系统

    连云平台都是他们自主开发的,且MQTT协议的sdk包有用java、nodejs等等实现的,连国产的RT-Thread,想要用里面的MQTT组件,都必须用RT-Thread系统才能实现,显得很乱,学习成本特别高。 本项目基于大家目前现有的开发板,利用熟悉的uCosII实时
    发表于 08-03 07:42

    UCOSII嵌入式操作系统的任务调度策略是什么

    其实整个UCOSII嵌入式操作系统的任务调度策略便是如此,现在来进行一个总结:①初始化完毕以后,系统启动,某个任务在执行中时,每隔一定周期发生滴答时钟中断,系统会在中断中遍历整个任务链
    发表于 12-27 06:13

    嵌入式操作系统UCOSII移植笔记

    嵌入式操作系统UCOSII移植笔记记录学习、不断进步、第一次尝试边学习边记录的方式进行学习,总体感觉不错、也算是分享一下自己的学习心得吧!看的是正点原子的教程,用的是精英版开发板,芯片
    发表于 12-27 06:35

    UCOSII操作系统的简介

    前言这是我将UCOSII操作系统移植在STM32单片机上后进行UCOSII操作系统学习的一些笔记与理解,此文最后会附上我自己在UCOSII
    发表于 01-12 06:00

    基于ucosii实时操作系统的RS485通信

    一、实现效果基于ucosii实时操作系统的RS485通信,采用USART + DMA进行收发,二、开发环境开发工具:KEIL V5开发板: STM32f107RC采用方式:USART + DMA
    发表于 02-18 07:35

    32单片机上的uCOSII和FreeRTOS两个实时操作系统有什么区别?

    32单片机上的uCOSII和FreeRTOS两个实时操作系统有什么区别啊,在上班之后一般是用的哪一类实时操作系统比较多啊
    发表于 10-27 08:07

    UCOSII操作系统(英文版)

    UCOSII操作系统(英文版)
    发表于 03-25 14:29 0次下载

    嵌入式实时操作系统ucosii分析

    近年来,在单片机系统中嵌入操作系统已经成为人们越来越关心的一个话题。本文通过对一种源码公开的嵌入式实时操作系统ucos ii的分析,以51系列单片机为例,阐述了在单片机中
    发表于 11-17 11:48 107次下载

    嵌入式实时操作系统uCOSII原理及应用_任哲_编著

    电子发烧友网站提供《嵌入式实时操作系统uCOSII原理及应用_任哲_编著.txt》资料免费下载
    发表于 07-30 15:03 0次下载

    嵌入式实时操作系统ucosII 在奋斗板上的应用

    嵌入式实时操作系统ucosII 在奋斗板上的应用
    发表于 10-26 08:57 13次下载
    嵌入式实时<b class='flag-5'>操作系统</b><b class='flag-5'>ucosII</b> 在奋斗板上的应用

    UCOSII操作系统的一些使用程序详细资料说明

    的时候。..。. 对于当时自己还没学的时候,一直很纳闷什么是操作系统哈,,是什么原因让人们去编写操作系统程序,,到底是为了解决什么问题,而写的操作系统其实最贴近人的例子就是自己的电脑啦,,,和自己的没有
    发表于 05-22 18:01 4次下载
    <b class='flag-5'>UCOSII</b><b class='flag-5'>操作系统</b>的一些使用程序详细资料说明

    ucosII嵌入式实时操作系统实验

    ucosII嵌入式实时操作系统实验(嵌入式开发有中年危机吗)-该文档为ucosII嵌入式实时操作系统实验总结文档,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看…………
    发表于 07-30 17:05 12次下载
    <b class='flag-5'>ucosII</b>嵌入式实时<b class='flag-5'>操作系统</b>实验