//将addr的第nr(nr为0-31)位置值置为1;
//nr大于31时,把高27的值做为当前地址的偏移,低5位的值为要置为1的位数
extern __inline__ int set_bit(int nr,int * addr)
{
int mask, retval;
addr += nr >> 5; //nr大于31时,把高27的值做为当前地址的偏移,
mask = 1 << (nr & 0x1f); //获取31范围内的值,并把1向左偏移该位数
cli(); //关所有中断
retval = (mask & *addr) != 0; //位置置1
*addr |= mask;
sti(); //开所有中断
return retval; //返回置数值
}
//将addr的第nr(nr为0-31)位置值置为0;
//nr大于31时,把高27的值做为当前地址的偏移,低5位的值为要置为0的位数;
extern __inline__ int clear_bit(int nr, int * addr)
{
int mask, retval;
addr += nr >> 5;
mask = 1 << (nr & 0x1f);
cli();
retval = (mask & *addr) != 0;
*addr &= ~mask;
sti();
return retval;
}
//判断addr的第nr(nr为0-31)位置的值是否为1;
//nr大于31时,把高27的值做为当前地址的偏移,低5位的值为要判断的位数;
extern __inline__ int test_bit(int nr, int * addr)
{
int mask;
addr += nr >> 5;
mask = 1 << (nr & 0x1f);
return ((mask & *addr) != 0);
}
test_bit、set_bit和clear_bit
猜你喜欢
转载自blog.csdn.net/u013377887/article/details/107810300
今日推荐
周排行