linux按鍵驅動程式心得

2021-09-02 08:28:45 字數 3265 閱讀 1394

linux按鍵驅動程式心得

在前一章所講的按鍵驅動的時候,用的是迴圈掃瞄的方式,在執行的時候通過ps命令檢視當前的程序,可以看到這個時候按鍵驅動程式的cpu占有率是最高的,這是因為,在寫應用程式的時候,用的是乙個死迴圈,不管有沒有按鍵按下,都會一直的讀取驅動程式傳過來的資料,這個死迴圈是占用cpu最高的,下面這種方法是通過中斷的方式來對按鍵的值進行取樣,當有按鍵按下的時候,驅動程式會喚醒應用程式,應用程式處理所得到的資料,當沒有按鍵按下的時候,驅動程式會一直處於休眠狀態,這個時候再用ps命令的時候,檢視我們的請用程式,可以看到的是,應用程式的狀態時s,是sleep的簡稱,說明其處於休眠狀態。下面就通過對程式的詳細注釋,來解釋其工作原理。

/* * 注 ,此程式是在友善之臂的基礎上面修改簡化而來

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include /* 標頭檔案 */

/* 巨集定義裝置的名稱 */

#define device_name "key_init"

/* 預設的按鍵是處於彈起的狀態 */

#define pin_up 1

/* 注裝置號 */

static int key_major = 191;

/* 採用的是中斷表述的方式安排中斷 */

/* 這樣的好處是在外部中斷函式中科一方便中斷函式的處理*/

struct button_irq_desc ;

static struct button_irq_desc button_irqs = , ,

, ,

, ,

};

/* 預設的按鍵陣列狀態,當沒有按下的時候,陣列的值都是零, */

static volatile char key_values [6] = ;

/* 建立等待佇列,當滿足條件的時候 */

static declare_wait_queue_head(button_waitq);

/* 這個變數很重要。後面贅述 */

static volatile int ev_press = 0;

/* 這個是中斷處理函式 */

static irqreturn_t buttons_interrupt(int irq, void *dev_id) /* 這個函式,當中斷發生的時候,傳過來的引數是中斷號,和中斷的描述資訊 */

return irq_retval(irq_handled); }

static int s3c24xx_buttons_open(struct inode *inode, struct file *file)

//這個是註冊中斷用的。

err = request_irq(button_irqs[i].irq, buttons_interrupt, irq_type_edge_falling,

button_irqs[i].name, (void *)&button_irqs[i]);

if (err)

break; }

if (err)

disable_irq(button_irqs[i].irq);

free_irq(button_irqs[i].irq, (void *)&button_irqs[i]); }

return -ebusy; }

ev_press = 1;

return 0; }

static int s3c24xx_buttons_close(struct inode *inode, struct file *file)

//free_irq();反註冊中斷

free_irq(button_irqs[i].irq, (void *)&button_irqs[i]); }

return 0; }

static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)

return err ? -efault : min(sizeof(key_values), count); }

static struct file_operations dev_fops = ;

static int __init dev_init(void)

static void __exit dev_exit(void)

module_init(dev_init);

module_exit(dev_exit);

module_license("gpl");

module_author("friendlyarm inc.");

到這裡就完成了驅動程式的編寫

下面是應用程式

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main(void)

;

buttons_fd = open("/dev/key_int", 0);

if (buttons_fd < 0)

for (;;)

for (i = 0; i < sizeof buttons / sizeof buttons[0]; i++)

}

}

close(buttons_fd);

return 0;

} 至此這個驅動加測試完成了,效果如下圖所示

當按鍵按下的時候就會出現如圖所示的輸出。

用ps命令檢視當前的程序

key_test程式在沒有按鍵按下的時候一直處於s狀態,也就是休眠狀態

重點詳解,容易不解

-------僅供自己參考

linux下按鍵驅動程式

說明 由於除錯的時候minicom出了問題,傳送大一點的檔案就會失敗,所以下面的程式可能會有點問題,請注意 1.button.c include include include include include include include include include include inclu...

中斷 按鍵中斷驅動程式

中斷處理 1 外設的處理速度一般慢於 cpu。2 cpu不能一直等待外部事件,所以裝置必須有一種方法來通知 cpu它的工作進度,這個方法就是中斷,外設與 cpu資訊互動的機制,提高 cpu利用率。處理之外還有查詢,但是查詢會一直占有 cpu資源,導致 cpu低利用率,好處是實現簡單。linux系統中...

按鍵驅動程式(非同步通知)

此驅動程式之前的按鍵驅動程式 中斷方式 上加以優化。用到非同步通知。對於核心來講,既然使用者想得到的是按鍵後的狀態,那麼自然不必時時都要 狀態。當它檢測到中斷發生變主動通知使用者,使用者再來讀。這樣,使用者空間 核心就可以著手幹點其它的事情,而不必忙等按鍵按下或釋放。那麼就先從應用程式上面看。怎麼設...