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

linux字符驱动之同步互斥按键驱动

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-6-16 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
上一节里,我们将在上一节的基础上修改驱动,将其修改为有异步通知功能的按键驱动,目标是,按下按键时,驱动主动去通知应用程序。是不是感觉驱动已经比较完善了,好像已经是完美无缺了?是不是这样呢?好像不是呢,有没有这么一种情况,多个进程想同时使用驱动的设备节点?在多线的环境下,分分钟可能会发生这种情况。6 J, \& s9 g1 g: L3 s! E7 J1 z$ I0 N

+ i% G: _" R& K; s1 M# n上一节文章:linux字符驱动之异步通知按键驱动/ X6 @+ M. N  z( c1 A7 S
# n8 T; `5 h; X& X( N6 y
在这一节里,我们在上一节的基础上,实现同一时刻只能有一个进程使用同一个设备,例如:只能有一个进程,在同一时刻里使用/dev/buttons这个设备。
# {" U4 k0 N3 Q* ]# ~  K' h
% R; z0 t2 S5 b  |1 D问:如何实现同一时刻只能有一个进程使用某个设备?
: j; }0 r" z0 b; a* D/ ^3 r0 Y* A9 Z) y: X$ n
答:使用linux互斥机制
6 T1 j/ T+ \9 D6 t
& }5 A$ a- g, e问:linux互斥机制有哪些?1 i4 g% o+ D- ]- F- E: A8 ~8 u0 X6 q: e
" w2 ?) ^1 R! w) U. E
答:有很多种,如:原子变量、互斥锁、信号量、自旋锁、读写锁等等& i) [' o$ M6 K& J) s* b: D3 ]
8 m# _% m, Y7 ?, c& M
问:在这一节里,我们使用什么互斥机制?
/ q1 c( D) ]0 [4 @: X/ G& L% D) f
答:原子变量/信号量,举二个例子来示范linux的互斥机制
: ^/ M5 s, G5 w" a+ P( ]8 U' b2 ]: o# X2 t
问:如何使用原子变量的互斥机制?
" p! m  c3 L. `  e" h4 g% q% L
! w& p) Z* g, }% F4 s# ^答:先定义一个原子变量,然后再初始化它。具体如下:3 X6 h2 W' n& l. Z9 p' Y

