Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1121181
  • 博文数量: 141
  • 博客积分: 2853
  • 博客等级: 少校
  • 技术积分: 2266
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-04 12:03
文章分类

全部博文(141)

文章存档

2014年(3)

2013年(12)

2012年(126)

分类: 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)会立即返回一个非零值。

阅读(1708) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~