Chinaunix首页 | 论坛 | 博客
  • 博客访问: 715629
  • 博文数量: 182
  • 博客积分: 2088
  • 博客等级: 大尉
  • 技术积分: 1698
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 15:09
个人简介

.

文章分类

全部博文(182)

文章存档

2016年(1)

2015年(18)

2014年(14)

2013年(20)

2012年(129)

分类: LINUX

2012-06-15 20:27:25

Bit操作的函数提供了安全的读取和修改单bit信息的能力,它们可以对任何内存变量的任意一个bit进行操作,这在设置或者检查某个标志的时候非常有用。 
常用的函数有 
1.set_bit(int nr, volatile void *addr): 
static __inline__ void set_bit(int nr, volatile unsigned long * addr) 
__asm__ __volatile__( LOCK_PREFIX 
"btsl %1,%0" 
:"=m" (ADDR) 
:"Ir" (nr)); 
set_bit(int nr, volatile void *addr)是原子操作,不可恢复对给定地址addr的第nr bit 进行置位;同时值得注意一个变量是nr,它可被定义为一个巨数,而不应该限制在一个single-word的数量级上。(内存bit位是在太大了)。 
2.static __inline__ void __set_bit(int nr, volatile unsigned long * addr) 
__asm__( 
"btsl %1,%0" 
:"=m" (ADDR) 
:"Ir" (nr)); 
它和set_bit(int nr, volatile void *addr)有类似的功能,所不同的是它不是原子操作,此函数可以成功被调用的条件是调用函数和被调函数处于同一个内存段。 
3.static __inline__ void clear_bit(int nr, volatile unsigned long * addr) 
__asm__ __volatile__( LOCK_PREFIX 
"btrl %1,%0" 
:"=m" (ADDR) 
:"Ir" (nr)); 
它是个原子操作因此不可恢复,它的功能是清楚给定地址addr的第nr bit 的值。它在互斥访问的进程中用作锁的作用。 
4.static __inline__ void __clear_bit(int nr, volatile unsigned long * addr) 
它和函数3有类似的功能。就不做解释了 
5.static __inline__ void change_bit(int nr, volatile unsigned long * addr) 
__asm__ __volatile__( LOCK_PREFIX 
"btcl %1,%0" 
:"=m" (ADDR) 
:"Ir" (nr)); 
它的含义是(Toggle a bit in memory)触发内存中给定地址addr的第nr 比特数的变化。它是原子操作不可恢复。 
6.static __inline__ void __change_bit(int nr, volatile unsigned long * addr) 
它和change_bit(int nr, volatile unsigned long * addr)有类似的功能,不过他不是原子操作,可以恢复。 
7.test_and_clear_bit(),清除给定bit并返回它以前的值 
8.__test_and_change_bit 和函数7有类似的功能,不过它不是原子操作,可以恢复 
9.static __inline__ int test_and_set_bit(int nr, volatile unsigned long * addr) 
int oldbit; 

__asm__ __volatile__( LOCK_PREFIX 
"btsl %2,%1\n\tsbbl %0,%0" 
:"=r" (oldbit),"=m" (ADDR) 
:"Ir" (nr) : "memory"); 
return oldbit; 
说明:设置内存中起始位置为addr的第nr个比特位,同时把旧的值赋给oldbit并且返回。它是个原子操作,不可恢复。 
10.static __inline__ int test_and_change_bit(int nr, volatile unsigned long* addr) 
int oldbit; 

__asm__ __volatile__( LOCK_PREFIX 
"btcl %2,%1\n\tsbbl %0,%0" 
:"=r" (oldbit),"=m" (ADDR) 
:"Ir" (nr) : "memory"); 
return oldbit; 
说明:设置内存中起始位置为addr的第nr个比特位,同时把新的值赋给oldbit并且返回。它是个原子操作,不可恢复。 
11.static int test_bit(int nr, const volatile void * addr); 
说明:检测内存中起始位置是addr的第nr个比特位是否被设置过。 
12.find_first_zero_bit 
说明:在内存当中从addr为起始地址,以size为最大的搜索范围寻找第一个是0的比特位,并且返回第一个比特为是0的比特数。 
13.find_first_bit 
说明:在这个函数中有两个变量addr(const unsigned long*)和 size(unsigned) 
其含义是在内存中从addr为起始地址,以size为最大的搜索范围寻找第一个是被置位的比特位,并且返回被置位的的比特数。 
14.find_next_zero_bit 
说明:在这个函数中有三个变量addr(const unsigned long *), size(int), offset(int)。它的功能和find_first_zero_bit函数有些类似,只是它的寻址范围更加灵活, 
其含义是基于addr的内存地址中以offset为起始位置,size为最大的搜索范围寻找第一个是0的比特位,寻址公式address=addr+offset+set; 

15.find_next_bit 
说明:在这个函数中有三个变量addr(const unsigned long *), size(int), offset(int)。它的功能和find_first_bit函数有些类似,只是它的寻址范围更加灵活, 
其含义是基于addr的内存地址中以offset为起始位置,size为最大的搜索范围寻找第一个被置位的比特位,寻址公式address=addr+offset+set  
阅读(1216) | 评论(0) | 转发(0) |
0

上一篇:在子目录中grep

下一篇:GPIO操作

给主人留下些什么吧!~~