标签: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 位图
原文地址:http://12557713.blog.51cto.com/12547713/1977381