位图操作

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 位图操作相关推荐

  1. HarmonyOS之深入解析图像的位图操作和属性解码

    一.位图操作 ① 应用场景 位图操作就是指对 PixelMap 图像进行相关的操作,比如创建.查询信息.读写像素数据等. ② 位图操作 API 位图操作类 PixelMap 的主要接口: 接口名 描述 ...

  2. 【iOS-Cocos2d游戏开发之二十】精灵的基础知识点总汇(位图操作/贴图更换/重排z轴等)以及利用CCSprite与CCLayerColor制作简单遮盖层!...

    为什么80%的码农都做不了架构师?>>>     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigam ...

  3. matlab 图像上下翻,Matlab图像九宫格基本操作(翻转,镜像等)+位图操作

    Matlab图像九宫格基本操作(翻转,镜像等)+位图操作 Matlab图像九宫格基本操作(翻转,镜像等)+位图操作 这次blog提到的操作对于matlab来说都很基础,而且对于有编程和计算机基础的人来 ...

  4. 模拟redis位图操作bitmap 统计日活跃用户数

    模拟redis位图操作bitmap 统计日活跃用户数 假设一年有100天以上登录过,则为活跃用户 import redis#连接redis r =redis.Redis(host='redis数据库服 ...

  5. MFC之学习位图操作

    1.笔记 1.1位图的概念 位图是一种将显示器的图像数据不经过压缩而直接按位存储的文件格式,位图主要分为设备相关位图(device dependent bitmap,DDB),设备无关位图(devic ...

  6. Visual C++位图操作(1)

    一.BitBlt 将一幅位图从一个设备场景复制到另一个,即复制像素,前面参数为目标,后者为源 case WM_PAINT:hdcClient = BeginPaint (hwnd, &ps) ...

  7. Visual C++位图操作

    一.BitBlt 将一幅位图从一个设备场景复制到另一个,即复制像素,前面参数为目标,后者为源 case WM_PAINT:hdcClient = BeginPaint (hwnd, &ps) ...

  8. android jni bitmap,android – 如何使用JNI位图操作来帮助避免...

    注意:这是一个有点旧的代码.对于最新的,请查看github上的项目页面. JNI / Android.mk LOCAL_PATH := $(call my-dir) #bitmap operation ...

  9. SylixOS中的CPU集合及其操作

    SylixOS中的CPU集合及其操作 SylixOS支持SMP多核模式,在表示CPU集合时(如中断和线程绑定)通过一个位图来表示,操作和SylixOS位图接口类似,但并需要快速查找最低位,所以并不使用 ...

  10. 疯狂位图之——位图实现12GB无重复大整数集排序

    一.主要思想 位图排序的思想就是在内存中申请一块连续的空间作为位图,初始时将位图的每一位都置为0,然后依次读取待排序文件的整数,将整数所在的位设置为1,最后扫描位图,如果某一位为1,则说明这个数存在, ...

最新文章

  1. 转: 浅析Fusion-IO和Intel SSD
  2. 导出到Excel的操作
  3. CentOS安装libpcap
  4. 为什么css设了字体颜色不变,css color设置字体颜色
  5. 【Git】git add -A = git add . + git add -u
  6. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波5 - 分段线性变换 - 灰度级分层
  7. python数据结构3-链表
  8. 如何在“家庭”应用中创建场景?
  9. 罗技g402鼠标宏设置教程
  10. html5的geolocation 定位误差大的解决办法
  11. 【转载】MongoDB 极简实践入门
  12. mysql 右连接(right join)
  13. 数据结构与算法(python) 线性结构:无序列表 Unordered List以及链表
  14. python 循环实现延时_Python延时操作实现方法示例
  15. redis数据同步至另一个redis
  16. 解决因nginx配置导致文件上传失败的问题 The filed file exceeds its maximum permitted size of 1048576 bytes
  17. Axure-9 日历选择制作
  18. JavaScript中常见键盘事件以及BOM中window常用对象
  19. 精彩赏析--优秀作品欣赏
  20. 小程序关联微信视频号

热门文章

  1. 关于JAVA,JS,mysql中的String类方法的对比
  2. 智能车学习日记【三】————车库判别
  3. 这个亦正亦邪的引流玩法,日引千粉,日赚500
  4. Fsm3onehot
  5. reactive 与 ref 的区别
  6. DatenLord前沿技术分享No.23
  7. oracle将奖金和工资相加,工资和年终奖一起发,是应该分别计税再相加,还是直接相加再一起按奖金计税?...
  8. 360护心镜:XSS攻击与前端主动防御解决方案
  9. 用python实现 斐波那契数列。 3种方法
  10. Windows下Linux子系统WSL2安装cuda显卡驱动