linux驱动中锁的使用
来源:互联网 发布:ubuntu软件源不能更新 编辑:程序博客网 时间:2024/06/03 14:24
一、atomic用法
TP代码中每个判断irq_enable的地方全部换成atomic_cmpxchg,对比和设值一起做完,避免在disable已经判断完毕,但是还没给flag赋值时,被中断打断,再次执行disable,中断函数结束后又执行一次disable,每次执行disable都会对desc->depth++,所以连续加两次。之后enable++一次,无法正常使能中断,TP失效。
#include<linux/atomic.h>
static atomic irq_enabled=ATOMIC_INIT(0);
Void gtp_irq_disable(void)
{
if(atomic_cmpxchg(&irq_enabled,1,0))//比较“1”和irq_enabled的值,如果相等,把“0”赋值给原子变量,返回irq_enabled的值
disable_irq(touch_irq);
}
Void gtp_irq_enable(void)
{
if(atomic_cmpxchg(&irq_enabled,1,0))//比较“1”和irq_enabled的值,如果相等,把“0”赋值给原子变量,返回irq_enabled的值
enable_irq(touch_irq);
}
Void tpd_irq_registration(void)
{
......
atomic_set(&irq_enabled,1);
}
二、spinlock用法
Busy-waiting,锁定临界区小,自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁。(防止被中断打断)
更保险的方法或许是先(保守的)使用 Mutex,然后如果对性能还有进一步的需求,可以尝试使用spin lock进行调优
#include<linux/spinlock.h>
static DEFINE_SPINLOCK(test_lock);
int init_test_lock(void)
{
spin_lock_init(&test_lock);
return 0;
}//在自旋锁使用之前调用,可以写probe里
int test(void)
{
......
......
spin_lock(&test_lock);
XXXXX;
XXXXX;
spin_unlock(&test_lock);
.......
.......
}
三、Mutex的用法
Mutex是sleep-waiting,不会一直等待,进程级别的,进程调用时间较长时使用
#include<linux/mutex.h>
static DEFINE_MUTEX(text_lock);//在mutex中,如果CONFIG_DEBUG_MUTEXES定义了,会自动init
Int test(void)
{
...................
...................
mutex_lock(&test_lock);
XXXXXXXXXXXX;
XXXXXXXXXXXX;
mutex_unlock(&test_lock);
..........
}
代码可直接复制使用,但未经允许,请勿转载
- linux驱动中锁的使用
- Linux USB驱动中URB的使用
- linux设备驱动中ADC的使用
- linux驱动中printk的使用注意事项
- Linux 驱动中工作队列的使用
- linux驱动中使用定时器的设置
- linux驱动中ioctl函数的使用
- linux驱动中使用顺序锁
- Linux驱动中delayed_workqueue使用
- linux驱动中使用定时器
- linux驱动中使用其它模块导出的符号
- linux驱动中使用static关键字的重要性
- 浅谈linux驱动之-驱动的使用
- 重拾linux 驱动 3 ----在驱动中使用映射地址的方式访问硬件
- Android 使用的Linux驱动
- 驱动中ioctl的使用
- Android内核驱动(linux内核驱动)中使用Completion
- 在linux内核驱动树中添加自己的驱动
- springmvc之数据转换
- Pandas学习笔记之列操作
- JDBC与JPA
- 如何编写Maven插件
- c++测试代码时间
- linux驱动中锁的使用
- iOS 打包ipa如何瘦身
- CentOS7.3使用BIND配置DNS服务器(一)
- su incorrect password问题 su无法切换用户问题 以及权限s、t、i、a补充
- ConcurrentHashMap实现原理及源码分析
- Zeppelin 使用JShell实现java解释器,从此用notebook写java
- 基于12槽PCIe扩展坞支持11块PCIE SSD硬盘的了解
- 组合模式
- FlexPaper+SWFTools ,java实现在线文档浏览