我正在爲某個基於ARM的Linux板(實際上是一個自定義UART驅動程序)實現自定義串行總線驅動程序。該驅動程序應通過自定義協議啓用與總線另一端的某個MCU的通信。驅動程序不會(並且實際上不可能)將其任何功能公開給用戶空間,也不可能在用戶空間中實現它(因此,需要定製驅動程序而不是使用庫存TTY子系統)。在Linux內核中實現正確的模塊間同步
驅動程序將執行通信協議和UART讀/寫,並且它必須向用戶輸出一組更高級的功能,以允許它們與MCU通信(例如,read_register()
,drive_gpios()
,所有這些東西) 。這個模塊只有一個用戶。
調用模塊將不得不等待操作完成(前面提到的read_register()
等)。我目前正在考慮使用信號量:用戶模塊會調用我的驅動函數,它將啓動傳輸並等待信號;我的驅動程序的IRQ處理程序將向MCU發送請求並讀取答案,並在完成後發送到信號量,從而喚醒調用模塊。但是我對內核編程並不十分熟悉,我對許多可能的替代實現(tasklets?等待隊列?)感到困惑。
問題是:我的基於信號量的方法好還是太天真?什麼是可能的選擇?我可能缺少任何缺陷嗎?
信號量應該從我所理解的工作中去理解更好的linux內部請參閱好的書「linex內核開發第3版」,它是免費的pdf並且是最新的(.39內核我相信)。這本書並沒有深入,但它解釋了基本原則並顯示了選項。玩得開心。 – AoeAoe 2012-04-02 11:21:48
一本好書,謝謝!如果其他人有興趣,我還建議獲得Linux驅動程序開發和Linux內核模塊開發(兩者均可免費在線獲取) – 2012-04-02 12:17:40