嵌入式系統開發技術
課程設計
設計題目: 蜂鳴器驅動程式設計
2023年05月
1.緒論 3
1.1概要 3
1.2設計內容 4
2.開發環境的搭建 4
2.1redhat的安裝 4
2.2安裝arm-linux-gcc交叉編譯器 9
2.3安裝及編譯linux-2.6.29-mini2440-20090708核心 9
3.字元裝置驅動相關知識 9
3.1模組機制 9
3.2字元裝置開發基本步驟 10
3.3主裝置號和次裝置號 11
3.4實現字元驅動程式 12
4.蜂鳴器原理 14
4.1蜂鳴器的種類和工作原理 14
4.2開發板上蜂鳴器原理圖分析 15
4.3gpb0引數 15
5.總體設計 16
5.1設計思路 16
5.2設計步驟 16
6. 驅動及測試程式 17
176.2beep_ 21
7.執行結果及截圖 22
綜合設計總結與思考 25
linux 驅動在本質上就是一種軟體程式,上層軟體可以在不用了解硬體特性的情況下,通過驅動提供的介面,和計算機硬體進行通訊。
系統呼叫是核心和應用程式之間的介面,而驅動程式是核心和硬體之間的介面,也就是核心和硬體之間的橋梁。它為應用程式遮蔽了硬體的細節,這樣在應用程式看來,硬體裝置只是乙個裝置檔案,應用程式可以象操作普通檔案一樣對硬體裝置進行操作。
linux 驅動程式是核心的一部分,管理著系統中的裝置控制器和相應的裝置。它主要完成這麼幾個功能:對裝置初始化和釋放;傳送資料到硬體和從硬體讀取資料;檢測和處理裝置出現的錯誤。
一般來說,乙個驅動可以管理一種型別的裝置。例如不同的 u 盤都屬於 mass storage 裝置,我們不需要為每乙個 u 盤編寫驅動,而只需要乙個驅動就可以管理所有這些 mass storage 裝置。
為方便我們加入各種驅動來支援不同的硬體,核心抽象出了很多層次結構,這些層次結構是 linux 裝置驅動的上層。它們抽象出各種的驅動介面,驅動只需要填寫相應的**函式,就能很容易把新的驅動新增到核心。
一般來說, linux 驅動可以分為三類,就是塊裝置驅動,字元裝置驅動和網路裝置驅動。塊裝置的讀寫都有快取來支援,並且塊裝置必須能夠隨機訪問。塊裝置驅動主要用於磁碟驅動器。
而字元裝置的 i/o 操作沒有通過快取。字元裝置操作以位元組為基礎,但不是說一次只能執行乙個位元組操作。例如對於字元裝置我們可以通過 mmap 一次進行大量資料交換。
字元裝置實現比較簡單和靈活。
本次設計是簡單的字元裝置驅動設計,基於mini2440的蜂鳴器的驅動設計。
建立乙個虛擬機器:點選選單欄file->new->virtual machine。點選下一步。
選擇typical選項。
選擇linux下的red hat linux
填寫虛擬機器的命名和儲存位址。
選擇磁碟大小
將 複製到虛擬機器的root目錄下
解壓檔案:tar zxvf
在bash_profile裡新增路徑:gedit ~/.bash_profiel
路徑 /root/usr/local/arm/4.3.2/bin
source ~/.bash_profile 使更改生效
複製核心到root目錄下
解壓核心檔案 tar zxvf
使核心檔案生效:cp config_mini2440_n35 .config
使用make命令完成編譯
linux提供了機制被稱為模組(module)的機制
提供了對許多模組支援, 包括但不限於, 裝置驅動
每個模組由目標**組成( 沒有連線成乙個完整可執行程式 )
insmod 將模組動態載入到正在執行核心
rmmod 程式移除模組
linux核心模組的程式結構
● static int __init beep_init(void)---模組初始化函式
通過alloc_chrdev_region來分配裝置號beep_cdev來對裝置進行各種操作。比如在載入核心模組時,模組的載入函式會自動被核心執行,完成模組的相關初始化工作
● static void __exit beep_exit(void)---模組解除安裝函式(必須)
當通過unregister_chrdev_region命令解除安裝某模組時,模組的解除安裝函式會自動被核心執行,完成與模組裝載函式相反的功能
● module_license()---模組許可證宣告(必須)
模組許可證(license)宣告描述核心模組的許可許可權
如果不宣告license,模組被載入時,將收到核心被汙染(kernel tainted)的警告
● 其他一些宣告module_***xx()---模組宣告(可選)
模組載入函式
static int __init initialization_function(void)
module_init(initialization_function);
模組解除安裝函式
static void __exit cleanup_function(void)
module_exit(cleanup_function);
● 確定主裝置號和次裝置號
● 實現字元驅動程式
實現file_operations結構體
實現初始化函式,註冊字元裝置
實現銷毀函式,釋放字元裝置
● 建立裝置檔案節點
● 主裝置號是核心識別乙個裝置的標識。
整數(佔12bits),範圍從0到4095,通常使用1到255
● 次裝置號由核心使用,用於正確確定裝置檔案所指的裝置。
整數(佔20bits),範圍從0到1048575,一般使用0到255
● 裝置編號的內部表達
dev_t型別(32位):
用來儲存裝置編號(包括主裝置號(12位)和次裝置號(20位))
從dev_t獲得主裝置號和次裝置號:
major(dev_t);
minor(dev_t);
將主裝置號和次裝置號轉換成dev_t型別:
mkdev(int major,int minor);
● 分配主裝置號
手工分配主裝置號:找乙個核心沒有使用的主裝置號來使用。
#include
int register_chrdev_region( dev_t first, unsigned int count, char *name );
● 動態分配主裝置號:
#include
int alloc_chrdev_resion(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);
● 釋放裝置號
void unregister_chrdev_region(dev_t first, unsigned int count);
● cdev 結構體
struct cdev
;● file_operations 結構體
字元驅動和核心的介面:
在include/linux/定義
字元驅動只要實現乙個file_operations結構體
並註冊到核心中,核心就有了操作此裝置的能力。
● file_operations的主要成員:
open:開啟裝置
release:關閉裝置
read:從裝置上讀資料
write:向裝置上寫資料
ioctl:i/o控制函式
● ioctl函式
為裝置驅動程式執行「命令」提供了乙個特有的入口點
用來設定或者讀取裝置的屬性資訊。
int ioctl (struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg);
● cmd 引數的定義
不推薦用0x1,0x2,0x3之類的值
linux對ioctl()的cmd引數有特殊的定義
構造命令編號的巨集:
_io(type,nr)用於構造無引數的命令編號;
_ior(type,nr,datatype)用於構造從驅動程式中讀取資料的命令編號;
_iow(type,nr,datatype)用於寫入資料的命令;
_iowr(type,nr,datatype)用於雙向傳輸。
type和number位欄位通過引數傳入,而size位欄位通過對datatype引數取sizeof獲得。
● ioctl函式模板
int ***_ioctl( struct inode *inode, struct f ile *filp, unsigned int cmd,
unsigned long arg)
return 0;
}3.5字元裝置驅動結構
蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種型別。
案例式任務驅動的C程式設計教學方法
摘要 針對理工類非計算機專業計算機基礎教育課程體系中的c程式設計課程的案例式任務驅動教學方法。本文結合c語言編寫的實際案例,分析案例教學的優勢所在,同時闡明了任務驅動教學法的實施經過設計任務 布置任務 實踐任務和成果展示 評價學習任務等階段。以此激發學生的學習興趣,調動學生學習的積極性和主動性,從而...
任務驅動教學模式在C程式設計課程教學中的實踐
任務驅動教學模式在c 程式設計課程教學中的實踐作者 王建芳 中國校外教育 綜合 上旬 2012年第12期分析c 程式設計課程的特點,採用任務驅動教學模式的實踐教學培養學生的學習興趣,提高利用c 程式設計解決實際問題的綜合能力。c 程式設計實踐能力教學模式c 程式設計課程是計算機和軟體技術專業的一門基...
專案驅動式教學方法在C 語言程式設計中的應用
摘要 為了激發學生對c 語言程式設計課程的興趣,提高其動手能力和專案開發技能,結合國內外教學經驗,分析 了驅動式教學方法的實施要點和注意事項,提出專案驅動式教學方法必須要以教學為中心,不能脫離教學才能發揮更好的教學效果。關鍵詞 c 教學方法 專案驅動 過程控制 中圖分類號 tp312.1 4 文獻標...