資源描述:
《嵌入式系統(tǒng)基于linux驅(qū)動程序設(shè)計與實驗》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、嵌入式系統(tǒng)基于Linux驅(qū)動程序設(shè)計與實驗驅(qū)動模塊實驗二十一內(nèi)核驅(qū)動設(shè)計入門-模塊方式驅(qū)動實驗一、實驗?zāi)康膶W(xué)習(xí)在LINUX下進(jìn)行驅(qū)動設(shè)計的原理;掌握使用模塊方式進(jìn)行驅(qū)動開發(fā)調(diào)試的過程二、實驗內(nèi)容在PC機(jī)上編寫簡單的虛擬硬件驅(qū)動程序并進(jìn)行調(diào)試,實驗驅(qū)動的各個接口函數(shù)的實現(xiàn),分析并理解驅(qū)動與應(yīng)用程序的交互過程。三、預(yù)備知識有C語言基礎(chǔ);掌握在Linux下常用編輯器的使用;掌握Makefile的編寫和使用。;掌握Linux下的程序編譯與交叉編譯過程;有驅(qū)動開發(fā)的基本知識。四、實驗設(shè)備及工具硬件:PC機(jī)
2、Pentium500以上,硬盤40G以上,內(nèi)存大于128M。軟件:PC機(jī)操作系統(tǒng)REDHATLINUX9.0+MINICOM+AMR-LINUX開發(fā)環(huán)境五、實驗原理Linux中的驅(qū)動設(shè)計是嵌入式Linux開發(fā)中十分重要的部分,它要求開發(fā)者不僅要熟悉Linux的內(nèi)核機(jī)制、驅(qū)動程序與用戶級應(yīng)用程序的接口關(guān)系、考慮系統(tǒng)中對設(shè)備的并發(fā)操作等等,而且還要非常熟悉所開發(fā)硬件的工作原理。這對驅(qū)動開發(fā)者提出了比較高的要求,這個實驗主要是給大家進(jìn)入驅(qū)動設(shè)計提供一個簡單入門的一個實例,并不需要提供太多與硬件相關(guān)的內(nèi)
3、容,這部分應(yīng)該是通過仔細(xì)閱讀芯片廠家提供的資料來解決。驅(qū)動程序的作用是應(yīng)用程序與硬件之間的一個中間軟件層,驅(qū)動程序應(yīng)該為應(yīng)用程序展現(xiàn)硬件的所有功能,不應(yīng)該強(qiáng)加其他的約束,對于硬件使用的權(quán)限和限制應(yīng)該由應(yīng)用程序?qū)涌刂?。但是有時驅(qū)動程序的設(shè)計是跟所開發(fā)的項目相關(guān)的,這時就可能在驅(qū)動層加入一些與應(yīng)用相關(guān)的設(shè)計考慮,主要是因為在驅(qū)動層的效率比應(yīng)用層高,同時為了項目的需要可能只強(qiáng)化或優(yōu)化硬件的某個功能,而弱化或關(guān)閉其他一些功能;到底需要展現(xiàn)硬件的哪些功能全都由開發(fā)者根據(jù)需要而定。驅(qū)動程序有時會被多個進(jìn)程同
4、時使用,這時我們要考慮如何處理并發(fā)的問題,就需要調(diào)用一些內(nèi)核的函數(shù)使用互斥量和鎖等機(jī)制。驅(qū)動程序主要需要考慮下面三個方面:提供盡量多的選項給用戶,提高驅(qū)動程序的速度和效率,盡量使驅(qū)動程序簡單,使之易于維護(hù)。Linux的驅(qū)動開發(fā)調(diào)試有兩種方法,一種是直接編譯到內(nèi)核,再運行新的內(nèi)核來測試;二是編譯為模塊的形式,單獨加載運行調(diào)試。第一種方法效率較低,但在某些場合是唯一的方法。模塊方式調(diào)試效率很高,它使用insmod工具將編譯的模塊直接插入內(nèi)核,如果出現(xiàn)故障,可以使用rmmod從內(nèi)核中卸載模塊。不需要重
5、新啟動內(nèi)核,這使驅(qū)動調(diào)試效率大大提高。我們的實驗在PC機(jī)和UP-NETARM2410-S上都可以運行,編譯時使用不同的編譯器就可以了。1.驅(qū)動程序與應(yīng)用程序的區(qū)別應(yīng)用程序一般有一個main函數(shù),從頭到尾執(zhí)行一個任務(wù);驅(qū)動程序卻不同,它沒有main函數(shù),通過使用宏module_init(初始化函數(shù)名);將初始化函數(shù)加入內(nèi)核全局初始化函數(shù)列表中,在內(nèi)核初始化時執(zhí)行驅(qū)動的初始化函數(shù),從而完成驅(qū)動的初始化和注冊,之后驅(qū)動便停止等待被應(yīng)用軟件調(diào)用。驅(qū)動程序中有一個宏moudule_exit(退出處理函數(shù)名
6、)注冊退出處理函數(shù)。它在驅(qū)動退出時被調(diào)用。應(yīng)用程序可以和GLIBC庫連接,因此可以包含標(biāo)準(zhǔn)的頭文件,比如,在驅(qū)動程序中是不能使用標(biāo)準(zhǔn)C庫的,因此不能調(diào)用所有的C庫函數(shù),比如輸出打印函數(shù)只能使用內(nèi)核的printk函數(shù),包含的頭文件只能是內(nèi)核的頭文件,比如。2.內(nèi)核版本與編譯器的版本依賴當(dāng)模塊與內(nèi)核鏈接時,insmod會檢查模塊和當(dāng)前內(nèi)核版本是否匹配,每個模塊都定義了版本符號__module_kernel_version,這個符號
7、位于模塊文件的ELF頭的.modinfo段中。只要在模塊中包含,編譯器就會自動定義這個符號。每個內(nèi)核版本都需要特定版本的編譯器的支持,高版本的編譯器并不適合低版本的內(nèi)核,比如UP-NETARM2410-S實驗儀中的LINUX-2.4.19的內(nèi)核需要2.95.3的GCC版本編譯器。Linux-2.4版本的insmod命令裝載模塊時,首先從/lib/modules目錄和內(nèi)核相關(guān)的子目錄中查找模塊文件,如果需要從當(dāng)前目錄裝載,使用insmodmodule.o。3.主設(shè)備
8、號和次設(shè)備號傳統(tǒng)方式中的設(shè)備管理中,除了設(shè)備類型外,內(nèi)核還需要一對稱作主次設(shè)備號的參數(shù),才能唯一標(biāo)識一個設(shè)備。主設(shè)備號相同的設(shè)備使用相同的驅(qū)動程序,次設(shè)備號用于區(qū)分具體設(shè)備的實例。比如PC機(jī)中的IDE設(shè)備,一般主設(shè)備號使用3,WINDOWS下進(jìn)行的分區(qū),一般將主分區(qū)的次設(shè)備號為1,擴(kuò)展分區(qū)的次設(shè)備號為2、3、4,邏輯分區(qū)使用5、6….。設(shè)備操作宏MAJOR()和MINOR()可分別用于獲取主次設(shè)備號,宏MKDEV()用于將主設(shè)備號和次設(shè)備號合并為設(shè)備號,這些宏定義在include/linux/k