標籤:
代碼矗用分為靜態和動態兩種。在上 節介紹的方式是代碼的靜態重用,這種方式是代碼級的重用,也就是將需要重用的代碼和使用這些代碼的使用者放在 起進行編譯,最終產生 個可執行檔或程式C. ko .so 等) 8-1 測試 mu ti fi iver 驅動在本節將介紹另外 種代碼共用的方式:模組依賴,也稱為匯出符號。如果只能用一句話解釋如何利用匯出符號實現代碼共卒,這句話就是“在 個驅動模組裡使用另 個驅動模組裡的被匯出的符號(常章、變數、函數等〉”
由於 ymbol_ consumer 驅動使用了 symbo I_producer 驅動中匯出的符號,因此,在安裝
ψnbol_ consumer 之前, 需要先安裝 symbol_producer ,否則會輸出如 的錯誤資訊。
insmod: eπor inserting ’symbol_consumer.ko‘: -1 Unknown symbol in module
depmod 令用於分析 inux 筷塊之間的依賴性,這 功能在多個 Linux 模組之間擁有複雜的依賴關係方面非常有用。使用 depmod 分析 Linux模組的依賴關係 ,就可以使用modprobe 命令裝載 Lin 皿模組。 mod probe 命令全根據 depmod 命令成的 Linux 模組依賴關係來裝載 Linux 模組,並不需要像使用 ins mod 命令那樣挨個裝載 inux 模組。
如果在模擬器或開發板上採用動態裝載.ko 檔案的方式測試 Linux 驅動,就算無法正常卸載 Linux 驅動,只要重新啟動模擬器或開發板,動態 Linux 模壞就會從 存中卸載。
情況1 初始化函數崩潰
由於 Linux 驅動模組的初始化函數(通詮module_ init 宏指定的函數〉進行了某些操作而崩潰,從而導致初始化函數無法正常返田二這種情況的表現是當前 nux 驅動模組沒用被任何其他的linux 驅動模組使用,但卻顯示已經被引用 一了一次。
使用 rmmo d bad driver 命令細載bad drive 時會輸出如下的資訊,但卻找不到使用 ad_ driverl 的其他linux 模組
情況 2卸載函數被阻塞
在使用 rmmod 命令卸載 Linux 驅動時,系統會調用卸載函數(跑過 modu le_ exit 宏指定的函數),只有卸載函數成功返回肘, Linux 動才會被翻載。如果卸載函數被阻塞(可能是死迴圈、並發等情況引起的阻塞), rmmod 命令也會被阻塞 也就是說永遠不會執行到卸載 Linux 驅動模組的代碼。
首先看第 種情況。這種情況的關鍵是引用計數器的值和引用者不 致。實際上引用者是不存在的,因此,只需要將當前的 inux 驅動模組的引用計數器清零即可。
第2種情況的問題根源就是卸載函數,因此,只要將原來的卸載函數替換成一個空的卸載函數即可。
不管是哪種情況,都需要解決 個不可迴避的問題,就是要擷取表示要卸載的 Linux 驅動模組modu le 結構體指標。因為 struct module 表示了 Linux 驅動的相關資訊.
pwm驅動
蜂鳴器也稱為 PWM (脈衝寬度調製〉,基本原理是通過脈衝來控制蜂鳴器的開啟和停止。為了方便,本書將蜂嗎然統稱為 PWM PWM 串連到了 TOUT 1連接埠
PWM使用 連接埠 GPFCON 存器進行控制。該寄存器在 Lin 皿核心中對應的宏是S3C64XX PF CON ,該宏表示 GPFCON 寄存器寄存器的虛擬位址。 GPFCON 只用了最高兩位( 3031 位〉來控制 PWM 。當最高兩位為 時,開啟 PWM 。為 時停止 PWM 。所以只需要通過 owrite3函數為 GPFCON 寄存器設定不同的值即可。
安卓深度探索(卷一)第八章