概述
linux驱动如果多个进程同时访问,会导致不可预料的后果,所以需要一些机制来限制这种情况发生
知识点
- 原子操作
- 信号量和互斥锁
- 非阻塞
原子操作
atomic_dec_and_test函数执行的时候,不会跳转到别的线程运行,所以是安全的
1、定义一个原子变量,并初始化为1
atomic_t v = ATOMIC_INIT(1);
2、原子变量自减1
atomic_dec(&v);
3、原子变量自加1
atomic_inc(&v);
4、读取原子变量的值
atomic_read(&v);
5、原子变量自减1,并与0比较,如果为0则返回true,否则返回false
atomic_dec_and_test(&v);
信号量和互斥锁
static DECLARE_MUTEX(button_lock); //定义互斥锁信号量
//如果无法获取信号量就立即休眠
down_trylock(&button_lock)
//如果无法获取信号量就休眠
down(&button_lock);
//释放信号量
up(&button_lock);
非阻塞
//应用程序中,打开文件时加入O_NONBLOCK属性
fd = open("/dev/buttons", O_RDWR | O_NONBLOCK);
/*
在驱动的open函数,判断文件属性
如果文件有O_NONBLOCK属性,
则使用非阻塞的down_trylock,在读取不到数据或是写入缓冲区已满会马上return,而不会阻塞等待。
*/
if (file->f_flags & O_NONBLOCK)
{
if (down_trylock(&button_lock))
return -EBUSY;
}