1. gzyueqian
      13352868059

      粵嵌概述嵌入式設(shè)備驅(qū)動(dòng),教你怎么“玩”轉(zhuǎn)嵌入式開發(fā)

      更新時(shí)間: 2018-11-08 14:16:10來源: 嵌入式瀏覽量:5473

          一、設(shè)備驅(qū)動(dòng)的作用
          對(duì)設(shè)備驅(qū)動(dòng)通俗的解釋就是“驅(qū)使硬件設(shè)備行動(dòng)”。設(shè)備驅(qū)動(dòng)與底層硬件直接打交道,按照硬件設(shè)備的具體工作方式讀寫設(shè)備寄存器,完成設(shè)備的輪詢、中斷處理、DMA通信,進(jìn)行物理內(nèi)存向虛擬內(nèi)存的映射,終使通信設(shè)備能夠收發(fā)數(shù)據(jù),使顯示設(shè)備能夠顯示文字和畫面,使存儲(chǔ)設(shè)備能夠記錄文件和數(shù)據(jù)。此可見,設(shè)備驅(qū)動(dòng)充當(dāng)了硬件和應(yīng)用軟件之間的紐帶,它使得應(yīng)用軟件只需要調(diào)用系統(tǒng)軟件的應(yīng)用編程接口(API)就可讓硬件去完成要求的工作。在系統(tǒng)中沒有操作系統(tǒng)的情況下,工程師可以根據(jù)硬件設(shè)備的特點(diǎn)自行定義接口,自己為函數(shù)命名。而在有操作系統(tǒng)的情況下,設(shè)備驅(qū)動(dòng)的架構(gòu)則由相應(yīng)的操作系統(tǒng)定義,驅(qū)動(dòng)工程師必須按照相應(yīng)的架構(gòu)設(shè)計(jì)設(shè)備驅(qū)動(dòng),這樣,設(shè)備驅(qū)動(dòng)才能良好地整合到操作系統(tǒng)的內(nèi)核中。
          二、無操作系統(tǒng)的設(shè)備驅(qū)動(dòng)
          并不是任何一個(gè)計(jì)算機(jī)系統(tǒng)都一定要運(yùn)行操作系統(tǒng),在許多情況下操作系統(tǒng)是不必要的。對(duì)于功能比較單一、控制并不復(fù)雜的系統(tǒng)并不需要多任務(wù)調(diào)度、 文件系統(tǒng)、 內(nèi)存管理等復(fù)雜功能,用單任務(wù)架構(gòu)完全可以很好地支持它們的工作。 一個(gè)無限循環(huán)中夾雜對(duì)設(shè)備中斷的檢測(cè)或者對(duì)設(shè)備的輪詢是這種系統(tǒng)中軟件的典型架構(gòu)。如圖:
          在這樣的系統(tǒng)中,雖然不存在操作系統(tǒng),但是設(shè)備驅(qū)動(dòng)是必須存在的。一般情況下,對(duì)每一種設(shè)備驅(qū)動(dòng)都會(huì)定義為一個(gè)軟件模塊,包含.h文件和.c文件,前者定義該設(shè)備驅(qū)動(dòng)的數(shù)據(jù)結(jié)構(gòu)并聲明外部函數(shù),后者進(jìn)行設(shè)備驅(qū)動(dòng)的具體實(shí)現(xiàn)。其他模塊需要使用這個(gè)設(shè)備的時(shí)候,只需要包含設(shè)備驅(qū)動(dòng)的頭文件 serial.h ,然后調(diào)用其中的外部接口函數(shù)即可。
          由此可見,在沒有操作系統(tǒng)的情況下, 設(shè)備驅(qū)動(dòng)的接口被直接提交給了應(yīng)用軟件工程師, 應(yīng)用軟件沒有跨越任層次就直接訪問了設(shè)備驅(qū)動(dòng)的接口。 設(shè)備驅(qū)動(dòng)包含的接口函數(shù)也與硬件的功能直接吻合, 沒有任何附加功能。如圖:
          三、有操作系統(tǒng)的設(shè)備驅(qū)動(dòng)
          操作系統(tǒng)的存在勢(shì)必要求設(shè)備驅(qū)動(dòng)附加更多的代碼和功能,把單一的“驅(qū)使硬件設(shè)備行動(dòng)”變成了操作系統(tǒng)內(nèi)與硬件交互的模塊,它對(duì)外呈現(xiàn)為操作系統(tǒng)的API,不再給應(yīng)用軟件工程師直接提供接口。
          首先,一個(gè)復(fù)雜的軟件系統(tǒng)需要處理多個(gè)并發(fā)的任務(wù),沒有操作系統(tǒng),想完成多任務(wù)并發(fā)是很困難的。其次,操作系統(tǒng)給我們提供內(nèi)存管理機(jī)制。一個(gè)典型的例子是,對(duì)于多數(shù)含MMU的處理器而言,Windows、Linux等操作系統(tǒng)可以讓每個(gè)進(jìn)程都獨(dú)立地訪問4GB的內(nèi)存空間。操作系統(tǒng)通過給設(shè)備驅(qū)動(dòng)制造麻煩來達(dá)到給上層應(yīng)用提供便利的目的。如果設(shè)備驅(qū)動(dòng)都按照操作系統(tǒng)給出的獨(dú)立于設(shè)備的接口而設(shè)計(jì),應(yīng)用程序?qū)⒖墒褂媒y(tǒng)一的系統(tǒng)調(diào)用接口來訪問各種設(shè)備。對(duì)于Linux 等操作系統(tǒng)而言, 應(yīng)用程序通過 write()、read()等函數(shù)讀寫文件就可以訪問各種字符設(shè)備和塊設(shè)備,而不用管設(shè)備的具體類型和工作方式,
          四、linux設(shè)備驅(qū)動(dòng)
          4.1設(shè)備的分類及特點(diǎn)
          計(jì)算機(jī)系統(tǒng)的硬件主要由CPU、存儲(chǔ)器和外設(shè)組成。目前,芯片的集成度越來越高,往往在CPU內(nèi)部就集成了存儲(chǔ)器和外設(shè)適配器。ARM、PowerPC、MIPS等處理器都集成了UART、I2C控制器、USB控制器、SDRAM控制器等,有的處理器還集成了片內(nèi) RAM 和 Fl ash 。驅(qū)動(dòng)針對(duì)的對(duì)象是存儲(chǔ)器和外設(shè)(包括 CPU 內(nèi)部集成的存儲(chǔ)器和外設(shè)) ,而不是針對(duì) CPU 核。Linux 將存儲(chǔ)器和外設(shè)分為 3 個(gè)基礎(chǔ)大類:
          字符設(shè)備;
          塊設(shè)備;
          網(wǎng)絡(luò)設(shè)備
          字符設(shè)備指那些必須以串行順序依次進(jìn)行訪問的設(shè)備,如觸摸屏、磁帶驅(qū)動(dòng)器、鼠標(biāo)等。塊設(shè)備可以用任意順序進(jìn)行訪問,以塊為單位進(jìn)行操作,如硬盤、軟驅(qū)等。字符設(shè)備不經(jīng)過系統(tǒng)的快速緩沖,而塊設(shè)備經(jīng)過系統(tǒng)的快速緩沖。但是,字符設(shè)備和塊設(shè)備并沒有明顯的界限,如Flash設(shè)備符合塊設(shè)備的特點(diǎn),但是我們?nèi)匀豢梢园阉鳛橐粋€(gè)字符設(shè)備來訪問。字符設(shè)備和塊設(shè)備的驅(qū)動(dòng)設(shè)計(jì)呈現(xiàn)出很大的差異,但是對(duì)于用戶而言,他們都使用文件系統(tǒng)的操作接口open()、close()、read()、write()等函數(shù)進(jìn)行訪問。在 Linux 系統(tǒng)中,網(wǎng)絡(luò)設(shè)備面向數(shù)據(jù)包的接收和發(fā)送而設(shè)計(jì),它并不對(duì)應(yīng)于文件系統(tǒng)的節(jié)點(diǎn)。 內(nèi)核與網(wǎng)絡(luò)設(shè)備的通信和內(nèi)核與字符設(shè)備、 塊設(shè)備的通信方式完全不同。
          4.2Linux設(shè)備驅(qū)動(dòng)與整個(gè)軟硬件系統(tǒng)的關(guān)系除網(wǎng)絡(luò)設(shè)備外,字符設(shè)備與塊設(shè)備都被映射到Linux文件系統(tǒng)的文件和目錄,通過文件系統(tǒng)的系統(tǒng)調(diào)用接口open()、write()、read()、close()等函數(shù)即可訪問字符設(shè)備和塊設(shè)備。所有的字符設(shè)備和塊設(shè)備都被統(tǒng)一地呈現(xiàn)給用戶。塊設(shè)備比字符設(shè)備復(fù)雜,在它上面會(huì)首先建立一個(gè)磁盤/Flash 文件系統(tǒng), 如 F AT、 Ext3、 Y AFFS、JFFS 等。F AT、Ext3、Y AFFS、JFFS 規(guī)范了文件和目錄在存儲(chǔ)介質(zhì)上的組織。
          應(yīng)用程序可以使用 Linux 的系統(tǒng)調(diào)用接口編程,也可以使用 C 庫(kù)函數(shù),出于代碼可移植性的考慮,后者更值得推薦。C 庫(kù)函數(shù)本身也通過系統(tǒng)調(diào)用接口而實(shí)現(xiàn),如 C庫(kù)函數(shù)中的 fopen()、 fwrite()、 fread()、 fclose()分別會(huì)調(diào)用操作系統(tǒng) API 的 open()、 write()、read()、close()函數(shù)。
          4.3編寫 Linux 設(shè)備驅(qū)動(dòng)的技術(shù)基礎(chǔ)
          編寫 Linux 設(shè)備驅(qū)動(dòng)要求工程師具有良好的硬件基礎(chǔ),懂得 SRAM、Flash、SDRAM、磁盤的讀寫方式,UART、I2C、USB 等設(shè)備的接口,輪詢、中斷、DMA 的原理,PCI 總線的工作方式以及 CPU 的內(nèi)存管理單元(MMU)等。
          編寫 Linux 設(shè)備驅(qū)動(dòng)要求工程師具有良好的 C 語(yǔ)言基礎(chǔ), 能靈活地運(yùn)用 C 語(yǔ)言的結(jié)構(gòu)體、指針、函數(shù)指針及內(nèi)存動(dòng)態(tài)申請(qǐng)和釋放等。
          編寫 Linux 設(shè)備驅(qū)動(dòng)要求工程師具有一定的 Linux 內(nèi)核基礎(chǔ),雖然并不要求工程師對(duì)內(nèi)核各個(gè)部分有深入的研究,但至少要了解設(shè)備驅(qū)動(dòng)與內(nèi)核的接口,尤其是對(duì)于塊設(shè)備、網(wǎng)絡(luò)設(shè)備、Flash 設(shè)備、串口設(shè)備等復(fù)雜設(shè)備。
          編寫 Linux 設(shè)備驅(qū)動(dòng)要求工程師具有良好的多任務(wù)并發(fā)控制和同步的基礎(chǔ),因?yàn)樵谠O(shè)備驅(qū)動(dòng)中會(huì)大量使用自旋鎖、互斥、信號(hào)量、等待隊(duì)列等并發(fā)與同步機(jī)制。

      免費(fèi)預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 色七七在线综合视频 | 亚洲日本在线在线看片4k超清 | 精品国产一区二区三区久久狼 | 日韩另类在线第一页 | 午夜高清国产拍精品福利 | 亚洲国产福利一区二区三区 |