LINUX教学:Linux中的中断处理方法

LINUX教学:Linux中的中断处理方法,第1张

概述介绍《LINUX教学:Linux中的中断处理方法》开发教程,希望对您有用。

《liNUX教学:linux中的中断处理方法》要点:
本文介绍了liNUX教学:linux中的中断处理方法,希望对您有用。如果有疑问,可以联系我们。

1:中断处理是必要注意的几点

(1)在中断上下文中,不能和用户空间数据交互,也便是不能使用copy_to_user()和copy_from_user().

(2)中断上下文中,不克不及交出cpu(不克不及休眠、不克不及schedule、不克不及被打断).

(3)ISR运行时间尽可能短,越长则系统响应特性越差,为了节省中断运行的时间,所以内核采用上半部门和下半部门的方式来处理中断.

2:中断上下半部的两种办理方案

(1)为什么要分上半部(top half,又叫顶半部,上半部门负责登记和记录中断,并激活下半部,让下半部得以执行)和下半部(bottom half,又叫底半部,下半部门主要负责真正的处理).

(2)下半部处置策略1:tasklet(小任务).

引入tasklet,最主要的是考虑支持SMP,提高SMP多个cpu的利用率;不同的tasklet可以在不同的cpu上运行.但是tasklet属于中断上下文,因此不能被阻塞,不能睡眠,弗成被打断.

(3)下半部处置策略2:workqueue(工作队列).

workqueue的突出特点是下半部会交给worker thead,因此下半部处于进程上下文,可以被重新调剂,可以阻塞,也可以睡眠.workqueue的初始化方式有静态和动态两种.

静态初始化:

挪用宏DECLARE_WORK,初始化一个中断的上半部,然后在中断上半部挪用schedule_work()启动我们的中断下半部

动态初始化

挪用宏 INIT_WORK,然后在中断上半部挪用queue_work()启动我们的中断下半部

简单地说,一般的驱动程序的编写者需要做两个选择. 首先,你是不是需要一个可调度的实体来执行需要推后完成的工作――从根本上来说,有休眠的需要吗?要是有,工作队列就是你的惟一选择. 否则最好用tasklet.要是必需专注于性能的提高,那么就考虑softirq.

3:中断上下半部处置原则

(1)必须立即进行紧急处理的极少量任务放入在中断的顶半部中,此时屏蔽了与本身同类型的中断,由于任务量少,所以可以迅速不受打扰地处理完紧急任务.也就是要把执行时间短,紧急的任务放在上半部.

(2)需要较少时间的中等数量的急迫任务放在tasklet中.此时不会屏蔽任何中断(包含与自己的顶半部同类型的中断),所以不影响顶半部对紧急事务的处理;同时又不会进行用户进程调度,从而保证了自己急迫任务得以迅速完成.也就是说,我们在上半部调用task_schedule去唤醒我们的下半部时,下半部并不是马上被执行,系统会根据此时的cpu的使用情况,来选择下半部是马上被执行还是延时一段时间执行,假设在延时期间产生了一个上半部的中断,那么上半部就可以被先执行.

(3)必要较多时间且并不急迫(允许被 *** 作系统剥夺运行权,也就是可以被调用)的大量任务放在workqueue中.此时 *** 作系统会尽量快速处理完这个任务,但如果任务量太大,期间 *** 作系统也会有机会调度别的用户进程运行,从而保证不会因为这个任务必要运行时间将其它用户进程无法进行.

(4)可能引起睡眠的任务放在workqueue中.因为在workqueue中睡眠是平安的.在需要获得大量的内存时、在需要获取信号量时,在需要执行阻塞式的I/O *** 作时,用workqueue很合适.

本文永远更新链接地址

内存溢出PHP培训学院每天发布《liNUX教学:linux中的中断处理方法》等实战技能,PHP、MysqL、liNUX、APP、Js,CSS全面培养人才。

总结

以上是内存溢出为你收集整理的LINUX教学:Linux中的中断处理方法全部内容,希望文章能够帮你解决LINUX教学:Linux中的中断处理方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1042074.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存