驅動程式之 1 字元裝置 7

2021-09-09 07:28:54 字數 2353 閱讀 2362

阻塞操作

是指在執行裝置操作時若不能獲得資源則掛起程序,直到滿足可操作的條件後再進行操作。

被掛起的程序進入休眠狀態,被從排程器的執行佇列移走,直到等待的條件被滿足。

非阻塞操作

程序在不能進行裝置操作時並不掛起,它或者放棄,或者不停地查詢,直至可以進行操作為止。

驅動程式中:

如果是以非阻塞方式開啟檔案,在讀函式中,判斷是否按下按鍵,若有按鍵則返回鍵值,否則直接退回應用程式;而如果以阻塞方式開啟(前面關於按鍵中斷的文章就是這種情況),則程序會進入休眠,等待按鍵事件觸發

應用程式中:

1、以非阻塞方式開啟裝置檔案

fd = open("/dev/key_irq_drv",o_rdwr | o_nonblock);
2、休眠時間設定為2s,2s秒迴圈一次**

3、一次迴圈只進行一次讀操作,所以即使2s內按下多次按鍵,也只會按2s的週期返回一次鍵值

附上驅動程式和測試用的應用程式**

驅動程式

#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 unsigned char key_val;

static declare_mutex(button_lock);

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 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)

else

request_irq(irq_eint0,buttons_irq,irqt_bothedge,"s2",&key_pins_desc[0]);

request_irq(irq_eint2,buttons_irq,irqt_bothedge,"s3",&key_pins_desc[1]);

request_irq(irq_eint11,buttons_irq,irqt_bothedge,"s4",&key_pins_desc[2]);

request_irq(irq_eint19,buttons_irq,irqt_bothedge,"s5",&key_pins_desc[3]);

return 0;

}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)

else

ev_press = 0;

copy_to_user(buf,&key_val,1);

return 0;

}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 #include #include #include int main(int argc,char *args)

printf("open successfully\r\n");

while(1)

return 0;

}

驅動程式之 1 字元裝置 1

linux裝置驅動分三種,包括字元裝置驅動 塊裝置驅動和網路裝置驅動 其中本文講的字元裝置 如lcd 觸控螢幕等 只能按位元組流先後順序訪問裝置記憶體,不能隨機訪問 字元裝置的基本框架比較簡單 載入驅動時,呼叫入口函式 解除安裝驅動時,呼叫出口函式 應用程式開啟驅動裝置時,呼叫open函式 應用程式...

驅動程式之 1 字元裝置 3

基本排程關係 在應用程式中呼叫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呼...

驅動程式之 1 字元裝置 8

按下按鍵時,由於按鍵抖動,會產生幾個高低脈衝,而cpu處理太快,這幾次高低脈衝被當作有效訊號處理,處理辦法 使用定時器,檢測到第一次按下後,啟動定時器,延遲一段時間 一般取10ms 再檢測一次,如果這時候檢測到按鍵按下,則確定有按鍵按下 驅動程式中執行流程 按鍵中斷觸發後,記錄鍵值,修改定時值,10...