日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]引言Linux是一個(gè)遵循POSIX標(biāo)準(zhǔn)的免費(fèi)操作系統(tǒng)。具有BSD和SYSV的擴(kuò)展特性。與其他操作系統(tǒng)相比,嵌入式Linux系統(tǒng)以其可應(yīng)用于多種硬件平臺(tái)、內(nèi)核高效穩(wěn)定、源碼開(kāi)放、軟件豐富、網(wǎng)絡(luò)通信和文件管理機(jī)制完善等優(yōu)良特性

引言

Linux是一個(gè)遵循POSIX標(biāo)準(zhǔn)的免費(fèi)操作系統(tǒng)。具有BSD和SYSV的擴(kuò)展特性。與其他操作系統(tǒng)相比,嵌入式Linux系統(tǒng)以其可應(yīng)用于多種硬件平臺(tái)、內(nèi)核高效穩(wěn)定、源碼開(kāi)放、軟件豐富、網(wǎng)絡(luò)通信和文件管理機(jī)制完善等優(yōu)良特性而正被作為研究熱點(diǎn),越來(lái)越多的研究人員采用Linux平臺(tái)來(lái)開(kāi)發(fā)自己的產(chǎn)品。Linux設(shè)備驅(qū)動(dòng)程序在Linux內(nèi)核源代碼中占有很大比例,從2.0、2.2到 2.4版本的內(nèi)核,源代碼的長(zhǎng)度日益增加,其實(shí)主要是設(shè)備驅(qū)動(dòng)程序在增加。

設(shè)備驅(qū)動(dòng)程序的編寫(xiě)

設(shè)備驅(qū)動(dòng)程序是linux內(nèi)核的一部分,是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口,它由一組函數(shù)和一些私有數(shù)據(jù)組成,是連接應(yīng)用程序與具體硬件的橋梁。Linux的一個(gè)基本特點(diǎn)是它對(duì)硬件設(shè)備的管理抽象化,系統(tǒng)中的每一個(gè)設(shè)備都用一個(gè)特殊的文件來(lái)表示。所有的硬件設(shè)備都像普通的文件一樣看待,使用與操作系統(tǒng)相同的標(biāo)準(zhǔn)系統(tǒng)來(lái)進(jìn)行打開(kāi)、讀寫(xiě)和關(guān)閉。

在Linux 操作系統(tǒng)下有3類(lèi)主要的設(shè)備文件類(lèi)型:塊設(shè)備、字符設(shè)備、網(wǎng)絡(luò)設(shè)備。字符設(shè)備是指存取時(shí)沒(méi)有緩存的設(shè)備??上裎募粯釉L問(wèn)字符設(shè)備,字符設(shè)備驅(qū)動(dòng)程序負(fù)責(zé)實(shí)現(xiàn)這些行為。系統(tǒng)的控制臺(tái)和并口就是字符設(shè)備的例子,它們可以很好地用“流”來(lái)描述。塊設(shè)備是文件系統(tǒng)的宿主,如磁盤(pán)。 Linux允許像字符設(shè)備那樣讀取塊設(shè)備——允許一次傳輸任意數(shù)目的字節(jié)。結(jié)果是,字符設(shè)備和塊設(shè)備讀取數(shù)方式一致。而網(wǎng)絡(luò)設(shè)備不同于字符設(shè)備和塊設(shè)備, 它面向的上一層不是文件系統(tǒng)而是網(wǎng)絡(luò)協(xié)議層,是通過(guò)BSD套接口訪問(wèn)數(shù)據(jù)。與設(shè)備相對(duì)應(yīng)的是三類(lèi)設(shè)備驅(qū)動(dòng)程序,字符設(shè)備驅(qū)動(dòng)程序、塊設(shè)備驅(qū)動(dòng)程序、網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序。

字符設(shè)備驅(qū)動(dòng)程序、塊設(shè)備驅(qū)動(dòng)程序與網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的結(jié)構(gòu)體是不同的。

