SylixOS 位圖操做

位圖操做

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函數位判斷位圖表爲空,即經過直接判斷主位圖掩碼是否爲零來實現。

參考資料

相關文章
相關標籤/搜索