liunx驱动----信号量的实现
使用信号量必须包含 <asm/semaphore.h> 头文件.其中相关结构体 struct semaphore
可以通过以下几种方式来声明或者初始化。
1.void sema_init(struct semaphore *sem, int val)
代码如下:val为设置信号量的初始值
static inline void sema_init(struct semaphore *sem, int val) { atomic_set(&sem->count, val);//设置型号量的初始值。 sem->sleepers = 0; init_waitqueue_head(&sem->wait); }
2.DECLARE_MUTEX(name)
#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)
将一个信号量初始化为1
3.DECLARE_MUTEX_LOCKED(name)
#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)
将一个信号量初始化为0
注意:1表示信号量打开,可以访问。0表示锁定。
在运行的过程中初始化信号量:
static inline void init_MUTEX(struct semaphore *sem)
static inline void init_MUTEX_LOCKED(struct semaphore *sem)
down函数作用是减小信号量的值。
static inline void down(struct semaphore * sem)//减小信号量的值,在必要的时候一直等待。
static inline int down_interruptible (struct semaphore * sem)//与down效果一样,只是说操作是可以中断的。
static inline int down_trylock(struct semaphore *sem)//函数中没有调用might_sleep(); 所以不会休眠,调用时会立即返回