使用位图标记
#include <stdio.h>
#ifdef CONFIG_64BIT
#define BITS_PER_LONG 64
#else
#define BITS_PER_LONG 32
#endif /* CONFIG_64BIT */
/*
计算在第几个unsigned long数组中的掩码
*/
#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
/*
第@nr个位在unsigned long数组中的下标
*/
#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
#define BITS_PER_BYTE 8
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
/*
表示@nr个位需要几个unsigned long数
*/
#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
/*
定义位图@name[]
使用unsigned long数组表示@bits个位
*/
#define DECLARE_BITMAP(name,bits) \
unsigned long name[BITS_TO_LONGS(bits)]
/*
选择通用函数为例
include/asm-generic/bitops/non-atomic.h
*/
static inline void __set_bit(int nr, volatile unsigned long *addr)
{
unsigned long mask = BIT_MASK(nr);
unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
*p |= mask;
}
static inline