request_irq()、free_irq(),以及spin_lock_irqsave和spin_lock区别

request_irq()、free_irq()

request_irq()、free_irq()
这是驱动程序申请中断和释放中断的调用。在include/linux/sched.h里声明。
Request_irq()调用的定义:
int request_irq(unsigned int irq,
void (*handler)(int irq, void *dev_id, struct pt_regs *regs),
unsigned long irqflags,
const char * devname,
void *dev_id);
irq是要申请的硬件中断号。在Intel平台,范围0--15。Handler是向系统登记
的中断处理函数。这是一个回调函数,中断发生时,系统调用这个函数,传入的参
数包括硬件中断号,device id,寄存器值。Dev_id就是下面的request_irq时传递
给系统的参数dev_id。Irqflags是中断处理的一些属性。比较重要的有SA_INTERRUPT,
标明中断处理程序是快速处理程序(设置SA_INTERRUPT)还是慢速处理程序(不设置
SA_INTERRUPT)。快速处理程序被调用时屏蔽所有中断。慢速处理程序不屏蔽。还有
一个SA_SHIRQ属性,设置了以后运行多个设备共享中断。Dev_id在中断共享时会用
到。一般设置为这个设备的device结构本身或者NULL。中断处理程序可以用dev_id
找到相应的控制这个中断的设备,或者用irq2dev_map找到中断对应的设备。
Void free_irq(unsigned int irq,void *dev_id);

spin_lock_irqsave和spin_lock区别

如果自旋锁在中断处理函数中被用到,那么在获取该锁之前需要关闭本地中断,spin_lock_irqsave 只是下列动作的一个便利接口:
1 保存本地中断状态
2 关闭本地中断
3 获取自旋锁

解锁时通过 spin_unlock_irqrestore完成释放锁、恢复本地中断到之前的状态等工作

还有一对 spin_lock_irq 和 spin_unlock_irq
如果你确定在获取锁之前本地中断是开启的,那么就不需要保存中断状态,解锁的时候直接将本地中断启用就可以啦 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值