linux内核驱动之中断及时间和并发处理

本文发布时间: 2019-Mar-22
中断申请和释放中断接口<linux/interrupt.h>, 实现中断注册接口:int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *dev_name, void *dev_id);void free_irq(unsigned int irq, void *dev_id);申请中断接口参数unsigned int irq 请求的中断号irqreturn_t (*handler) 安装的处理函数指针.unsigned long flags 一个与中断管理相关的选项的位掩码const char *dev_name 这个传递给request_irq 的字串用在/proc/interrupts 来显示中断的拥有者void *dev_id 用作共享中断线的指针. 它是一个独特的标识, 用在当释放中断线时以及可能还被驱动用来指向它自己的私有数据区,如果中断没有被共享, dev_id 可以设置为NULL时间系统心跳unsigned long 类型的Jiffies 和jiffies_64 只读#include <linux/jiffies.h>32-位 平台上当HZ 是1000 时, 计数器只是每50 天溢出一次, 必要时你的代码应当准备处理这个事件驱动常用延时函数当一个设备驱动需要处理它的硬件的反应时间, 涉及到的延时常常是最多几个毫秒相关函数:#include <linux/delay.h>void ndelay(unsigned long nsecs);void udelay(unsigned long usecs);void mdelay(unsigned long msecs);驱动常用延时函数休眠相关函数:#include <linux/delay.h>void msleep(unsigned long msecs);void ssleep(unsigned long msecs);定时器timer.h初始化定时器init_timer注意全局结构中三个成员要初始化,分别是:expiresfunctiondata定时器开始add_timer删除定时器del_timer并发信号量信号量semaphore.h互斥信号量void init_MUTEX(struct semaphore* sem)#define init_MUTEX(sem) sema_init(sem, 1)down up信号量分别代码锁定和解锁衍生接口int down_interruptible (sem);可中断的,如果返回非零值,说明获取锁资源的过程中被中断了。int down_trylock(sem);不等待锁资源,发现没有资源就返回非零值读取者/写入者信号量初始化void init_rwsem(struct rw_semaphore* sem)锁定down_read down_read_trylockdown_write down_write_trylockdowngrade_write解锁up_read up_write自旋锁自旋锁spinlock.h初始化spin_lock_init(spinlock_t* lock)锁定spin_lock解锁spin_unlock自旋的危害:spin_lock之后进入自旋状态,不可中断,一直自旋,极易导致死锁。自旋锁提供大量合理的衍生函数spin_lock_irqsavespin_unlock_irqrestorespin_lock_irqspin_unlock_irqspin_trylock原子变量原子变量atomic.h保护的对象是一个简单的变量初始化:atomic_t v = ATOMIC_INIT(0)锁定:atomic_add解锁:atomic_sub原子变量位操作bitops.htest_and_set_bittest_and_clear_bit假定某位为锁,0为空闲,1为busy。优点:简单,实用,无副作用,无需初始化。


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:11pm
栏目列表