驅動篇 支援輪詢操作的 globalfifo 驅動

2021-10-10 18:24:02 字數 1194 閱讀 7987

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