tasklet
来源:互联网 发布:花生壳内网穿透 端口 编辑:程序博客网 时间:2024/04/29 16:04
1 tasklet用途
在中断处理中大量使用tasklet机制;tasklet用于减少硬中断处理的时间,将本来是在硬中断服务程序中完成的任务转化成软中断完成,即是将一些非紧急的任务留到tasklet中完成,而紧急的任务则在硬中断服务程序中完成。
2 注意事项
tasklet始终在中断期间和调度它的CPU上执行;调度一个tasklet只是告诉内核要在之后的某个时间来执行给定的函数。tasklet在“软件中断”上下文中要以原子模式执行,且在遵守以下规则:
* 不允许访问用户空间;
* 不允许访问current指针;
* 不能执行休眠或调度。
3 tasaklet 特征
* 一个tasklet可被禁用或启用;只用启用的次数和禁用的次数相同时,tasklet才会被执行;
* 和定时器类似,tasklet可以注册自己;
* tasklet可被调度在一般优先级或者高优先级上执行,高优先级总会首先执行;
* 如果系统负荷不重,则tasklet会立即得到执行,且始终不会晚于下一个定时器滴答;
* 一个tasklet可以和其他tasklet并发,但对自身来讲必须严格串行处理,即一个tasklet
不会在多个处理器上执行。
4 tasklet 结构
5 tasklet接口
6 示例代码 tasklet.rar
这里并没有在中断中使用tasklet,而是在加载模块时简单地使用它。
7 执行结果
从这里的jiffies值输出可以看出,在调度tasklet之后,tasklet在下一个滴答之前被执行。
在中断处理中大量使用tasklet机制;tasklet用于减少硬中断处理的时间,将本来是在硬中断服务程序中完成的任务转化成软中断完成,即是将一些非紧急的任务留到tasklet中完成,而紧急的任务则在硬中断服务程序中完成。
2 注意事项
tasklet始终在中断期间和调度它的CPU上执行;调度一个tasklet只是告诉内核要在之后的某个时间来执行给定的函数。tasklet在“软件中断”上下文中要以原子模式执行,且在遵守以下规则:
* 不允许访问用户空间;
* 不允许访问current指针;
* 不能执行休眠或调度。
3 tasaklet 特征
* 一个tasklet可被禁用或启用;只用启用的次数和禁用的次数相同时,tasklet才会被执行;
* 和定时器类似,tasklet可以注册自己;
* tasklet可被调度在一般优先级或者高优先级上执行,高优先级总会首先执行;
* 如果系统负荷不重,则tasklet会立即得到执行,且始终不会晚于下一个定时器滴答;
* 一个tasklet可以和其他tasklet并发,但对自身来讲必须严格串行处理,即一个tasklet
不会在多个处理器上执行。
4 tasklet 结构
- #include <linux/interrupt.h>
- struct tasklet_struct
- {
- struct tasklet_struct *next;
- unsigned long state;
- atomic_t count;
- void (*func)(unsigned long); /* 指向要被调度执行的函数 */
- unsigned long data; /* 传递给函数func的参数 */
- };
- void tasklet_init(struct tasklet_struct*t, void (*func)(unsigned long),
- unsigned long data);/* 初始化tasklet,func指向要执行的函数,data为传递给函数func的参数*/
- DECLARE_TASKLET(name,func,data);/*定义及初始化tasklet*/
- DECLARE_TASKLET_DISABLED(name,func,data); /*定义及初始化后禁止该tasklet*/
- void tasklet_disable(struct tasklet_struct*t) /*禁用指定tasklet*/
- void tasklet_disable_nosync(struct tasklet_struct*t) /*禁用指定tasklet,但不会等待任何正在
- 运行的tasklet退出*/
- void tasklet_enable(struct tasklet_struct *t) /*启用先前被禁用的tasklet*/
- void tasklet_schedule(struct tasklet_struct*t) /*调度执行指定的tasklet*/
- void tasklet_hi_schedule(struct tasklet_struct*t) /*调度指定的tasklet以高优先级执行*/
- void tasklet_kill(struct tasklet_struct *t) /*移除指定tasklet*/
这里并没有在中断中使用tasklet,而是在加载模块时简单地使用它。
点击(此处)折叠或打开
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/interrupt.h>
- #include <linux/jiffies.h>
- MODULE_LICENSE("Dual BSD/GPL");
- MODULE_AUTHOR("Kozo");
- static struct tasklet_struct display_tasklet;
- static void display(unsigned long data)
- {
- printk(KERN_DEBUG"before schedule:%d, in running:%d\n",data,jiffies);
- }
- static int __init demo_init(void)
- {
- unsigned long tmp;
- tmp = jiffies;
- tasklet_init(&display_tasklet, display, tmp);
- tasklet_schedule(&display_tasklet);
- return 0;
- }
- static void __exit demo_exit(void)
- {
- printk(KERN_ALERT"Goodbye\n");
- tasklet_kill(&display_tasklet);
- }
- module_init(demo_init);
- module_exit(demo_exit);
从这里的jiffies值输出可以看出,在调度tasklet之后,tasklet在下一个滴答之前被执行。
0 0
- tasklet
- tasklet
- tasklet
- tasklet
- tasklet
- tasklet
- tasklet
- tasklet
- Tasklet
- tasklet
- 使用tasklet
- Tasklet Example
- linux tasklet
- linux tasklet
- 使用tasklet
- tasklet机制
- Tasklet机制
- tasklet使用
- Android学习之 IME<输入法:Input Method Editor>
- Set集合、list集合
- 杂志本来就不是靠海尔吃饭的
- OC- 使用cocoa的NSPredicate查询搜索
- 微信公众平台开发(一) 配置接口
- tasklet
- 点滴:Android源代码 View draw()
- C#入门经典
- 8 个最好的 jQuery 树形 Tree 插件
- 2、配置环境变量
- hdu 3488 Tour(最小费用流orKM算法)
- VisualNet管理对象及能解决的问题
- WinCE6.0平台的Ublox的AGPS功能开发,通过GPSID获取GPS经纬度数据
- UInput使用注意事项