分类: LINUX
2012-04-15 20:23:06
void init_MUTEX(&lock)初始化一个互斥锁,即他把信号量lock设置为1 void up (&lock) 释放信号量,唤醒等待者 int down_trylock(&lock) 尝试获得信号量lock ,如果能够立刻获得,就获得信号量,并返回为0.否则返回非0.并且它不会导致休眠,可以在中断上下文中使用。在PWM中,当计数值溢出时,就会引发计数中断。所以在这里用这个函数来获得信号。 pwm驱动和led驱动不同,可能涉及到修改频率时钟,所以要加互斥!
信号量
一.信号量的实现 实际的信号量可以通过以下几种方法来声明和初始化 1. 直接创建信号量,通过 sema_init 完成 Void sema_init (struct semaphore *sem , int val); 其中val是赋予信号量的初始值。 2. 也可以用 DECLARE_MUTEX、DECLARE_MUTEX_LOCKED DECLARE_MUTEX(name)、初始化为1 DECLARE_MUTEX_LOCKED(name) 初始化为0 3. 如果互斥体必须在运行时被初始化(例如在动态分配互斥体的情况下)应该使用下面的情况之一。 a) Void init_MUTEX(struct semaphore *sem); b) Void init_MUTEX_LOCKED(struct semaphore *sem); 4. up和down操作 up(struct semaphore *sem); void down(struct semaphore *sem); int down_interruptible(struct semaphore *sem); int down_trylock(struct semaphore *sem); 信号量会让调用者进入休眠状态,down_interruptible(struct semaphore *sem);是可以中断的,使用down_interruptible(struct semaphore *sem)需要格外的小心,如果操作被中断,该函数会返回非零值,而调用者不会拥有该信号量,使用时需要始终检查返回值,并作出相应的响应。而int down_trylock(struct semaphore *sem);永远不会休眠,如果信号量在调用的时候不可获得,down_trylock(struct semaphore *sem)会立即返回一个非零值。