以下所有分析基于linux-2.6.11
一、
根据系统是否定义“__ARMEB__”,决定调用下面哪一个宏函数:
#define set_bit(nr,p) ATOMIC_BITOP_LE(set_bit,nr,p)
#define set_bit(nr,p) ATOMIC_BITOP_BE(set_bit,nr,p)
说明:
ARMEB = ARM EABI Big-endian #大端字节序
ARMEL = ARM EABI Little-endian #小端字节序
EABI = Embedded Application Binary Interface
二、
#define ATOMIC_BITOP_LE(name,nr,p) \
(__builtin_constant_p(nr) ? \
____atomic_##name(nr, p) : \
_##name##_le(nr,p))
#define ATOMIC_BITOP_BE(name,nr,p) \
(__builtin_constant_p(nr) ? \
____atomic_##name(nr, p) : \
_##name##_be(nr,p))
根据参数nr是不是常量,调用不同的函数。
如果nr为常量,则调用:
____atomic_set_bit(nr, p);
函数____atomic_set_bit由C语言实现,所以不用考虑大小端的问题
如果nr为常量,则调用:
_set_bit_le(nr,p));
_set_bit_be(nr,p));
函数