一、中断是一个很霸道的角色,可以打断进程的运行,如果中断长时间处理会导致正常运行的进程无法正常运行,因此中断要尽量快速运行,时间尽量短
二、linux内核将中断分成两个部分,中断上半部就是驱动代码中的中断处理函数运行处理速度快的程序,中断下半部运行处理时间慢,负责的程序。当然如果中断处理时间快,可以只实现中断上半部。
三、中断下半部的三种实现方式:
①softirq 软中断:处理比较快,是内核级别的机制,需要修改整个内核源码,不推荐也不常用
②tasklet :内部实现实际调用了softirq,运行在中断上下文,不可执行阻塞性质的函数,例如kmalloc,sleep
③workqueue:工作队列,运行在进程上下文,可以执行阻塞性质的函数。
四、如何调用tasklet
①module_init中初始化tasklet调用 task_init
②在中断上半部中调用tasklet_schudule()放入内核线程中,启动中断下半部
③内核线程等待中断上半部唤醒中断下半部的回调函数,通知给应用程序
④调用tasklet_kill卸载tasklet
五、如何调用workqueue
①module_init中初始化workqueue调用 INIT_WORK
②在中断上半部中调用schudule_work()放入内核线程中,启动中断下半部
③内核线程等待中断上半部唤醒中断下半部的回调函数,通知给应用程序
④调用 卸载workqueue