//将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);
}