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