码迷,mamicode.com
首页 > 其他好文 > 详细

SylixOS 位图操作

时间:2017-10-30 21:13:35      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:sylixos 位图

位图操作

SyilxOS在进行调度时需要选择运行当前就绪的最高优先级的线程。为了时间确定性以及提高索引速度,SyilxOS提供了一个位图操作库。

技术实现

SylixOS中位图操作库的实现在"libsylixos/SylixOS/kernel/core/_BitmapLib.c"中,主要实现了位图的初始化、在位图中添加、删除标记以及获取最高优先级。其中,初始化位图控制块的函数接口如程序清单 2-1所示。

程序清单 2-1  位图控制块初始化函数

#include <SylixOS.h>
VOID  _BitmapInit (PLW_CLASS_BMAP  pbmap);

函数_BitmapInit原型分析:

  • 此函数无返回;

  • 参数pbmap是位图控制块;


_BitmapInit函数初始化位图控制块的主要操作即将其清零。其中位图控制块的详细信息如程序清单 2-2所示。

程序清单 2-2  位图控制块

typedef struct {
    volatile UINT32       BMAP_uiMap;                                   /*  主位图掩码                  */
    volatile UINT32       BMAP_uiSubMap[(LW_PRIO_LOWEST >> 5) + 1];     /*  辅位图掩码                  */
} LW_CLASS_BMAP;
typedef LW_CLASS_BMAP    *PLW_CLASS_BMAP;

位图控制块辅位图掩码的数组长度为(LW_PRIO_LOWEST >> 5) + 1,其中LW_PRIO_LOWEST为SyilxOS支持的最低优先级255。这意味着辅位图掩码共256 bit,每一位都对应着一个优先级。位图控制块的主位图掩码为32 bit的数据类型,其每一位都与辅位图掩码对应下标的数组成员相对应,即每一位都对应了32个优先级。当辅位图掩码的某个数组成员中至少有一位被置位后,主位图掩码的对应位都将被置位。


添加一个标记到位图表的函数接口如程序清单 2-3所示。

程序清单 2-3  添加标记到位图表

#include <SylixOS.h>
VOID  _BitmapAdd (PLW_CLASS_BMAP  pbmap, UINT8  ucPriority);

函数_BitmapAdd原型分析:

  • 此函数无返回;

  • 参数pbmap是位图控制块;

  • 参数ucPriority是优先级

使用_BitmapAdd函数向位图表添加标记时,先将优先级对应的辅位图掩码的bit置位,再将对应的主位图掩码的bit置位。


从位图表删除一个标记的函数接口如程序清单 2-4所示。

程序清单 2-4  从位图表删除标记

#include <SylixOS.h>
VOID  _BitmapDel (PLW_CLASS_BMAP  pbmap, UINT8  ucPriority);

函数_BitmapDel原型分析:

  • 此函数无返回;

  • 参数pbmap是位图控制块;

  • 参数ucPriority是优先级

使用_BitmapDel函数位从位图表删除标记时,先将优先级对应的辅位图掩码的bit清空,如果此时该优先级所在的数组成员为零,则将对应的主位图掩码的bit清零。


获得位图表中的最高优先级的函数接口如程序清单 2-5所示。

程序清单 2-5  获取位图表中最高优先级

#include <SylixOS.h>
UINT8  _BitmapHigh (PLW_CLASS_BMAP   pbmap);

函数_BitmapHigh原型分析:

  • 此函数成功返回优先级,失败返回0;

  • 参数pbmap是位图控制块;

使用_BitmapHigh函数位从位图表获得最高优先级时,会先查找主位图掩码被置位的最低位,即确定最高优先级所在辅位图掩码数组的下标。接着从定位到的辅位图掩码数组成员中查找被置位的最低位,确定具体的优先级。为了时间确定性和快速索引,在32位数据中查找最低有效位采用了先二分查找,再进行穷举的方法。


判断位图表为空的函数接口如程序清单 2-6所示。

程序清单 2-6  判断位图表为空

#include <SylixOS.h>
BOOL  _BitmapIsEmpty (PLW_CLASS_BMAP  pbmap);

函数_BitmapIsEmpty原型分析:

  • 此函数成功LW_TRUE或者TW_FALSE

  • 参数pbmap是位图控制块;

使用_BitmapHigh函数位判断位图表为空,即通过直接判断主位图掩码是否为零来实现。

参考资料

SylixOS 位图操作

标签:sylixos 位图

原文地址:http://12557713.blog.51cto.com/12547713/1977381

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!