Linux中断子系统---中断申请request_irq()与中断线程化request_threaded_irq()

一、申请中断request_irq()

Linux中使用中断需要先进行申请,申请中断的API函数如下:

int request_irq(unsigned int irq,
				irq_handler_t handler,
				unsigned long flags,
				const char *name,
				void *dev)

irq:要申请中断的中断号。
handler:中断处理函数。
name:中断名字,设置以后可以在/proc/interrupts 文件中看到对应的中断名字。
dev: 如果将 flags 设置为 IRQF_SHARED 的话, dev 用来区分不同的中断,一般情况下将dev 设置为设备结构体, dev 会传递给中断处理函数 irq_handler_t 的第二个参数。
flags:中断标志,可以在文件 include/linux/interrupt.h 里面查看所有的中断标志,这里我们介绍几个常用的中断标志。

标志描述
IRQF_SHARED多个设备共享一个中断线,共享的所有中断都必须指定此标志。如果使用共享中断的话, request_irq 函数的 dev 参数就是唯一区分他们的标志
IRQF_ONESHOT单次中断,中断执行一次就结束
IRQF_TRIGGER_NONE无触发
IRQF_TRIGGER_RISING上升沿触发
IRQF_TRIGGER_FALLING下降沿触发
IRQF_TRIGGER_HIGH高电平触发
IRQF_TRIGGER_LOW低电平触发
返回值: 0 中断申请成功,其他负值 中断申请失败,如果返回-EBUSY 的话表示中断已经被申请了。

request_irq()函数可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码段中使用 。
中断申请函数及中断处理函数的实例,可以参考Linux中断子系统—workqueue工作队列
/面朝大海0902/

二、中断线程化request_threaded_irq()

中断线程化的作用与工作队列类似,先在中断处理函数中处理重要紧急的任务,然后使用线程来处理耗时复杂的任务。API函数如下:

request_threaded_irq(unsigned int irq, 
					irq_handler_t handler,
		     		irq_handler_t thread_fn,
		     		unsigned long flags, 
		     		const char *name, 
		     		void *dev);

request_irq() 函数相比request_threaded_irq() 函数仅多了一个入参thread_fn ,thread_fn()为在线程中运行的函数。
/面朝大海0902/

三、中断线程化与工作队列的差异

这里引用韦东山老师的总结:work 来线程化地处理中断,一个 worker 线程只能由一个 CPU 执行,多个中断的 work 都由同一个 worker 线程来处理,在单 CPU 系统中也只能忍着了。但是在 SMP 系统中,多个 CPU 空着,偏偏让多个中断挤在一个 CPU 上进行处理,效率不高。
新技术 threaded irq,为每一个中断都创建一个内核线程;多个中断的内核线程可以分配到多个 CPU上执行,这提高了效率。

四、其他中断相关函数

中断使能与禁止函数:
void enable_irq(unsigned int irq)
void disable_irq(unsigned int irq)
注意事项:disable_irq()函数要等到当前正在执行的中断处理函数执行完才返回,因此使用者需要保证不会产生新的中
断,并且确保所有已经开始执行的中断处理程序已经全部退出。

void disable_irq_nosync(unsigned int irq)
disable_irq_nosync 函数调用以后立即返回,不会等待当前中断处理程序执行完毕。
/面朝大海0902/

使能或禁止系统中断函数:
local_irq_enable()
local_irq_disable()
简单粗暴的使能或禁止系统中断。

local_irq_save(flags)
local_irq_restore(flags)
local_irq_save 函数用于禁止中断,并且将中断状态保存在 flags 中。local_irq_restore 用于恢复中断,将中断到 flags 状态。

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值