您的位置:首页 > 运维架构 > Linux

test_bit、set_bit和clear_bit

2015-10-24 02:01 1426 查看
//将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);  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux驱动