日期:2014-05-16  浏览次数:20676 次

《linux设备驱动程序III》学习---第六章

 

   第六章  高级字符驱动程序操作

   前面已经构造了结构完整的可读可写的字符设备驱动程序,这里介绍高级的操作。

   首先要明白高级在哪里?这里有几个概念:睡眠、阻塞/非阻塞。之前的驱动操作中都是默认调用read、write后可以立即读取、写入数据,但实际往往不可能,当read时设备还没有数据供个read、当write时还没准备好接收设备缓存空间是满的而没有地方再write进新数据时驱动程序该怎么处理??当然不能返回错误或空数据的。需要让调用驱动的进程休眠、阻塞,等设备处理好了再通知进程来操作。

@休眠相关函数:

  静态初始化等待队列头:DECLARE_WAIT_QUEUE_HEAD(name);

   动态   :wait_queue_head_t  my_queue;

                            init_waitqueue_head(&my_queue);

    初始化等待队列头后就要进入休眠了:wait_event_interruptible(name,flag!=0);

    唤醒:wait_up_interruptible(&name); 通过这个函数唤醒上面的函数,但如果要想真正的唤醒,wait_event_interruptible()中flag!=0 要为真。

 

@poll 和select  函数:

   对于非阻塞应用程序中有poll 和select调用时,会阻塞进程,知道有数据写入后者输出。常用于要使用多个输入输出流而又不会阻塞其中任何一个流 的应用中。

   poll:使每个可以唤醒进程的操作状态的等待队列都可以被驱动装载。通过poll_wait函数,驱动程序向poll_table结构中添加等待队列。

   void poll_wait(struct file *,wait_queue_head_t *,poll_table *);

 

用法:

驱动中调用了poll_wat函数后,当应用程序中调用select函数时,就可以监听驱动程序中阻塞是否被剔除了,是否可以立即返回、写入数据了。select可以有效的查询设备