日期:2014-05-16 浏览次数:20686 次
第六章 高级字符驱动程序操作
前面已经构造了结构完整的可读可写的字符设备驱动程序,这里介绍高级的操作。
首先要明白高级在哪里?这里有几个概念:睡眠、阻塞/非阻塞。之前的驱动操作中都是默认调用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可以有效的查询设备