2012-04-02 43 views
7

我正在爲某個基於ARM的Linux板(實際上是一個自定義UART驅動程序)實現自定義串行總線驅動程序。該驅動程序應通過自定義協議啓用與總線另一端的某個MCU的通信。驅動程序不會(並且實際上不可能)將其任何功能公開給用戶空間,也不可能在用戶空間中實現它(因此,需要定製驅動程序而不是使用庫存TTY子系統)。在Linux內核中實現正確的模塊間同步

驅動程序將執行通信協議和UART讀/寫,並且它必須向用戶輸出一組更高級的功能,以允許它們與MCU通信(例如,read_register(),drive_gpios(),所有這些東西) 。這個模塊只有一個用戶。

調用模塊將不得不等待操作完成(前面提到的read_register()等)。我目前正在考慮使用信號量:用戶模塊會調用我的驅動函數,它將啓動傳輸並等待信號;我的驅動程序的IRQ處理程序將向MCU發送請求並讀取答案,並在完成後發送到信號量,從而喚醒調用模塊。但是我對內核編程並不十分熟悉,我對許多可能的替代實現(tasklets?等待隊列?)感到困惑。

問題是:我的基於信號量的方法好還是太天真?什麼是可能的選擇?我可能缺少任何缺陷嗎?

+3

信號量應該從我所理解的工作中去理解更好的linux內部請參閱好的書「linex內核開發第3版」,它是免費的pdf並且是最新的(.39內核我相信)。這本書並沒有深入,但它解釋了基本原則並顯示了選項。玩得開心。 – AoeAoe 2012-04-02 11:21:48

+0

一本好書,謝謝!如果其他人有興趣,我還建議獲得Linux驅動程序開發和Linux內核模塊開發(兩者均可免費在線獲取) – 2012-04-02 12:17:40

回答

5

傳統IRQ在Linux中處理分兩部分完成:

  1. 所謂的「上半部」是IRQ方面的實際工作(IRQ處理程序本身)。這部分必須儘快退出。所以它基本上檢查中斷源,然後開始下半部分。

  2. 「下半部分」。它可能被實現爲工作隊列。這是實際工作完成的地方。它運行在正常範圍內,所以它可以使用阻塞函數等

如果你只是想等待IRQ在你的工作線程,最好使用特殊的對象稱爲completion。它正是爲這項任務而創建的。