51#define OS_BITMAP_MASK 0x1FU
52#define OS_BITMAP_WORD_MASK ~0UL
57 return __builtin_ffsl(~x) - 1;
66 *bitmap |= 1U << (pos & OS_BITMAP_MASK);
75 *bitmap &= ~(1U << (pos & OS_BITMAP_MASK));
91 return LOS_INVALID_BIT_INDEX;
94 return (OS_BITMAP_MASK - CLZ(bitmap));
100 return LOS_INVALID_BIT_INDEX;
108 UINTPTR *p = bitmap + BITMAP_WORD(start);
109 const UINT32 size = start + numsSet;
110 UINT16 bitsToSet = BITMAP_BITS_PER_WORD - (start % BITMAP_BITS_PER_WORD);
111 UINTPTR maskToSet = BITMAP_FIRST_WORD_MASK(start);
113 while (numsSet > bitsToSet) {
115 numsSet -= bitsToSet;
116 bitsToSet = BITMAP_BITS_PER_WORD;
117 maskToSet = OS_BITMAP_WORD_MASK;
121 maskToSet &= BITMAP_LAST_WORD_MASK(size);
128 UINTPTR *p = bitmap + BITMAP_WORD(start);
129 const UINT32 size = start + numsClear;
130 UINT16 bitsToClear = BITMAP_BITS_PER_WORD - (start % BITMAP_BITS_PER_WORD);
131 UINTPTR maskToClear = BITMAP_FIRST_WORD_MASK(start);
133 while (numsClear >= bitsToClear) {
135 numsClear -= bitsToClear;
136 bitsToClear = BITMAP_BITS_PER_WORD;
137 maskToClear = OS_BITMAP_WORD_MASK;
141 maskToClear &= BITMAP_LAST_WORD_MASK(size);
150 for (i = 0; i < BITMAP_NUM_WORDS(numBits); i++) {
151 if (bitmap[i] == OS_BITMAP_WORD_MASK) {
154 bit = i * BITMAP_BITS_PER_WORD +
Ffz(bitmap[i]);
VOID LOS_BitmapSet(UINT32 *bitmap, UINT16 pos)
对状态字的某一标志位进行置1操作
VOID LOS_BitmapClr(UINT32 *bitmap, UINT16 pos)
对状态字的某一标志位进行清0操作
UINT16 LOS_LowBitGet(UINT32 bitmap)
获取参数位图中最低位为1的索引位, 例如: 00110110 返回 1
VOID LOS_BitmapClrNBits(UINTPTR *bitmap, UINT32 start, UINT32 numsClear)
从start位置开始 清除numsSet个bit位置0 ,对状态字的连续标志位进行清0操作
UINT16 LOS_HighBitGet(UINT32 bitmap)
获取参数位图中最高位为1的索引位 例如: 00110110 返回 5
INT32 LOS_BitmapFfz(UINTPTR *bitmap, UINT32 numBits)
从numBits位置开始找到第一个0位
VOID LOS_BitmapSetNBits(UINTPTR *bitmap, UINT32 start, UINT32 numsSet)
从start位置开始设置numsSet个bit位 置1
STATIC INLINE UINT16 Ffz(UINTPTR x)