第三次月考
第八章 讓開發板發出聲音:蜂鳴器驅動
一、linux代碼驅動的代碼重用:linux驅動的代碼重用有很多的方法,比如說用c程序的方式,將要重用的代碼放到其他文件中但是要在頭文件中聲明。還可以采用另外一種動態重用的方式就是一個linux驅動可以使用另一個驅動的內容,如函數等。編譯是由多個文件組成的linux驅動,如果linux驅動復雜,就需要多個linux文件來存放不同的功能,這樣有利于分類和管理。
二、強行卸載linux驅動:如果編寫的linux驅動程序在邏輯上是正確的,那么是可以正常裝載和卸載的,在有些情況下就不能正常裝載和卸載,Linux驅動無法卸載的情況:
情況一:初始化函數崩潰p
情況二:卸載函數被阻塞
三、蜂鳴器(pwm)驅動:蜂鳴器與LED一樣也是開發板自帶的簡單的硬件,若打開蜂鳴器開發板會發出想蜂鳴一樣的叫聲,關閉就會停止尖叫。蜂鳴器驅動的原理:pwm基本原理通過脈沖來控制蜂鳴器的打開和關閉。
測試蜂鳴器驅動:pwm_fun.c則包含了打開和停止pwm的兩個函數,從Makefile中可以看出,編譯器首先將pwm.c和pwm_fun.c文件編譯成pwm.o和pwm_fun.o,然后再將兩個.o文件連接成pwm_driver.o,最后生成pwm_driver.ko,然后執行build.sh腳本文件,然后就編譯成功了。
輸入如下命令:
./ioctl /dev/pwm_dev 1 0
./ioctl /dev/pwm_dev 0 0
由于命令必須要求輸入I/O命令的參數,而PWM驅動未使用I/O命令參數,所以ioctl最后一個命令行可以任意輸入參數。如果最后顯示如下信息并且蜂鳴器發出尖叫則說明測試成功!
第九章 硬件抽象層:HAL
HAL(Handerware Abstraction Layer,硬件抽象層)是建立在linux程序上的一套程序庫,這套程序庫并不屬于內核,而是屬于內核之上的應用層。
一、為什么要在Android中加入HAL:在linux驅動中一般有兩種類型的代碼:訪問硬件寄存器的代碼和業務邏輯代碼。對于訪問硬件寄存器的代碼而言,并沒有秘密,這都是調用linux內核的標準函數進行的標準操作。Google為android加入HAL其主要目的在于:
統一硬件的調用接口;
解決了GPL版權問題;‘
針對一些特殊要求;
二、andriod HAL架構
在Andriod系統中使用程序庫,條用位于內核空間的Linux驅動,然后Andriod應用程序。
HAL的基本原理是在android系統中使用程序庫調用內核空間的linux驅動。
三、 為LED增加HAL:將所有業務邏輯從LED驅動移植到HAL模塊,而LED驅動模塊只保留讀寫寄存器的工程能。加入HAL會使組成linux驅動的一整套library更加獨立,更加容易維護。編寫一款支持HAL的LINUX程序驅動程序的步驟:1.Linux驅動程序;2.編寫HAL Library;3.編寫Service Library。編寫HAL模塊的步驟:1.定義結構體和宏;2.編寫HAL模塊的open函數;3.定義hw_module_methods_t結構體變量;4.定義HAL_MODULE_INFO_SYM變量;5.編寫HAL模塊的close函數;6.編寫控制LED的函數。
第十章 嵌入式linux的調試技術
對于復雜的linux驅動及HAL等程序庫,需要使用各種方法對其進行調試
一、打印內核調試信息:printK:printK函數與printf函數類似,只不過printK函數運行在內核空間,printf函數運行在用戶空間。也就是說像linux驅動這樣的linux內核程序只能使用printK函數輸出調試信息。
二、防止printK函數降低linux驅動性能:雖然printK函數可以很方便的將消息寫入日志文件或控制臺,大那是大量使用printK函數操控日志文件或控制臺設備文件會嚴重影響linux的驅動性能。只要只在開發階段使用printK函數,在正式發布linux驅動時把有可能影響性能的printK函數去掉。
三、通過虛擬文件系統(/proc)進行數據交互:在linux文件系統中,/proc經常用來被作為用戶空間和內核空間進行數據交互的工具。/proc文件系統的行為方式和設備系統(/dev)的類似。
四、調試工具:gdb,gdbservice,和kgdb。
轉載于:https://www.cnblogs.com/zhaoruixia/p/5638572.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: 昂贵的聘礼(poj 1062)
- 下一篇: php 文件管理