poll机制的总结


 

poll机制就是给定一段时间,在这一段时间内程序处于睡眠状态一直等待某一个资源,它会在两种情况下返回①时间到了②等到了资源。

驱动程序的实现并不复杂,但原理有待分析。

首先要在file_operation里添加.poll = forth_drv_poll,然后

unsigned int forth_drv_poll(struct file *file,poll_table *wait)

{ unsigned int mask = 0;

poll_wait(file,&button_waitq,wait);

//不会立刻休眠  

if(ev_press)

mask |= POLLIN | POLLRDNORN;  

return mask;

}

当应用程序调用poll()时,对应系统调用sys_poll(),然后执行 do_sys_poll ()再之后是 poll_initwait();在poll_initwait()中注册一下回调函数__pollwait,它就是我们的驱动程序执行poll_wait()时,真正被调用的函数。

再执行do_poll(),在这个函数里有一个死循环


 

 
 do_poll(nfds, head, &table, end_time);
 
             
 for
 (;;)
 
             
 {
 
                 
 for
  (; pfd != pfd_end; pfd++)
 //查询多个驱动程序
 
                 
 {
 
                     
 if
  (do_pollfd(pfd, pt))  -> mask = file->f_op->poll(file, pwait);
 return
  mask;
 
                     
 {
 //do_pollfd函数相当于调用驱动里面的forth_drv_poll函数,下面另外再进行分析,返回值mask非零,count++,记录等待事件发生的进程数
 
                         
 count++;
 
                         
 pt = NULL;
 
                     
 }
 
                 
 }
 
                  
 
                 
 if
  (count || timed_out)
 //若count不为0(有等待的事件发生了)或者timed_out不为0(有信号发生或超时),则推出休眠
 
                     
 break
 ;
 
                  
 
                 
 //上述条件不满足下面开始进入休眠,若有等待的事件发生了,超时或收到信号则唤醒
 
                 
 poll_schedule_timeout(wait, TASK_INTERRUPTIBLE, to, slack)
 
             
 }

然后总结一下整个驱动程序的流程:
 

先把部分测试程序贴出来:

while(1){
         ret = poll(fds,1,5000);
         if(ret == 0)
         {
            printf("time out \n");
         }
 
 
         else
         {
             read(fd,&key_values,1);
             printf("key_value = 0x%x\n",key_values);
             
 
 
         }
     }
 


当程序执行poll()的时候,会发生如上所示的过程,当执行到驱动程序的forth_drv_poll()时,会把进程放到button_waitq队列里,但不会立刻休眠,同时mask的值仍然是0.所以count不能执行加1,所以就不满足break的条件,然后执行休眠_timeout的命令。

①如果在time_out的时间结束了还没有发生中断,此时仍处于死循环for中,但时间已经用完,所以当在执行到break的条件是会得到满足,那么就会跳出for死循环,同时poll()函数返回0,再打印出“time out”;

②如果在在time_out的时间内发生了中断,在中断处理函数中,就会把中断事件标志置1,然后把进程唤醒,同时得到按键的值,中断处理完成后又会回到for死循环中,再次执行驱动程序的forth_drv_poll()函数,此时由于中断事件标志为1,所以会返回一个非零的mask,进而count++,打破break跳出死循环,然后poll()返回一个非零的ret同时在接下来执行read函数,获得键值之后,将键值打印出来。


 


 

这就是poll机制的一个例子。
————————————————
版权声明:本文为CSDN博主「guoguoguilai」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guoguoguilai/article/details/54864530

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值