在linux 源代碼linux/ include / linux/ fs. h中定義了字符設(shè)備和塊設(shè)備驅(qū)動(dòng)程序中必須使用的file_operations結(jié)構(gòu),每個(gè)設(shè)備驅(qū)動(dòng)都實(shí)現(xiàn)這個(gè)接口所定義的部分或全部函數(shù)。隨著內(nèi)核的不斷升級(jí), file_operations結(jié)構(gòu)也越來(lái)越大,不同的版本的內(nèi)核會(huì)稍有不同。file_operations定義如下:

struct file_operations{

int( * lseek) ( struct inode * , struct file * , off_t , int) ;          int( *release) ( struct inode * , struct file * ) ;

int( * read) ( struct inode * , struct file * , char * , int) ;        int( * fsync) ( struct inode *, struct file * ) ;

int( *write) ( struct inode * , struct file * , const char *, int) ;        int( * fasync) ( struct inode * , struct file *, int) ;

int( * readdir) ( struct inode  , struct file  , void * , dilldir) ;   int( *check_media_change) ( kdev_t dev) ;

int(*select) ( struct inode *, struct file * , int, select_table * ) ;   int( * revalidate) ( kdev_t dev) ; };

int ( * ioctl) ( struct inode * , struct file *, unsigned int, unsigned long) ;

int( *mmap) ( struct inode * , struct file * , struct vm_area_struct * ) ;

int( * open) ( struct inode *, struct file *) ;

應(yīng)用程序只有通過(guò)對(duì)設(shè)備文件的open、release、read、write、ioctl等才能訪問(wèn)字符設(shè)備和塊設(shè)備。用戶(hù)自己定義好 file_operations結(jié)構(gòu)后,編寫(xiě)出設(shè)備實(shí)際所需要的各操作函數(shù),對(duì)于不需要的操作函數(shù)用NULL初始化,這些操作函數(shù)將被注冊(cè)到內(nèi)核,當(dāng)應(yīng)用程序?qū)υO(shè)備相應(yīng)的設(shè)備文件進(jìn)行文件操作時(shí),內(nèi)核會(huì)找到相應(yīng)的操作函數(shù),并進(jìn)行調(diào)用。如果操作函數(shù)使用NULL,操作函數(shù)就進(jìn)行默認(rèn)處理。

對(duì)于字符設(shè)備而言,llseek( ),read( ),write(),ioctl( ),open( ),release( )這些函數(shù)是不可缺的;對(duì)于塊設(shè)備,open( ),release( ),ioctl(),check_media_change( ),revalidate( )是不可缺少的。

網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)體 net_device 定義在 includelinuxnetdevice.h 里,如下所示:

struct net_device

{

char   name ;                 int (*init)(struct

net_device *dev);

unsigned short  flags ;           int (*open)

(struct net_device *dev);

unsigned long   base_addr;      int

(*stop)(struct net_device *dev)

unsigned int    irq ;            int

(*hard_start_xmit)(struct sk_buff *skb,

unsigned char   dev_addr;       struct

net_device *dev);

unsigned char   addr_len;        int

(*set_mac_address)( struct net_device

unsigned long   trans_start;      *dev,void* addr);

……

}

定義好net_device結(jié)構(gòu)體后,根據(jù)實(shí)際情況編寫(xiě)操作函數(shù),其中hard_start_xmit()函數(shù)是用來(lái)發(fā)送數(shù)據(jù)的,set_mac_address()是進(jìn)行網(wǎng)絡(luò)參數(shù)設(shè)置的。

當(dāng)linux初始化時(shí)將調(diào)用初始化函數(shù)int device_init( ),該函數(shù)包括以下內(nèi)容:

