1.globalfifo 驅動中增加輪詢操作
在 globalfifo 的 poll()函式中, 首先將裝置結構體中的 r_wait 和 w_wait 等待佇列頭新增到等待列表,然後通過判斷 dev->current_len 是否等於 0 來獲得裝置的可讀狀態,通過判斷 dev->current_len 是否等於 globalf ifo_ size 來獲得裝置的可寫狀態
static
unsigned
intglobalfifo_poll
(struct file *filp, poll_table *wait)
/*fifo 非滿*/
if(dev->current_len != globalfifo_size)up(
&dev->sem)
;return mask;
}
把 globalfifo_poll 賦給 globalfifo_fops 的 poll 成員
static
const
struct file_operations globalfifo_fops =
;
2.在使用者空間驗證 globalfifo 裝置的輪詢
監控 globalfifo 是否可非阻塞讀寫的應用程式
#include ...
#define fifo_clear 0x1
#define buffer_len 20
main()
while(1
)/*資料可寫入*/if(
fd_isset
(fd,
&wfds))}
}else
}
執行時看到, 當沒有任何輸入,即 fifo 為空時,程式不斷地輸出「poll monitor:can be written」 ;當通過 echo 向/dev/globalfifo 寫入一些資料後, 將輸出「poll monitor:can be read」和「poll monitor:can be written」如果不斷地通過 echo 向/dev/globalfifo 寫入資料直至寫滿 fifo,發現 pollmonitor 程式將只輸出「poll monitor:can be read」 。對於 globalfifo 而言,不會出現既不能讀、又不能寫的情況 外設的驅動模式 中斷 輪詢
中斷配合作業系統形成掛起等待模式,掛起等待是順序程式設計。協程是對擇機輪詢的簡化,將顯式的狀態機設計轉為隱式狀態機,讓非同步程式設計看起來像順序程式設計,簡化設計 提高可讀性。事件驅動模型是中斷模式的泛化。dma和fifo是優化措施,將多個中斷或輪詢簡化為乙個中斷或輪詢。底層驅動是非同步程式設計,上...
支援非同步通知的globalfifo驅動
驅動程式執行在核心空間中,應用程式執行在使用者空間中,兩者是不能直接通訊的。但在實際應用中,在裝置已經準備好的時候,我們希望通知使用者程式裝置已經ok,使用者程式可以讀取了,這樣應用程式就不需要一直查詢該裝置的狀態,從而節約了資源,這就是非同步通知。好,那下乙個問題就來了,這個過程如何實現呢?簡單,...
驅動篇 乙個簡單的led驅動
1.構造裝置結構體 struct light dev cdev結構體 struct cdev 2.設定裝置資訊 struct light dev light devp 設定裝置結構體變數 int light major light major 設定主裝置號3.設定並填充file operations...