基本排程關係:
在應用程式中呼叫poll
poll呼叫sys_poll
sys_poll呼叫do_sys_poll
do_sys_poll呼叫do_poll
do_poll呼叫do_pollfd
do_pollfd呼叫我們的驅動程式實現的my_irq_drv_poll,my_irq_drv_poll呼叫poll_wait設定引數,然後返回do_poll,再程序休眠
在驅動程式中
1、在檔案結構體中定義了poll函式:my_irq_drv_poll
2、在poll函式實現中,根據應用程式要求掛入等待佇列,此時程序並沒有馬上休眠,而是在返回do_poll函式後才休眠
3、當按鍵按下,進入中斷服務程式,喚醒程序,進入中斷服務程式,退出再回到poll,再返回到應用程式
4、當到達超時時間,程序同樣也被喚醒,從poll返回到應用程式
在應用程式中
1、定義了乙個pollfd型別結構體,指定了使用poll機制的檔案和處理事件(通過設定事件標誌符)
2、呼叫poll函式,指定需要掛入佇列的檔案、檔案數、超時時間5s
3、當程序被喚醒,應用程式根據返回的掩碼,判斷是否有資料可讀,沒有就是超時,有就是按鍵中斷,若有,則進入read函式,讀取鍵值
事件標誌符如下表
附上驅動程式和測試用的應用程式**
驅動程式
#include #include #include #include #include #include #include #include #include #include #include #include #include #include static struct class *my_irq_class;
static struct class_device *my_irq_class_device;
static declare_wait_queue_head(button_waitq);
static volatile int ev_press = 0;
static struct pin_desc;
struct pin_desc key_pins_desc[4]=,
, ,,};
static unsigned char key_val;
static irqreturn_t buttons_irq(int irq,void *dev_id)
else
ev_press = 1;
wake_up_interruptible(&button_waitq);
return irq_handled;
}static int my_irq_drv_open(struct inode *inode, struct file *file)
int my_irq_drv_close(struct inode *inode,struct file *file)
ssize_t my_irq_drv_read(struct file *file, char __user *buf, size_t size, loff_t * ppos)
static unsigned int my_irq_drv_poll(struct file *filp, poll_table *wait)
static struct file_operations irq_drv_fops = ;
static int major;
static int my_irq_drv_init(void)
static void my_irq_drv_exit(void)
module_init(my_irq_drv_init);
module_exit(my_irq_drv_exit);
module_license("gpl");
應用程式
#include #include #include #include #include int main(int argc,char *args)
printf("open successfully\r\n");
fds[0].fd = fd;
fds[0].events = pollin;
while(1)
else
}return 0;
}
驅動程式之 1 字元裝置 1
linux裝置驅動分三種,包括字元裝置驅動 塊裝置驅動和網路裝置驅動 其中本文講的字元裝置 如lcd 觸控螢幕等 只能按位元組流先後順序訪問裝置記憶體,不能隨機訪問 字元裝置的基本框架比較簡單 載入驅動時,呼叫入口函式 解除安裝驅動時,呼叫出口函式 應用程式開啟驅動裝置時,呼叫open函式 應用程式...
驅動程式之 1 字元裝置 7
阻塞操作 是指在執行裝置操作時若不能獲得資源則掛起程序,直到滿足可操作的條件後再進行操作。被掛起的程序進入休眠狀態,被從排程器的執行佇列移走,直到等待的條件被滿足。非阻塞操作 程序在不能進行裝置操作時並不掛起,它或者放棄,或者不停地查詢,直至可以進行操作為止。驅動程式中 如果是以非阻塞方式開啟檔案,...
驅動程式之 1 字元裝置 8
按下按鍵時,由於按鍵抖動,會產生幾個高低脈衝,而cpu處理太快,這幾次高低脈衝被當作有效訊號處理,處理辦法 使用定時器,檢測到第一次按下後,啟動定時器,延遲一段時間 一般取10ms 再檢測一次,如果這時候檢測到按鍵按下,則確定有按鍵按下 驅動程式中執行流程 按鍵中斷觸發後,記錄鍵值,修改定時值,10...