1.内核中信号量的使用
a.信号量对应的头文件:
<asm/semaphore.h>
b.定义信号量:
struct semaphore sem;
c.初始化信号量:
void sema_init(struct semaphore *sem, int val) // 将信号量sem值设置为val
void init_MUTEX(struct semaphore *sem) // 初始化一下互斥锁,并把sem设置为1
void init_MUTEX_LOCKED(struct semaphore *sem) // 初始化一下互斥锁,并把sem设置为0
DECLARE_MUTEX(name) // 定义一个名字为name的信号量,并初始化为1
DECLARE_MUTEX_LOCKED(name) // 定义一个名字为name的信号量,并初始化为0
d.获取信号量:
void down(struct semaphore *sem) // 该函数将sem减1.如果减1后为非负数时
// 会直接返回;如果为负否则调用者被挂起
void down_interruptible(struct semaphore *sem) // 获取信号量失败时,TASK_INTERRUPTIBLE睡眠
// 返回值:0 -> 实信号唤醒; -EINTR -> 被中断唤醒
void down_killable(struct semaphore *sem) // 获取信号量失败时,TASK_KILLABLE睡眠
e.释放信号量:
void up(struct semaphore *sem) // 把sem的值加1.可唤醒等待该信号的任务
2.内核中自旋锁的使用
a.定义自旋锁:
void spin_lock_init(x) // 该宏用于初始化自旋锁x
b.获取自旋锁:
int spin_lock(x) // 获取锁x.成功则立即返回,否则一直等待
int spin_trylock(x) // 获取锁x.立即返回.返回真-获取成功;返回假-失败
c.释放自旋锁:
void spin_unlock(x) // 与spin_lock()或者spin_trylock成对使用