多层位图查表法

发布者:恬淡如云最新更新时间:2015-05-05 来源: 51hei关键字:多层位图  查表法  操作系统 手机看文章 扫描二维码
随时随地手机看文章
在嵌入式操作系统中,特别是实时操作系统中经常采用位图法解决任务的就绪以及查找最高优先级的快速方法,即通过对所有的可能性采用查表的形式即可实现对于uC/OS-II这种64( 2^8)个优先级任务的小系统,可以通过求取x,y,得到对应的最高优先级值,而且在查表的过程中,只有256种可能性,通过简单的查表就能快速的实现,但是当任务的优先级数大于64个时,那又该如何让实现呢?因为此时的查表不在那么容易,比存在16个bit时,2^16=65536,也就是存在65536种可能性,这个数据表格太大因此不是我们考虑的形式,那么如何确定呢,此时采用分层的形式就能比较快速的实现,在64个任务时首先可以采用一个就绪表每一个bit代表一个任务优先级,另外准备一个标志变量,每一个bit表示具体的某一个组,每一组八个数据,通过这种x,y的形式能够快速的实现查找。当任务对于64个时,我们可以尝试多增加一维z的形式表示不同的任务,也就是实现分层,一共分成了三层,这样就能通过这种多层的形式,通过同一个查询表(256种可能性)的使用而快速的确定x,y,z,进而得到最高的优先级号。这种三层的形式最多能够支持512个优先级号的操作系统。当多于这种情况时,就需要再次增加层数。

具体的实现如下:

z的每一个bit对应着1个y。也就是一共对应8个y。

y的每一个bit对应着一个x,也就是一共对应着8*8个x。

每一个x刚好也就对应着8个任务优先级号。这样就能够通过x,y,z设置优先级。

因此可以采用下面的形式定义一个结构体:

 

    #ifndef __HIGH_BITMAP_H_H__
    #define __HIGH_BITMAP_H_H__

    #define LENGTH_HIGHLAYER    8
    #define LENGTH_BYTE            8
    typedef unsigned char Byte;


    typedef struct
    {
        Byte high_Layer;
        Byte mid_Layer[LENGTH_HIGHLAYER];
        Byte low_Layer[LENGTH_HIGHLAYER*LENGTH_BYTE];
    }BitMaps;

    #ifdef __cplusplus
    extern "C"
    {
    #endif

    void inital_bitmap(BitMaps *bitmap);
    void set_bitmap(BitMaps *bitmap,int prio);
    int calculate_high_prio(BitMaps *bitmap);

    #ifdef __cplusplus
    }
    #endif

    #endif

基本的操作函数如下:

 

 

    #include"high_bitmap.h"
    #include

    int 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 */        
    };


    void inital_bitmap(BitMaps *bitmap)
    {
        int i = 0;
        if(NULL == bitmap)
        {
            return ;
        }

        bitmap->high_Layer = 0x00;
        for(; i < sizeof(bitmap->mid_Layer); ++ i)
        {
            bitmap->mid_Layer[i] = 0x00;
        }

        for (i = 0; i < sizeof(bitmap->low_Layer); ++ i)
        {
            bitmap->low_Layer[i] = 0x00;
        }
    }

    void set_bitmap(BitMaps *bitmap,int prio)
    {
        int x,y,z;
        if(NULL == bitmap || prio >= 512)
        {
            return ;
        }

        z = (prio >> 6)& 0x7;
        bitmap->high_Layer |= 1<         
        y = (prio >> 3) & 0x7;
        bitmap->mid_Layer[z] |= 1<

        x = prio & 0x7;
        bitmap->low_Layer[z*8+y] |= 1<     }

    int calculate_high_prio(BitMaps *bitmap)
    {
        int x,y,z;

        if(NULL == bitmap)
        {
            return -1;
        }

        z = OSUnMapTbl[bitmap->high_Layer];
        y = OSUnMapTbl[bitmap->mid_Layer[z]];
        x = OSUnMapTbl[bitmap->low_Layer[(z << 3)+y]];

        z = (z << 6) + (y << 3) + x;

        return z;
    }

