工作队列、tasklet、软中断的用法总结

原创 2013年12月10日 15:11:07

下面把API罗列一下,每个函数的解释可参考之前版本的介绍或者之后的实作:

1
2
3
4
5
6
7
8
9
10
11
INIT_WORK(struct work_struct *work, work_func_t func);
INIT_DELAYED_WORK(struct delayed_work *work, work_func_t func);
int schedule_work(struct work_struct *work);
int schedule_delayed_work(struct delayed_work *work, unsigned long delay);
struct workqueue_struct *create_workqueue(const char *name);
int queue_work(struct workqueue_struct *wq, struct work_struct *work);
int queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work, unsigned long delay);
void flush_scheduled_work(void);
void flush_workqueue(struct workqueue_struct *wq);
int cancel_delayed_work(struct delayed_work *work);
void destroy_workqueue(struct workqueue_struct *wq);

其中,1、2、4、7和以前略有区别,其他用法完全一样。



在对实时要求比较高的情况下,我们才会考虑在中断中采用tasklet、软中断;

而在一般的情况下,我们都是采用工作队列的方式来处理中断下半部,我们重点就来探讨一下工作队列的用法。

1.采用cpu自带的工作队列

  1)静态创建工作

#define DECLARE_WORK(n, f)
#define DECLARE_DELAYED_WORK(n, f) n
表示name,f表示func

2)代码执行时动态创建

INIT_WORK(struct work_struct *work, work_func_t func);
INIT_DELAYED_WORK(struct delayed_work *work, work_func_t func);
3)调度工作队列
int schedule_work(struct work_struct *work);
int schedule_delayed_work(struct delayed_work *work, unsigned long delay);


2.自己创建工作队列
1)静态创建工作

#define DECLARE_WORK(n, f)
#define DECLARE_DELAYED_WORK(n, f) n
表示name,f表示func

例子: static void ft5316_work(struct work_struct *work);

static DECLARE_DELAYED_WORK(tp_work,ft5316_work);

2)代码执行时动态创建

INIT_WORK(struct work_struct *work, work_func_t func);
INIT_DELAYED_WORK(struct delayed_work *work, work_func_t func);
3)创建自己的工作队列
static struct workqueue_struct *ft5316_wq; 
ft5316_wq = create_workqueue("ft5316_wq");  

4)调度自己的工作队列
int queue_work(struct workqueue_struct *wq, struct work_struct *work);
int queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work, unsigned long delay);
例子:
queue_delayed_work(ft5316_wq ,&tp_work,msecs_to_jiffies(0));  








Linux内核中的软中断、tasklet和工作队列详解

[TOC] 本文基于Linux2.6.32内核版本。引言软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下...
  • godleading
  • godleading
  • 2016年10月30日 14:26
  • 4987

tasklet 和 工作队列

tasklet 和定时器相关的另一个内核设施是taskled(小任务)机制。中断管理中大量使用了这种机制。 task在很多方面类似内核定时器:它们始终在中断期间运行,始终会在调度它们的同一CPU上运...
  • houxn22
  • houxn22
  • 2015年05月14日 14:27
  • 783

中断下半部-工作队列(比较tasklet和工作队列,推荐)

本文包含那些内容? 工作队列和tasklet的区别;中断上下文;工作队列的使用; 本文适合那些人阅读? 想了解linuxer;学习驱动开发的beginner;学习内核模块编程beginner;其...
  • maochengtao
  • maochengtao
  • 2015年01月10日 17:32
  • 484

【转】软中断/tasklet/工作队列

软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任...
  • zplove003
  • zplove003
  • 2011年11月23日 08:55
  • 425

软中断及tasklet

我们前面在”中断处理”一节提到,在由内核执行的几个任务之间有些不是紧急的的;在必要情况下它们可以廷迟一段时间。回忆一下,一个中断处理程序的几个中断服务...
  • zhw888888
  • zhw888888
  • 2011年07月13日 13:19
  • 2351

softirq(软中断)下半部中tasklet与workqueue的区别,整合

一、中断处理的tasklet(小任务)机制 中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能...
  • dragon101788
  • dragon101788
  • 2013年08月23日 18:57
  • 3899

软中断/tasklet/工作队列 区别

(1)上半部和下半部的区别 上半部指的是中断处理程序,下半部则指的是一些虽然与中断有相关性但是可以延后执行的任务,两者的主要区别在于:中断不能被相同类型的中断打断,而下半部依然可以被中断打断;中断对...
  • u012489236
  • u012489236
  • 2013年10月24日 09:18
  • 234

软中断/tasklet/工作队列

软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任...
  • u010372050
  • u010372050
  • 2014年10月09日 18:46
  • 286

软中断\tasklet\工作队列

软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任...
  • qq_27245709
  • qq_27245709
  • 2016年06月23日 15:01
  • 177

软中断,tasklet,工作队列

软中断、tasklet、工作队列
  • andy205214
  • andy205214
  • 2016年11月04日 13:49
  • 170
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:工作队列、tasklet、软中断的用法总结
举报原因:
原因补充:

(最多只允许输入30个字)