[笔记分享] [中断] 中断申请释放以及上下半部

1.1 介绍
Linux将中断分为中断上半部和下半部。上半部用来处理紧急的和硬件操作相关的,此时所有当前中断线都被禁止,包括其它CPU。下半部用来处理能够被允许推迟完成的中断处理部分,此时中断是开启的。上下半部之间的界限依情况划分。
而异常和中断不同,必须考虑时钟的同步,也称同步中断,如除0、缺页等。这里我们只讨论异步中断。
1.2 中断注册/释放
1.2.1 注册函数 request_irq()
这里写图片描述
irq:要分配的中断号
handler: 中断处理函数,中断触发时会被调用
flags:处理中断标志,比较常用的是IRQF_DISABLED、IRQF_SHARED,IRQF_ONESHOT这几种,IRQF_ONESHOT后面再解释。IRQF_DISABLED表示进入中断处理程序时禁止任何中断,包括其它CPU,默认只是屏蔽当前对应所有CPU的中断线。IRQF_SHARED表示中断线是共享的,也就是说同一个中断线上会对应多个中断处理程序,在中断处理程序中,通过第5个参数dev来判断到底是哪个发生了中断。。
name:中断名。会被/proc/irq和/proc/interrupt使用。
dev: 中断共享时用到,用来判断是哪个中断触发。

request_irq()会导致睡眠,因为其在注册过程中调用了kmalloc(),而这个函数是会引起睡眠的。因此不能用于中断上下文中或者其他不允许阻塞的地方。
1.2.2 注册函数 request_threaded_irq()
考虑到硬中断占用时间问题以及软中断/tasklet的使用死锁及debug问题,内核又新增了一个带线程处理功能的中断接口。它将不重要的工作放到线程处理函数中作了(有点像work queue不是吗)。在未来,有可能tasklet 会被其替代掉。
接口定义:
这里写图片描述
除了thread_fn,其他的参数和request_irq()中的意义一样。
handler: 中断处理函数,不要可以传NULL。
thread_fn: 中断线程处理函数,不需要可以传NULL。

handler 和 thread_fn 两个可以同时定义,或者只用其中一个。当同时定义时,中断处理函数必须要返回值为IRQ_WAKE_THREAD,thread_fn才能被调用到。thread_fn可以返回IRQ_NONE或者IRQ_HANDLED。
之前有提到一个flag: IRQF_ONESHOT。它表示当中断线程处理函数执行完成以后才开启中断。另外,IRQF_ONESHOT和IRQF_SHARED是不能共用的,因为IRQF_SHARED不能关闭中断。
当中断一直被触发时,中断线程处理函数会得不到运行,因此flag可以加上IRQF_ONESHOT。

1.2.3 释放函数 free_irq()
这里写图片描述
如果中断是共享的,则仅删除dev_id所对应的处理程序,直到最后一个中断被删除的时候才禁用此中断线。
1.2.4 中断处理函数
格式如下:
这里写图片描述
其返回类型为irqreturn_t,有如下三种:
这里写图片描述
当检测到中断正常时返回IRQ_HANDLED,否则返回IRQ_NONE,如果需要wakeup中断线程时,返回IRQ_WAKE_THERAD。
另外,中断处理程序是不用考虑重入的,当一个中断处理程序运行时&#x

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值