这种分层的实现方式能够方便的解决位图中多种可能性问题,通过分层可以使得各个变量x,y,z都能过使用查询表(256种可能),解决了超大可能性的问题。当然这种方式也不是唯一的,但是确实是一种可行的方案,共享查询表的。

 

文章查询的思路uC/OS-II中查询的形式相同,也就是当对应的任务需要就绪时,可以通过设置对应的x,y,z对应的bit为1即可。

关键字:多层位图  查表法  操作系统 引用地址:多层位图查表法

上一篇:UCOS-II中OS_CPU_IRQ_ISR移植过程分析
下一篇:计算机中信息的表示与处理

推荐阅读最新更新时间:2024-03-16 14:00

深度观察|留给国产汽车操作系统的窗口期只有三年?
在电动车百人会主办的2022全球新能源与智能汽车供应链创新大会上,全国政协经济委员会副主任、工信部原部长苗圩,呼吁到“操作系统是比芯片更加迫切的供应链问题”。 那今天我们就来聊聊汽车的操作系统这个话题,涉及到下面几个关键问题: ●按照EE架构的演进,汽车里面大大小小的操作系统其实有好几种,能直观看到的是座舱交互的一整套、ADAS&高阶自动驾驶软件系统还有车身系统的OS,以及保留的Zonal控制器和经典的ECU,它们沿着Autosar在往前演进。 ●围绕座舱的操作系统,我们已经看得很清楚,国外的路径可能只有三种:特斯拉、安卓汽车系统AAOS和将来的苹果OS;目前还在孤注一掷自行开发OS只有丰田、现代起亚,大概率后续都会分
[汽车电子]
深度观察|留给国产汽车<font color='red'>操作系统</font>的窗口期只有三年?
百度:7nm昆仑2代AI芯量产,适配多款国产CPU与操作系统
8月18日,百度宣布自主研发的第二代百度昆仑AI芯片——昆仑芯2实现量产。据悉,昆仑芯2采用7nm制程,搭载自研的第二代XPU架构,相比一代性能提升2-3倍,适用云、端、边等多场景,未来将在自动驾驶、智能交通、智能助手等多个场景大显身手。 值得一提的是,昆仑芯AI芯片除了拥有自研XPU架构及多项自主设计,也已与飞腾等多款国产通用处理器、麒麟等多款国产操作系统以及百度自研的飞桨深度学习框架完成了端到端的适配,拥有软硬一体的全栈国产AI能力。 百度昆仑芯片是百度自主研发的云端AI通用芯片。在2018年7月举办的百度AI开发者大会上,百度公司董事长兼CEO李彦宏正式宣布,百度自研AI芯片命名为昆仑,并成立相关业务部门。 百度昆仑1于2
[手机便携]
百度酝酿推手机操作系统 谷歌系或成为主导
  新浪科技讯 7月19日凌晨消息,百度正酝酿推出手机操作系统,具体实施将由新加盟的谷歌系成员主导,此前该项目曾被误传为浏览器的开发。与此同时,另一个百度加速业务扩张的信号是,今年以来,其社会招聘职位数已4倍于过去3年的总和。   百度研发手机操作系统   盛传过多次的百度将推浏览器一事,再度成为7月关注的热点。然而,和之前每次坊间传言的结果一样,这条消息终将让赞成者和反对者空论一场。   来自百度内部的可靠消息透露,百度新确定启动的重头计划是推出手机操作系统,而上述关于浏览器的猜测仅是对此的一种误读。据悉,目前了解百度手机操作系统详细规划的人并不多,现有的情况显示这应是一种开放的操作系统。   此外,有另外的渠道也对新浪