注冊(cè)所用設(shè)備。linux用設(shè)備號(hào)來(lái)標(biāo)識(shí)字符設(shè)備和塊設(shè)備。設(shè)備號(hào)分為主設(shè)備號(hào)和從設(shè)備號(hào),最終形成設(shè)備接點(diǎn)。設(shè)備節(jié)點(diǎn)在訪問(wèn)字符設(shè)備和塊設(shè)備的設(shè)備驅(qū)動(dòng)程序時(shí)將使用。通常主設(shè)備號(hào)標(biāo)識(shí)設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)程序,大多數(shù)設(shè)備是“一個(gè)主設(shè)備號(hào)對(duì)應(yīng)一個(gè)驅(qū)動(dòng)程序”,如:虛擬控制臺(tái)和串口終端由驅(qū)動(dòng)程序4管理。次設(shè)備號(hào)由內(nèi)核使用,用于確定設(shè)備文件所指的設(shè)備。字符設(shè)備和塊設(shè)備注冊(cè)時(shí)必須先定義好設(shè)備號(hào)。

字符設(shè)備注冊(cè)函數(shù)如下:

int register_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);

其中 major是主設(shè)備號(hào)。

由于對(duì)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的訪問(wèn)不需要設(shè)備節(jié)點(diǎn),它的注冊(cè)函數(shù)如下:

int register_netdev(struct net_device *dev)

注冊(cè)設(shè)備所用的中斷。中斷在現(xiàn)代計(jì)算機(jī)結(jié)構(gòu)中有重要的地位,操作系統(tǒng)必須提供程序響應(yīng)中斷的能力。一般是把一個(gè)中斷處理程序注冊(cè)到系統(tǒng)中去。操作系統(tǒng)在硬件中斷發(fā)生后調(diào)用驅(qū)動(dòng)程序的處理程序。

注冊(cè)中斷所用的函數(shù)如下:

int request_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);

其中,irq是中斷向量;handler是中斷處理函數(shù);flags是中斷處理中的掩碼;devices是設(shè)備名;dev_id是在中斷共享使用的id。

當(dāng)linux不使用該設(shè)備時(shí),就要調(diào)用清除函數(shù)void_devicie_exit ( ),它同初始化函數(shù)相對(duì)應(yīng)的,主要是:

注銷(xiāo)設(shè)備,字符設(shè)備注銷(xiāo)函數(shù)如下:

int unregister_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);

注銷(xiāo)中斷,注銷(xiāo)中斷所用的函數(shù)如下:

int free_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);

釋放資源,模塊初始化和清除函數(shù)采用module_init(device_init),module_exit(device_exit) 形式

編寫(xiě)服務(wù)子程序

服務(wù)于I/O請(qǐng)求的子程序,又稱(chēng)為驅(qū)動(dòng)程序的上半部分。調(diào)用這部分是由于系統(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行的時(shí)候.系統(tǒng)仍認(rèn)為是和進(jìn)行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)程. 只是用戶(hù)態(tài)變成了核心態(tài),具有進(jìn)行此系統(tǒng)調(diào)用的用戶(hù)程序的運(yùn)行環(huán)境.因此可以在其中調(diào)用sleep等與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。

中斷服務(wù)子程序,又稱(chēng)為驅(qū)動(dòng)程序的下半部分。在Linux系統(tǒng)中.并不是直接從中斷向量表中調(diào)用設(shè)備驅(qū)動(dòng)程序的中斷服務(wù)子程序,而是由Linux系統(tǒng)來(lái)接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務(wù)子程序。中斷可以產(chǎn)生在任何一個(gè)進(jìn)程運(yùn)行的時(shí)候,因此在中斷服務(wù)程序被調(diào)用的時(shí)候.不能依賴(lài)于仟何進(jìn)程的狀態(tài),也就不能調(diào)用任何與進(jìn)程運(yùn)行環(huán)境相關(guān)的函數(shù)。因?yàn)樵O(shè)備驅(qū)動(dòng)程序一般支持同一類(lèi)型的若干設(shè)備,所以一般在系統(tǒng)調(diào)用中斷服務(wù)程序的時(shí)候,都帶有一個(gè)或多個(gè)參數(shù),以唯一標(biāo)識(shí)請(qǐng)求服務(wù)的設(shè)備。