, k& z0 n9 l7 G1 B$ A6 M; w+ f3 [! j( H+ w/ U+ `3 U) G2 y
/* 定义原子变量canopen并初始化为1 */
. J6 V+ Z6 C! qstatic>$ U7 o% I  g, _. a3 ?
问:与原子变量相关的函数有哪些?/ M4 a3 ]3 m0 n5 q
答:原子操作指的是在执行过程中不会被别的代码路径所中断的操作,常用原子操作函数举例:9 ~( B: ?) K, J' @4 |2 ~8 E* v2 s

, t/ I! F: {- W$ V/ v6 K. E
4 c* E/ N9 h1 `. D' k# ?. O! aatomic_t>
' V. `9 o4 y+ b9 G7 U( c' i2 m8 w问:原子变量相关的函数在此驱动里,在哪来会被调用?$ a& I$ W1 n7 p3 E8 F
答:既然是防止多个进程打开同一个设备,那自然是在open函数就调用,在close函数也会被调用,示例如下:
* U% H8 Q" C: H+ x3 F
7 Q/ e: @& D6 i8 x4 L. W6 {/ w9 u2 B" g6 g* a! s- p# w, a, O" n
static>
# n3 x* X9 N7 B: K: z" S! V- R" m3 i. a6 N

% u! S, e# S1 `6 I9 x5 |, Q8 p" k原子变量互斥方式应用测试程序源码:6 |; V' E- d) x5 E! A( i+ F
) g$ e) @9 m" N$ O' k% Y
; n4 U: e( s; ]9 M) h6 C( R
#include <stdio.h>6 ^5 ]/ J, }2 O# s( [1 D
#include <sys/types.h>, l8 y; T+ x% a9 y6 X
#include <sys/stat.h>; O% X  v' f' c+ }  M
#include <fcntl.h>
/ j4 k' n- H" k* `9 P. X& }#include <unistd.h>
& A4 p! I( M6 ?9 d#include <poll.h>2 g6 w$ c# t. @
8 h- a/ I7 x3 Z. x9 z3 ?+ k3 w3 N  g
/*>  N. r3 Y5 E& f$ b- x

- K$ k! v% V/ B5 Q. ]" G2 {& {原子变量互斥方式测试步骤:
5 M/ Y$ a2 Y3 |4 m% F
% W  F. E( T, E4 c. }[WJ2440]#>
& V/ j+ C  L5 i  J3 `/ {9 j
7 R' T2 Y) U  C6 g1 ^0 {) p* y" ?% k: R) W$ p. }0 X! Z- x
信号量互斥方式应用测试程序源码:( h4 ?/ k3 y6 q  t' A6 g5 b+ Y+ V9 x
#include <stdio.h>
1 T  B/ P; ?# F0 I1 M8 I#include <sys/types.h>
4 u) _. w9 o* j  U1 C8 y/ e9 c#include <sys/stat.h>
, e; |# A( o, W, N8 |" S5 e$ ~$ p#include <fcntl.h>; T9 I, `* R& s0 }% L+ l
#include <unistd.h>        //sleep
( m1 Z( s2 e) t8 \" F8 A#include <poll.h>% ?) y( N- n# n
#include <signal.h>  l# |& `, j; |) Q- R5 C+ W4 X0 U
#include <fcntl.h>( l- G! ^. Y4 J& q/ t) b& s
9 H5 l# Z8 y0 Y8 B" U
int>
+ {. N6 {2 o/ X. w6 @7 A& o' M& u) Q# G# X) F) h7 i' E
信号量互斥方式测试步骤:9 o/ l$ {' x6 W- d! e% y( b0 D7 l
  c$ m0 j" l) i, C
[WJ2440]# ls. }3 N) j/ a4 |0 o$ I- P& v; _8 k
Qt             fifth_drv.ko   lib            sddisk         third_test. E- J9 ]1 r: d; e6 S
TQLedtest      fifth_test     linuxrc        second_drv.ko  tmp% o3 N: F: ]  h  z6 t; u
app_test       first_drv.ko   mnt            second_test    udisk3 j1 P# i1 b$ R4 ~
bin            first_test     opt            sixth_drv.ko   usr3 T: \9 @; c; K
dev            fourth_drv.ko  proc           sixth_test     var1 c2 x$ E9 |4 S9 l
driver_test    fourth_test    root           sys            web9 {8 Y9 `6 b9 U" q1 f- X
etc            home           sbin           third_drv.ko* o. |! o6 W8 h7 I1 E! Y4 [/ u2 @% b
[WJ2440]# insmod sixth_drv.ko 1 h8 Y- D$ [. S% u  Q
[WJ2440]# lsmod              + f4 B+ y4 V4 M8 M- e
sixth_drv 3472 0 - Live 0xbf000000% [8 P) s, P& U) \
[WJ2440]# ls /dev/buttons -l' w$ O# A3 G* T/ o* M
crw-rw----    1 root     root      252,   0 Jan  2 04:47 /dev/buttons
" }; i$ ^& X- ~0 W" u[WJ2440]# ./sixth_test &
' S8 z" A' t( j' b1 z[WJ2440]# ./sixth_test &" ~3 t! s9 Q& L( D9 }
[WJ2440]# ps
+ ?; i  Y2 g& d; d5 O  PID USER       VSZ STAT COMMAND9 l5 B8 D- O8 ~( E
    1 root      2088 S    init
  ^4 t7 ~" G# r    2 root         0 SW<  [kthreadd]
/ p7 X, ~5 r# M" g+ \    3 root         0 SW<  [ksoftirqd/0]0 D9 o9 l$ X8 ?
    4 root         0 SW<  [events/0]& u  d/ c* m5 C$ X
    5 root         0 SW<  [khelper]  v! C( f8 l4 K& f+ A1 k3 L5 N
   11 root         0 SW<  [async/mgr]1 X/ Z2 J7 m! _; Q( ?$ L) u. U$ |' }
  237 root         0 SW<  [kblockd/0]
' f; }1 Z" G+ c) s9 X  247 root         0 SW<  [khubd]- A& M# X5 F+ }- h8 e
  254 root         0 SW<  [kmmcd]
* h7 \8 S6 A# f8 r  278 root         0 SW   [pdflush]8 U) M( W! K8 ]) y8 K+ d! Q9 S% t
  279 root         0 SW   [pdflush]/ r+ b& A, K+ V( l* q
  280 root         0 SW<  [kswapd0]
% y5 [0 [5 M6 t1 n' m! v7 v5 `1 d. Q) g  325 root         0 SW<  [aio/0]8 M2 `8 {. g8 @$ [
  329 root         0 SW<  [nfsiod]
  }- V. N7 ?8 a  333 root         0 SW<  [crypto/0]% X) s1 A2 J2 w& {+ q2 H
  443 root         0 SW<  [mtdblockd]
- k* o  z+ _9 K  557 root         0 SW<  [usbhid_resumer]2 m1 J4 ~- p. q" O
  573 root         0 SW<  [rpciod/0]
3 O1 {  l9 y( t  587 root      1508 S    EmbedSky_wdg
3 H: O: j/ h4 Y2 J6 b  589 root      2092 S    -/bin/sh) a/ S2 j# b- x# l
  590 root      2088 S    /usr/sbin/telnetd -l /bin/login9 u- ^7 a6 ?& v/ m+ ?
  602 root      1428 S    ./sixth_test
7 p* i& s+ }+ s2 T+ T6 w  603 root      1428 D    ./sixth_test
5 Q4 Z( }) a& J7 y  604 root      2092 R    ps
4 U6 D. ]0 Y1 S" t& L4 ~( [8 i! N9 z9 S( s" y
由上面的测试结果可知:当多次执行./sixth_test &时,可发现进程602的状态为S即睡眠状态,而进程603的状态为D即僵死状态,只有当我们杀死602进程时,603的状态才能变为S正常状态,这也就达到了互斥的目的。1 C/ P0 d0 w! n; a' p7 [) A

$ \2 E. m6 R. t0 r8 o5 j  U0 w* U. p: u3 P! t  O' \
( s0 ^* H, i8 G% h! b
; ?" S. J2 V* Z( X; M

( Y" v; r! a# i' V: u; _" Q
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-6-16 16:27 | 只看该作者
    linux字符驱动之同步互斥按键驱动
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-30 07:51 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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