set_bit(nr,p)函数分析

来源:互联网 发布:nba2k17捏脸数据中国人 编辑:程序博客网 时间:2024/06/08 01:14

1.内核代码:
#define set_bit(nr,p)ATOMIC_BITOP_LE(set_bit,nr,p)
#defineATOMIC_BITOP_LE(name,nr,p)\
(__builtin_constant_p(nr) ?\
____atomic_##name(nr, p) :\
_##name##_le(nr,p))
将上面的宏展开为
__builtin_constant_p(nr)?____atomic_set_bit(nr,p):_set_bit_le(nr,p)
nr是常量,该表达式为____atomic_set_bit(nr,p)
2.____atomic_set_bit(nr,p)
static inline void ____atomic_set_bit(unsigned int bit, volatile unsigned long *p)
{
unsigned long flags;
unsigned long mask = 1UL << (bit & 31);
p += bit >> 5;
raw_local_irq_save(flags);
*p |= mask;
raw_local_irq_restore(flags);
}
        在32位机上,参数bit的理想取值为0到31,例如取值为1,就表示对*p的bit[1]进行操作。
   当bit取值大于31时,函数操作的就不是你想要操作的那个变量*p了(通过p += bit>> 5;语句实现),所以在实际的应用中应该要确保bit的取值在合理的范围内。
    *p |= mask;语句实现bit位的置位,如果bit为1,就设置*p的第一位。还有下面两种:
    *p &= ~mask;语句实现bit位的清零。
    *p ^= mask;语句实现bit位的翻转,即*p的bit位为0时被置位,为1时则被清零。
通过分析不难看出,set_bit就是设置某位。

原创粉丝点击