在操作io裝置時,讀取裝置狀態或者資料時,如果採用輪詢方式,會占用大量的cpu資源,這種方式肯定是不可取,所以需要在核心驅動支援非同步通知方式,等到裝置準備好,再通知應用程式,其他時間應用程式應當處於休眠狀態,讓出cpu。本篇介紹poll的使用方法。
1)首先定義乙個wait_queue_head_t,並對其進行初始化
struct ***_dev
struct ***_dev *dev;
//在裝置初始化時,對等待佇列頭以及互斥訊號量進行初始化
init_waitqueue_head(&dev->irq_wq);
mutex_init(&dev->mutex);
2)實現poll函式
static unsigned int xdma_poll(struct file *file, poll_table *wait)
mutex_unlock(&dev->mutex);
return mask;
}
3)在中斷或者需要喚醒等待佇列時:
wake_up_interruptible(&dev->irq_wq);
應用程式在使用時,可以有多種方式:select,poll,epoll。select和poll功能和實現原理相似。當多路復用的檔案數量比較龐大。io流量頻繁時,一般不太適合使用select()和poll(),此種情況下select()和poll()的效能較差,比較適合使用epoll。epoll的最大好處是不會隨著fd數目增長而降低效率,select()會隨著fd的數量增大效能下降明顯。
1)select:
fd_set rfds;
while (1)
}
2)poll:
struct pollfd fds;
fds.fd = fd;
fds.events = pollin; //請求型別是 普通或優先順序帶資料可讀
while (1)
else if (ret > 0) //poll機制被喚醒,表示有資料可讀
}
linux 核心 驅動
首先 1.建立裝置 分配cdev結構體 if globalmem major 手動分配 ret register chrdev region devno,1,globalmem else globalmem 提供給上層使用 2 建立核心裝置 struct globalmem dev globalme...
新增linux核心驅動
1.將核心驅動.ko放入 lib modules 3.2.0 23 generic kernel drivers 目錄下 2.執行depmod a來解決依賴 掃瞄driver下的驅動依賴關係 命令執行完成後,會自動生成modules.dep 和modules.alias。dep為依賴關係。3.更新當...
Linux驅動 核心延時測試
linux驅動 核心延時測試 環境 主機 fedora12 目標板 mini6410 目標板linux核心版本 2.6.38 實現功能 延遲2s 方法1 利用系統全域性變數jiffies jiffies記錄系統節拍,每一次節拍,核心時鐘中斷函式會將jiffies加1.hz在arm中為100,表示1s...