設(shè)備驅(qū)動(dòng)程序的使用

直接將驅(qū)動(dòng)程序編譯進(jìn)linux內(nèi)核

將設(shè)備驅(qū)動(dòng)程序復(fù)制到 linux/drivers相關(guān)的子目錄下,比如字符設(shè)備驅(qū)動(dòng)程序 就放在linux/drivers/char下。

修改linux/drivers相關(guān)的子目錄的Makefile,

如obj-$(config_dev_driver) +=dev_driver.o,這樣在編譯內(nèi)核時(shí)將會(huì)編譯dev_driver.c,生成 dev_driver.o.

對(duì)內(nèi)核進(jìn)行重新編譯時(shí),進(jìn)行相關(guān)的配置,比如要使用AT91RM9200的UART,就要如下配置:

Character devices -> Serial drivers ->AT91RM9200 serial port support

將驅(qū)動(dòng)程序編譯成驅(qū)動(dòng)模塊

在設(shè)備驅(qū)動(dòng)程序中要有兩個(gè)重要函數(shù):

module_init(dev_init),module_exit(dev_exit)

利用相應(yīng)的交叉編譯器以及編譯命令將驅(qū)動(dòng)程序dev_driver.c編譯成dev_driver.o 這樣的動(dòng)態(tài)驅(qū)動(dòng)模塊。利用insmod命令給系統(tǒng)安裝驅(qū)動(dòng)模塊,如果在/dev目錄下沒(méi)有相應(yīng)的設(shè)備文件,就可以使用mknod創(chuàng)建一個(gè)設(shè)備文件。利用 rmmod命令卸載驅(qū)動(dòng)模塊,設(shè)備文件的刪除可以用rm命令。

結(jié)語(yǔ)

設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)是在Linux環(huán)境中最復(fù)雜的編程任務(wù)之一 。它需要和硬件打交道,容易引起系統(tǒng)崩潰,而且很難調(diào)試。掌握設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)技術(shù),將使得開(kāi)發(fā)嵌入式Linux的系統(tǒng)更為迅速和有效。

參考文獻(xiàn):

1.  AlessandroRubmi,JonathanCorbet.Linux設(shè)備驅(qū)動(dòng)程序,第3版,中國(guó)電力出版社,2006.2

2.  毛德操、胡希明,Linux內(nèi)核源代碼情景分析,浙江大學(xué)出版社,2001

3.  周立功、陳明記、陳渝,ARM嵌入式linux系統(tǒng)構(gòu)建與驅(qū)動(dòng)開(kāi)發(fā),北京航空航天大學(xué)出版社,2006年1月第1版

4.  李祥兵、鄭扣根,Linux中I2C總線驅(qū)動(dòng)程序的開(kāi)發(fā),計(jì)算機(jī)工程與設(shè)計(jì),2005;26(1)

5.  鄭偉、王欽若,Linux內(nèi)核空間設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā),微計(jì)算機(jī)信息,2003;19(12)

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

武漢2025年9月9日 /美通社/ -- 7月24日,2025慧聰跨業(yè)品牌巡展——湖北?武漢站在武漢中南花園酒店隆重舉辦!本次巡展由慧聰安防網(wǎng)、慧聰物聯(lián)網(wǎng)、慧聰音響燈光網(wǎng)、慧聰LED屏網(wǎng)、慧聰教育網(wǎng)聯(lián)合主辦,吸引了安防、...

關(guān)鍵字: AI 希捷 BSP 平板

上海2025年9月9日 /美通社/ -- 9月8日,移遠(yuǎn)通信宣布,其自研藍(lán)牙協(xié)議棧DynaBlue率先通過(guò)藍(lán)牙技術(shù)聯(lián)盟(SIG)BQB 6.1標(biāo)準(zhǔn)認(rèn)證。作為移遠(yuǎn)深耕短距離通信...

