找回密码
 注册
关于网站域名变更的通知
查看: 286|回复: 1
打印 上一主题 下一主题

研究 linux 内核 - work queue

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-10-14 10:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
研究 linux 内核 - work queue
  X) i% S1 M9 ]; z. W& P9 Q; n6 q7 v# d4 P0 t. }
; j. _# E* w' x' U+ @! q

0 e' ?+ {, G9 i
! m" P0 c! [0 [4 [' v" {; M
1,work queue 与软中断和tasklet的关系
4 e- h4 z  ?: U' x* E- C
- B! ~; }5 x' h3 a# [0 P6 W
# L8 k; J$ _* s% W) a
1》work queue是内核线程来执行的,软中断和tasklet是qsoftirqd内核线程来执行的。
2 s4 g* @+ }) \* A2》work queue能休眠,软中断和tasklet不能。: O" }/ Q3 k1 L% U4 k1 _  V

6 d3 p* R7 @  V
4 ^8 j# H8 O$ r( ?
+ G& y- g0 ~- E  A
$ p' M2 B# U  L7 o3 H1 ]
2,work queue工作原理和过程
  F. s! A9 n9 [! {5 l. G6 T" y. P6 m3 h& F. O$ {) d

  y# o0 T% K: B  A& S; J1》内核有一个默认的工作者线程(worker thread),event(n),n代表CPU。/ m8 c/ A+ @. o6 P
2》每个工作者线程有一个工作结构体链表。2 M  f1 d9 Z- F) }- [/ \
3》链表的节点结构体成员有个函数指针,和函数参数。来执行下半部任务。' [  v7 J9 I2 P- {
4》工作者线程检查这个链表,发现有节点,就执行这个节点的函数指针。
4 ?( [( j8 P9 n2 w' o+ O- \( L5》执行完毕后,将这个节点移除链表。
9 V5 H. o- W6 p  n; [/ ^6》如果链表为空,工作者线程休眠。9 p5 S6 R, d% B& s2 @3 P

5 ^& m4 a( C5 L/ B
  H$ w$ w% d$ l0 C( T
0 m9 @- k% }, q6 [* Z
" j& x, F0 `' |* K" k
3,如何在驱动中使用work queue
3 w) [# I3 X5 A. _+ J# S. X5 g9 @
0 _1 K% M. O) e3 G% T; B3 {: E
. h  ^- Q& D5 j: n5 k
1》一般使用内核默认的工作者线程(evnet),也可以自己创建一个(rill):
- {6 F: E# W- x  sstruct workqueue_struct *rill_wq;
! s, [9 k0 b7 s; b$ s3 v! x' Yrill_wq = creat_workqueue("rill");
) o3 Q7 A5 m& q! o* l* L
5 u3 p3 p* ~, k* `8 i  u' t7 h$ S

, m7 k! i9 {0 J/ }) |2》创建工作结构体(链表的一个节点)
; \: O' ^; j% i& H# l6 J6 H静态:4 I* i1 v) z- i; n# q1 |7 a
DECLARE_WORK(name,void(*func)(void*),void*data);. [, b; b6 M1 N" |  y; c' v8 U, m
/ y; W& I7 z* [7 s9 V

' U: O5 T& y9 t3 b动态:
  y5 F) M. a2 y2 o( N$ aINIT_WORK(struct work_struct *work,void(*func)(void*),void*data);
) d9 R) z( s3 `7 V( D2 Y* `
' E4 ?; G  |4 _* U
: k) U) H7 z8 ]
3》实现处理函数+ b$ @9 T. }( b: I2 S# k% ?0 x
在驱动里实现func函数。7 n# H2 A: J6 {" f1 x

3 R8 G/ u- X$ T# E! w/ d) Y
( d/ \6 M& y$ d; e& D
4》调度工作队列
2 n5 }- U! v/ z+ f4 r4 v" b  Uschedule_work(&rill_wq);
+ B) V4 x5 }4 }$ l# j6 [$ t  o; _: C2 N1 H& [( _3 y

! a  L1 _9 I2 ^- K  C% P  n5》刷新
6 R% W! X4 I; \flush_workqueue(&rill_wq);6 Q, D. v" I- _7 u. z& _

5 H  c& P$ {+ e1 d3 ~6 u. F6 X6 r3 T

) v' [7 y# c  U6 [4 x  |6 f  v1 Q" g4 N* x& [/ f
* w% N4 B6 @9 N1 K7 f1 A

$ j* k% {' A* \8 Q6 K- l% o# z6 m/ L
- R3 n4 g6 W* Y4 ?/ e0 K! [" g7 n
$ ?$ L" t) @( ~  E

, |  N; g  q3 N* B- ]9 }+ B
' M' E1 u, K8 k
! x: u9 s: ^9 L$ |: q! ^1 [# k

3 w& R& u" M% ]- Q! E
; `7 ^1 F, M, f5 A) i6 I
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 01:37 , Processed in 0.171875 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表