第 2 部分阅读(1 / 6)

加入书签 本章报错

Linux 驱动编程强烈推荐:

参数指定的等待列表_ຕb

中。下面我们给的驱动添加个ฐ函数:

_r,_bຘ

{

0่;

_,&,;๙

数据是否可获得?

!0่

{

||rr;标示数据可获得

}

rr;

}

需要说明的是,_ຕ函数并不阻塞,程序中ณ_,ไ&,这句话的意

思并不是说直等待信号量可获得,真正的阻塞动作是上层的函数中ณ完成的。

会在个循环中对每个需要监听的设备调用它们自己้的支持函数以使得当前

进程被加入各个设备的等待列表。若当前๩没有任何被监听的设备就绪,则内核进行调度调

用让出进入阻塞状态,返回时将再次循环检测是否有操作可以进行,

如此反复;否则,若有任意个ฐ设备就绪,都立即返回。

我们编写个用户态应用程序来测试改写后的驱动。程序中要用到b中引入的

函数,其原型为:

,_r,_r,_ຕ,r

;

其中rr分别是被监视的读写和异常处理的文件描述

符集合,的值是需要检查的号码最高的文件描述符加1้。参数是个指向r

类型的指针,它可以使在等待时间后若没有文件描述符准备好则ท返回。

2๐3

r数据结构为:

r

{

_;๙

_;๙r

};

除此之外,我们还将使用下列:

_ຕr_――清除个文件描述符集;

_,ไ_――将个文件描述符加入文件描述符集中;

_r,_ຕ――将个ฐ文件描述符从文件描述符集中清除;

_,ไ_――判ศ断文件描述符是否被置位。

下面的用户态测试程序等待可读,但是设置了5秒的等待超时,若超过5

秒仍然没有数据可读,则输出“5”:

{

,;๙

_r;

r;

"ิ",_rr,ไ_rr|_r;

!ำ1

{

1

{

查看是否有输入

_r&r;๙

_,&r;

设置超时时间为ฦ5

_5;

_0;

+ใ1,ไ&r,,ไ,&;

数据是否可获得?

_,&r

{

r,&,;

24

r"",;

输入为0่,退出

0

{

;

}

}

r"5";

}

}

{

r"ิr"ิ;

}

}

开两个终端,分别运行程序:个对进行写,个用上述程序对进

行读。当我们在写终端给输入个ฐ值后,读终端立即就能输出该值,当我们连续5

秒没有输入时,“5”在读终端被输出,如下图:

2๐5

6设备驱动中的异步通知

结合阻塞与非阻塞访问函数可以较好地解决设备的读写,但是如果有了异步通知

就更方便了。异步通知的意思是:旦设备就绪,则主动通知应用程序,这样应用程序根本

就不需要查询设备状态,这点非常类似于硬件上“中断”地概念,比较准确的称谓是“信

号驱动的异步”。

我们先来看个使用信号驱动的例子,它通过,_r对

_启动信号机制,输入可获得时_r被调用,其源代码如下:

_100

_r

{

r_ຕ;

;

读取并输出_上的输入

r_,&,_ຕ;

0;

r"bຘ:"ิ,;๙

}

{

;

启动信号驱动机制

,_r;

_,_,;

_,ไ_;

_,_,ไ|;๙

最后进入个死循环,程序什么都不干了,只有信号能激发_r的运行

如果程序中没有这个死循环,会立即执行完毕

1;

}

程序的运行效果如下图:

26๔

为了使设备支持该机制,我们需要在驱动程序中实现函数,并在r函数中ณ

当数据被写入时,调用_函

↑返回顶部↑

书页/目录

Linux 驱动编程