SylixOS 位图操作
来源:互联网 发布:物联网云平台源码 编辑:程序博客网 时间:2024/05/16 02:42
位图操作
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 位图操作
- 位图操作
- BMP位图操作
- BMP位图操作c++
- 位图操作全攻略
- CBitmap位图操作
- Brew对位图操作
- Symbian 位图操作简介
- 【MFC】位图操作
- 整理: 位图操作
- 位图操作集合
- Bitmap 位图操作
- 位图操作函数WIDTHBYTES
- Android位图操作
- 位图的光栅操作
- Android位图操作
- OpenGL位图操作
- 位图操作WIDTHBYTES
- 首届中国城市轨道交通科技创新创业大赛-清华站今日正式启动!
- 独家 | 给初级数据科学家的8点建议(附学习资源)
- 只有程序员看的懂面试圣经|如何拿下编程面试
- DUBBO与ZOOKEEPER、SPRINGMVC整合和使用
- 为什么 Java中1000==1000为false而100==100为true?AND "2+2=5"?
- SylixOS 位图操作
- 如何培养一个人敏锐的判断力
- leetcode 48. Rotate Image
- 获取maven web项目的资源路径
- mybatis_解决字段名与实体类属性名不相同的冲突
- ajax的简单应用
- Android Studio 3.0输入法问题解决方案
- PAT乙级题1015.德才论
- SpringMVC入门及系列教程(五)-响应处理&响应参数处理&SpringMVC作用域对象&SpringMVC原生Servlet对象