標籤:
蜂鳴器驅動
——第8章讀書筆記及心得
通過本章的學習,學會了pwm的驅動實驗,知道了蜂鳴器實現的原理。蜂鳴器是開發板上的一個硬體裝置,可以通過向寄存器寫入特定的值來控制蜂鳴器發出尖叫聲。本實驗將linux驅動區分成了多個實現檔案。學會了編寫Makefile檔案。知道了linux驅動模組的依賴。通過實驗學會了linux驅動常用的代碼重用方式及強行卸載linux驅動的方法。
在C語言中編譯多個原始碼檔案時,如果a.c使用了b.c檔案中的函數,需要在a.c檔案中使用extern預先定義b.c中的函數,extern的作用就是告訴編譯器該函數的函數名、參數個數、參數類型和傳回值類型。這些資訊用以將a.c編譯成a.o。將a.o和b.o串連成可執行檔或程式庫時,編譯器再到b.o中尋找函數的具體實現。所以extern只在編譯階段起作用。
在編譯時間,最關鍵的一步是編寫Makefile檔案。該檔案的代碼如下:
Obj-m := multi_file_driver.o
Multi_file_driver-objs :=main.o fun.o product.
其中在multi_file_driver目錄中有一個build.sh的指令檔,用於編譯和測試樣本。命令為:#sh build.sh。執行成功後可以使用demesg查看命令日誌資訊。
代碼重用分為靜態和動態兩種。靜態重用是代碼級的重用,需要將重用的代碼和使用者放在一起進行編譯。最後產生可執行檔檔案或程式庫。模組依賴(到處符號)是另一種代碼共用。在linux驅動中可以實現宏匯出的函數有兩個為EXPORT_SYMBOL和EXPORT_SYMOL_GPL(該函數僅用於GPL協議的linux驅動模組中)。
當linux驅動模組沒有被正常引用導致的linux驅動無法正常卸載,無法使用rmmod。卸載失敗可能的兩種原因:1、初始化函數崩潰,2、卸載函數被阻塞。當初始化函數崩潰時,需要將linux驅動模組的引用函數清零。可利用的函數“static inline try_module_get(struct module *module)”和“extern void module_put(struct module *module)”。當卸載函數被阻塞時,需要將原來的卸載函數替換成一個空的卸載函數即可。
蜂鳴器(脈衝寬度調製),基本原理是通過脈衝來控制蜂鳴器的開啟和停止。
Android深度探索——第八章讀書筆記及心得