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

研究 linux 内核 - work queue

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
研究 linux 内核 - work queue
* f2 M* L+ i8 D" Y% Q" N2 L3 ?! q9 z( S- t9 a! [2 N
" L7 z! ?0 `( e% J5 K
) Z+ K5 G: s2 v$ f
4 i/ o; N" x8 \) N- c
1,work queue 与软中断和tasklet的关系! Y; {# c+ h4 d% i* w- _

7 P$ k+ b2 ~% g# U- R, y8 b

1 J& L. O. s% i, O- n5 ?1》work queue是内核线程来执行的,软中断和tasklet是qsoftirqd内核线程来执行的。! O7 |4 F4 H* J
2》work queue能休眠,软中断和tasklet不能。
: X. u0 J. o0 V% f( D1 p, [
; X% E! ^6 ^" y# k  B( n4 K1 s

0 D- ]/ |# p% k, D: T1 d
/ [0 o4 p8 o, U- Z2 W$ y

" {7 H& ~$ a* z. P2,work queue工作原理和过程
  u0 U5 L% w! V- F. I% V# f3 _1 k
3 S! g8 |" |0 K
! E( f  f! b- P, q1 {! \0 K
1》内核有一个默认的工作者线程(worker thread),event(n),n代表CPU。
# d# z. m  s) V- [$ P8 Y2》每个工作者线程有一个工作结构体链表。! W9 r0 @6 c2 |8 ^7 Z
3》链表的节点结构体成员有个函数指针,和函数参数。来执行下半部任务。
: p+ u" X( w' t0 ^4》工作者线程检查这个链表,发现有节点,就执行这个节点的函数指针。
) ]: O0 y# L7 g; t1 Z) x5》执行完毕后,将这个节点移除链表。% R- t- d7 C; d! {# P
6》如果链表为空,工作者线程休眠。
3 ^2 F# E4 O& a0 P# z' q/ x0 M: L$ U; }( D5 R/ K8 ^) a1 i! F
* E+ z: {9 U5 x( @! J2 p
- C+ i% L& e  u% {

# G' s3 m, S3 I5 B3,如何在驱动中使用work queue
; ~7 u% U3 ]% l( r7 U- s6 t) p9 G8 v% m* x5 G0 F. @5 P( `

1 u% v/ A6 O6 |1》一般使用内核默认的工作者线程(evnet),也可以自己创建一个(rill):
5 A: M; k1 Q: \: Lstruct workqueue_struct *rill_wq;
/ \! s% T- Z- n- jrill_wq = creat_workqueue("rill");; W" G9 N$ P0 _; h8 m

2 {# x" ]. F9 X. y6 w

. j/ R. m' Z, T' I& g- [/ P# I2》创建工作结构体(链表的一个节点)* ]* Y4 i6 k. H# W7 D6 Y$ d$ F  Y
静态:8 b6 j. h, V8 y* T7 K% G5 e+ _
DECLARE_WORK(name,void(*func)(void*),void*data);& c1 k5 o& c0 V: _3 Z/ Q
+ B, f( `; `* G: a' s0 P

1 D& K+ `1 ~# @; g& v- Q7 p) J% g: v动态:
' \- h" U9 N, V/ s1 y0 u) A1 W0 {INIT_WORK(struct work_struct *work,void(*func)(void*),void*data);
) ?5 o/ a1 e7 M
! O* r0 `" s4 [' M6 u' c. h" N) T

7 x9 I. A8 k) f' A+ I3》实现处理函数
8 i* S- l( `9 E8 @- [; }在驱动里实现func函数。
# Y2 i6 B  H  I3 Q+ h
4 H) l. Z4 K5 U( a. Y& t' C% v/ K

/ W) L/ H8 M8 d' g$ C4》调度工作队列
% m- }$ A3 j. c2 U7 i. \schedule_work(&rill_wq);
! j; [: L2 _2 p+ I1 r* i7 O: K4 h! `: q
7 B/ \/ X2 N/ M! F8 H! Q2 z' i9 c& u
5》刷新
$ W. z. I. A7 u+ r7 Lflush_workqueue(&rill_wq);
) }6 e4 G5 g% q. E5 N1 k; K% W8 F, d; P

* a2 ]1 M- f: d+ e" U# L# `5 a& T" \& I8 u

. Z5 {8 D. l3 N' |
6 u; b! Y1 b( y! b; f6 X
/ E$ @5 \/ w  _, N
( d% |6 i3 G, H# p; H1 z  g
8 W7 u; T! t. K  t8 r

: U; t% Z* `4 d! z. S# y& p

7 y6 e0 Q$ I! E5 {7 i( I  `* O. |  P
  H  e4 j+ b$ N1 H- t
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 02:00 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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