關(guān)鍵字: 藍(lán)牙協(xié)議棧 移遠(yuǎn)通信 COM BSP

上海2025年9月9日 /美通社/ -- 為全面落實(shí)黨中央、國(guó)務(wù)院和上海市委、市政府關(guān)于加快發(fā)展人力資源服務(wù)業(yè)的決策部署,更好發(fā)揮人力資源服務(wù)業(yè)賦能百業(yè)作用,8月29日,以"AI智領(lǐng) HR智鏈 靜候你來(lái)&quo...

關(guān)鍵字: 智能體 AI BSP 人工智能

北京2025年9月8日 /美通社/ -- 近日,易生支付與一汽出行達(dá)成合作,為其自主研發(fā)的"旗馭車(chē)管"車(chē)輛運(yùn)營(yíng)管理平臺(tái)提供全流程支付通道及技術(shù)支持。此次合作不僅提升了平臺(tái)對(duì)百余家企業(yè)客戶(hù)的運(yùn)營(yíng)管理效率...

關(guān)鍵字: 一汽 智能化 BSP SAAS

深圳2025年9月8日 /美通社/ -- 晶泰科技(2228.HK)今日宣布,由其助力智擎生技制藥(PharmaEngine, Inc.)發(fā)現(xiàn)的新一代PRMT5抑制劑PEP0...

關(guān)鍵字: 泰科 AI MT BSP

上海2025年9月5日 /美通社/ -- 由上海市經(jīng)濟(jì)和信息化委員會(huì)、上海市發(fā)展和改革委員會(huì)、上海市商務(wù)委員會(huì)、上海市教育委員會(huì)、上海市科學(xué)技術(shù)委員會(huì)指導(dǎo),東浩蘭生(集團(tuán))有限公司主辦,東浩蘭生會(huì)展集團(tuán)上海工業(yè)商務(wù)展覽有...

關(guān)鍵字: 電子 BSP 芯片 自動(dòng)駕駛

推進(jìn)卓越制造,擴(kuò)大產(chǎn)能并優(yōu)化布局 蘇州2025年9月5日 /美通社/ --?耐世特汽車(chē)系統(tǒng)與蘇州工業(yè)園區(qū)管委會(huì)正式簽署備忘錄,以設(shè)立耐世特亞太總部蘇州智能制造項(xiàng)目。...

關(guān)鍵字: 智能制造 BSP 汽車(chē)系統(tǒng) 線控

慕尼黑和北京2025年9月4日 /美通社/ -- 寶馬集團(tuán)宣布,新世代首款量產(chǎn)車(chē)型BMW iX3將于9月5日全球首發(fā),9月8日震撼亮相慕尼黑車(chē)展。中國(guó)專(zhuān)屬版車(chē)型也將在年內(nèi)與大家見(jiàn)面,2026年在國(guó)內(nèi)投產(chǎn)。 寶馬集團(tuán)董事...

關(guān)鍵字: 寶馬 慕尼黑 BSP 數(shù)字化

北京2025年9月4日 /美通社/ --?在全球新一輪科技革命與產(chǎn)業(yè)變革的澎湃浪潮中,人工智能作為引領(lǐng)創(chuàng)新的核心驅(qū)動(dòng)力,正以前所未有的深度與廣度重塑各行業(yè)發(fā)展格局。體育領(lǐng)域深度融入科技變革浪潮,駛?cè)霐?shù)字化、智能化轉(zhuǎn)型快車(chē)...

關(guān)鍵字: 人工智能 智能體 AI BSP

上海2025年9月2日 /美通社/ -- 近日,由 ABB、Moxa(摩莎科技)等八家企業(yè)在上海聯(lián)合發(fā)起并成功舉辦"2025 Ethernet-APL 技術(shù)應(yīng)用發(fā)展大會(huì)"。會(huì)議以"破界?融合...

關(guān)鍵字: ETHERNET 智能未來(lái) BSP 工業(yè)通信
關(guān)閉