1. 程式人生 > >poll機制的總結

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機制的一個例子。