linux中断下半部实现机制之tasklet
来源:互联网 发布:ios淘宝历史版本 编辑:程序博客网 时间:2024/04/29 17:51
既可以静态地创建tasklet,也可以动态地创建它。如果静态地创建一个tasklet(直接引用),使用<linux/interrupt.h>中的两个宏:
- #define DECLARE_TASKLET(name, func, data) /
- struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
- #define DECLARE_TASKLET_DISABLED(name, func, data) /
- struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }
这两个宏都能根据给定的名称静态地创建一个tasklet_struct结构。当tasklet被调度以后,给定的函数func会被执行,它的参数由data给出。这两个宏的区别在于引用计数器的初始值设置不同。前一个宏把创建的tasklet的引用计数器设置为0,该taskelet处于激活状态,另一则设为1,所以处于禁止状态。
还可以通过将一个间接引用(一个指针)赋给一个动态创建的tasklet_struct结构的方式来初始化一个tasklet:
- tasklet_init(t,tasklet_handler,dev); /*动态而不是静态创建*/
2.编写自己的tasklet处理程序
tasklet处理器程序必须符合规定的函数类型:
void tasklet_handler(unsigned long data)
因为是靠软中断实现,所以tasklet不能睡眠。这意味着不能在tasklet中使用信号量或者其他阻塞函数。tasklet运行时运行响应中断,如果写的tasklet和中断处理程序之间共享了某些数据的话,所以要做好预防工作(比如屏蔽中断后获取一个锁)。两个相同的tasklet绝不会同时执行。
3.调度自己的tasklet
通过调用tasklet_schedule()函数并传递给该函数相应的tasklet_struct的指针,该tasklet就会被调度以便执行 :
- DECLARE_TASKLET(my_tasklet,my_tasklethandler,dev);
- tasklet_schedule(&my_tasklet); //把my_tasklet标记为挂起
在tasklet被调度以后,只要有机会它就会尽可能早地运行。在它还没有得到运行机会之前,如果有一个相同的tasklet又被唤醒了,那么它只会运行一次。而如果此时它已经开始运行了,比如说在另一个处理器上,那么这个新的tasklet会被重新调度并再次执行,作为优化,一个tasklet总是在调度它的处理器上执行,以更好的利用处理器的高度缓存。
tasklet_disable()函数用来禁止某个指定的tasklet。如果该tasklet当前正在执行,这个函数会等到它执行完毕再返回。
tasklet_disable_nosync()函数也可以用来禁止指定的tasklet,不过它无需在返回前等待tasklet执行完毕。这样做往往不太安全,因为我们无法估计该tasklet是否仍在执行。
调用tasklet_enable()函数可以激活一个tasklet,要激活DECLARE_TASKLET_DISABLED()创建的tasklet,也要调用这个函数。
通过调用tasklet_kill()函数从挂起的队列中去掉一个tasklet。该函数的参数是一个指向某个tasklet的tasklet_struct的长指针。在处理一个经常重新调度它自身的tasklet的时候,从挂起的队列中移去已调度的tasklet会很有用。这个函数首先等待该tasklet执行完毕,然后再将它移去。由于该函数可能会引起休眠,所以禁止在中断上下文中使用它。
- linux中断下半部实现机制之tasklet
- linux中断延迟之tasklet
- linux中断控制之tasklet
- linux中断延迟之tasklet
- 软中断机制之tasklet机制
- 中断下半部机制 - 软中断及tasklet
- linux中断处理中的tasklet机制
- linux软件中断——tasklet机制
- linux软件中断——tasklet机制
- linux中断下半部实现机制之软中断的实现
- linux中断下半部实现机制之软中断
- linux中断处理下文:软中断tasklet机制分析
- linux中断处理下文:软中断tasklet机制分析
- Linux内核学习之中断(3)-tasklet
- linux内核之软中断和tasklet
- linux 中断底半部之tasklet分析
- linux kernel的中断子系统之:tasklet
- linux 中断底半部之tasklet分析
- 让你的 Qt 桌面程序看上去更加 native(四):style sheet
- iOS 类方法 和self
- 《cracking the coding intreview》——链表
- python多线程抓取网页信息
- 让你的 Qt 桌面程序看上去更加 native(三):自定义 style
- linux中断下半部实现机制之tasklet
- 云计算浅谈
- 让你的 Qt 桌面程序看上去更加 native(二):Style
- 让你的 Qt 桌面程序看上去更加 native(一):简介
- 下载安装和使用kdump的经历(二)
- poj 3468
- 长任务下的Swing设计,Thread
- 大数乘法 可调用
- QT 信号和槽