[手机便携]
嵌入式操作系统VxWorks中TFFS文件系统的构建
摘要:目前的嵌入式系统多使用FLASH作为主存,因此,如何有效管理FLASH上的数据非常重要。文章以MX29LV160BT芯片为例,讨论了在VxWorks操作系统下Nor Flash上建立TFFS文件系统的一般步骤,从而为FLASH上的数据管理提供了理想的选择方式,同时也为开发者和用户升级程序提供了方便。 关键词:VxWorks Flash MTD TFFS 文件系统 嵌入式系统正随着Internet的发展而在各个领域得到广泛的应用,作为一个优秀的操作系统,VxWorks实现了比其他实时操作系统更好的有效性、商用性、可裁减性以及互操作性,广泛应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事
[应用]
汽车OS研究:汽车操作系统竞争进入战国时代
一直以来,汽车操作系统纷繁复杂,让人眼花缭乱。 一年前,佐思汽研将“汽车操作系统”分为四类: 1)基础型汽车操作系统:指汽车底层操作系统,如AliOS、QNX、Linux等,包含所有的底层组件,如系统内核、底层驱动等,有的还包含虚拟机。 2)定制型汽车操作系统:指在基础型操作系统之上进行深度定制化开发(包括系统内核修改),最终(Tier1和主机厂一起)实现座舱系统平台或自动驾驶系统平台。百度车载OS,大众VW.OS属于此类。 3)ROM型汽车操作系统:基于安卓(或Linux)进行定制化开发,不涉及系统内核更改。在手机领域最典型的就是小米的MIUI。奔驰、宝马、蔚来、小鹏、车和家等,一般选择开发ROM型操作系统。
[汽车电子]
汽车OS研究:汽车<font color='red'>操作系统</font>竞争进入战国时代
HAL库教程14:查表测量NTC热敏电阻
STM32F4的AD采样的结果是12位的,即采样的最大值为4096。而参考电压是3.3V,所以3.3V与4096是对应的。当然3.3V只是理想状态,实际上可能略有偏差。假设单片机的AD采集引脚电压为x,实际单片机的参考电压为z伏,读取到的AD值与x的对应关系如下:   再分析温度采集电路中,电压值与电阻值的关系。   两个等式联立,可以得出AD与电阻的关系:   程序中可以得到AD值以后计算出电阻值,然后查表,根据电阻值算出温度值。   此处可以做一些优化,既然要查表,那么能否干脆不计算了,把所有的计算工作都放到查表中?   把某个温度下,对应的电阻值带入公式,可以算出这个温度下对应的AD值。我把零下30℃到1
[单片机]
HAL库教程14:<font color='red'>查表</font><font color='red'>法</font>测量NTC热敏电阻
嵌入式与温州动车追尾事故关系的深度剖析
7.23温州动车追尾事故发生至今已将近一个星期,关于此事故发生的原因众多纷纭,但经数日的调查,“雷击停驶说”已被多方证据推翻,那究竟是什么原因导致这次事故的发生,为何如此先进的控制系统这么容易就失效?为何D301没有看到D3115次列车停下而做相应的减速。 笔者了解到动车设计上的各种操作系统与嵌入式技术有很大的关系,其中引起最大争议的信号系统、防灾系统、视频系统、监控系统等就与嵌入式系统有着千丝万缕的关系。 来自 粤嵌教育的嵌入式技术讲师及工程师,通过自己专业的嵌入式技术知识对此事故进行了详细的分析,并给予了专业的回答。以下是针对林工的问答,供大家参考。 “因现在黑匣子还未检测公布,我们也没有确切的证据
[嵌入式]
嵌入式与温州动车追尾事故关系的深度剖析
汽车电子系统越来越依赖于软件安全
汽车电子的软件功能变得越来越强大,因病毒和程序错误造成的风险大增。 随着汽车电子系统越来越多地被连接到外部世界,它们也变得越来越依赖于软件,使汽车制造商面临可靠性和安全性的问题。 利用软件的可伸缩性和成本显然比利用单独的硬件单元更有吸引力,但是,要付出的代价在于:利用更多的软件增加了由“寄宿”在已连接设备上的病毒造成的威胁。此外,更多的软件意味着软件错误也更多,从而导致安全性下降,因为这些软件错误可能被希望掌控汽车电子系统的心怀叵测的团体所利用。 汽车市场现在是非常小的攻击目标,然而,汽车电子行业在2005年收到的报告称,Cabir病毒被用于暴露lexus车载蓝牙使能嵌入式导航系统的弱点。虽然迄今为止病毒的形态
[汽车电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved