您好,登錄后才能下訂單哦!
對同步問題,需要注意:
1)不能調用schedule的情況(wait_event、sleep等, 等待函數內部會調用schedule):
(1)中斷、
(2)軟中斷、
(3)tasklet、
(4)timer(基于軟中斷實現)、
(5)hrtimer (軟中斷或硬中斷環境下執行)執行環境下、
(6)或者“內核線程、普通線程內核態環境下調用了preempt_disable()/local_irq_disable()后”,
不能調用schedule()函數。
因為spin_lock成功后,spin_lock內部調用了preempt_disable,所以spin_lock后,不能調用schedule()。當然spin_unlock會調用preempt_enable,所以后面可以根據什么執行context來判斷是否能調用schedule()函數。
2)能調用等待函數的情況
(1) workqueue(內部實現用到kernel thread)、
(2) kernel thread、
(3) 普通線程的內核態,
這些context下,可以調用schedule()。前提是沒有調用preempt_disable禁止搶占和local_irq_disable禁止中斷等操作時。
具體的原因和原理,請看我的課程:
https://edu.51cto.com/course/17155.html
和
https://edu.51cto.com/course/17132.html
關于具體的寫linux驅動的方法、技巧和注意事項,歡迎觀看我的《如何編寫linux設備驅動》的視頻:
https://edu.51cto.com/course/17132.html
另外我的相關培訓視頻請看:
歡迎觀看我發布的各個課程: https://edu.51cto.com/lecturer/8896847.html
另外我的免費的linux各種驅動開發課程如下:
https://edu.51cto.com/course/17138.html
另外關于《關于如何編寫linux設備驅動》
1)首先確定硬件接口使用的總線,
2)然后確定要實現的功能,是網卡、sensor還是什么?再確定對上層應用暴露的接口, 從而選擇子系統,例如iio、input子系統等。由于linux只有字符設備、塊設備、網絡設備三種設備,其實iio、input子系統都是字符設備,只是它們幫你封裝好了字符設備的file_operations和Major設備號了,另外提供統一的sysfs接口(一類sysfs接口)。你只需要按照子系統要求注冊進子系統就行。子系統就像應用和你驅動之間的framework中間層,它幫你處理了很多通用的功能。另外自己再加入一些specific的sysfs接口即可。
確定了上面這些后,你就可以找到對應的例子去抄(參考)了。說白了,linux 內核設計者已經給你搭好了大的框架,你所要思考框架的東西并不多,你需要的是熟悉內核提供了什么框架子系統,如何使用。
什么樣的bus,決定你調用什么總線API去訪問硬件,什么樣的功能決定你用什么樣的子系統來暴露接口給上層應用使用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。