SyilxOS在進行調度時須要選擇運行當前就緒的最高優先級的線程。爲了時間肯定性以及提升索引速度,SyilxOS提供了一個位圖操做庫。數組
SylixOS中位圖操做庫的實如今"libsylixos/SylixOS/kernel/core/_BitmapLib.c"中,主要實現了位圖的初始化、在位圖中添加、刪除標記以及獲取最高優先級。其中,初始化位圖控制塊的函數接口如程序清單 2-1所示。函數
程序清單 2-1 位圖控制塊初始化函數ui
#include <SylixOS.h> VOID _BitmapInit (PLW_CLASS_BMAP pbmap);
函數_BitmapInit原型分析:spa
此函數無返回;線程
參數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個優先級。當輔位圖掩碼的某個數組成員中至少有一位被置位後,主位圖掩碼的對應位都將被置位。it
添加一個標記到位圖表的函數接口如程序清單 2-3所示。io
程序清單 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函數位判斷位圖表爲空,即經過直接判斷主位圖掩碼是否爲零來實現。
無