畢業(yè)設(shè)計(jì)論文---基于嵌入式系統(tǒng)的圖像采集系統(tǒng)_第1頁
已閱讀1頁,還剩64頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  畢 業(yè) 設(shè) 計(jì)</b></p><p>  題 目:基于嵌入式系統(tǒng)的圖像采集系統(tǒng)</p><p>  姓 名: </p><p>  學(xué) 號(hào): </p><p>  學(xué) 院:

2、 信息學(xué)院 </p><p>  專 業(yè): 電子信息工程 </p><p>  同 組 人: </p><p>  指 導(dǎo) 教 師: </p><p>  協(xié)助指導(dǎo)教師:

3、 </p><p>  2012 年 5 月 12 日</p><p><b>  畢業(yè)設(shè)計(jì)任務(wù)書</b></p><p>  題目: 基于嵌入式系統(tǒng)的圖像采集系統(tǒng) </p><p>  一、主要內(nèi)容和基本要求&

4、lt;/p><p>  圖像采集系統(tǒng)作為一種比較通用的圖像采集裝置,在各個(gè)行業(yè)有著廣泛應(yīng)用,本題目設(shè)計(jì)以嵌入式系統(tǒng)為核心的圖像采集系統(tǒng),具有一定的通用性。</p><p><b>  基本要求:</b></p><p>  1.設(shè)計(jì)系統(tǒng)的總體方案。</p><p>  2.設(shè)計(jì)圖像傳感器與嵌入式系統(tǒng)的接口。</p>

5、;<p>  3.設(shè)計(jì)圖像采集和存儲(chǔ)的軟件。</p><p>  4.部分實(shí)驗(yàn)及調(diào)試。</p><p>  5.撰寫畢業(yè)設(shè)計(jì)論文,答辯。</p><p><b>  二、主要參考資料</b></p><p>  1.方彥軍. 嵌入式系統(tǒng)原理與設(shè)計(jì),國防工業(yè)出版社 2011.7</p><

6、p>  2.趙燕. 傳感器原理及應(yīng)用, 北京大學(xué)出版社, 2011.7</p><p>  3.伊拉希 (美)(ElahiA.). 網(wǎng)絡(luò)通信技術(shù),科學(xué)出版社,2007.12</p><p>  4. 任哲. 嵌入式實(shí)時(shí)操作系統(tǒng)uC/OS-II原理及應(yīng)用(第2版),北京航空航天大學(xué)出版社.2009.10</p><p>  5. 張綺文. 解書剛.ARM嵌入式常

7、用模塊與綜合系統(tǒng)設(shè)計(jì)實(shí)例精講(第2版), 電子工業(yè)出版社.2008.10</p><p>  6. 劉文耀. 數(shù)字圖像:采集與處理, 電子工業(yè)出版社, 2007.8</p><p><b>  三、進(jìn)度要求</b></p><p>  17周-18周:根據(jù)本課題的具體設(shè)計(jì)任務(wù),熟悉課題,收集相關(guān)資料,進(jìn)行調(diào)研和分析。</p>&l

8、t;p>  19周-20周:確定總體方案。撰寫并完善開題報(bào)告,進(jìn)行開題答辯。</p><p>  01周-04周:學(xué)習(xí)相關(guān)知識(shí),設(shè)計(jì)系統(tǒng)的總體方案。嵌入式圖像采集系統(tǒng)的硬件設(shè)計(jì)。設(shè)計(jì)圖像傳感器與嵌入式系統(tǒng)的接口。</p><p>  05周-08周:嵌入式圖像采集系統(tǒng)的軟件設(shè)計(jì)。設(shè)計(jì)圖像采集和存儲(chǔ)的軟件。</p><p>  09周-10周:實(shí)驗(yàn)及調(diào)試。<

9、;/p><p>  11周-13周:總結(jié)畢業(yè)設(shè)計(jì)階段的工作,撰寫畢設(shè)論文,畢業(yè)設(shè)計(jì)答辯。</p><p>  指 導(dǎo) 教 師:      (簽字)</p><p>  專業(yè)負(fù)責(zé)人/系主任: (簽字)</p><p><b>  摘 要</b></p><p>  

10、Linux是個(gè)開源的操作系統(tǒng),由于其源代碼開源、內(nèi)核功能強(qiáng)大、安全性高、支持的硬件平臺(tái)多等特點(diǎn),linux在嵌入式系統(tǒng)和服務(wù)器上中得到了極其廣泛的應(yīng)用,Linux也是當(dāng)前最熱門的嵌入式操作系統(tǒng),嵌入式市場(chǎng)占有率最高。近幾年,隨著android的興起,商用linux的市場(chǎng)越來越大,很多大公司在linux內(nèi)核基礎(chǔ)上開發(fā)新的操作系統(tǒng),并把linux用到更廣泛的領(lǐng)域。</p><p>  將Linux內(nèi)核應(yīng)用到一個(gè)特定的

11、嵌入式圖像采集系統(tǒng)首要的工作就是Linux系統(tǒng)移植和驅(qū)動(dòng)開發(fā)。這部分工作完成后,就為上層應(yīng)用程序的開發(fā)屏蔽了硬件平臺(tái)的復(fù)雜性與多樣性,極大提高了產(chǎn)品開發(fā)的效率。</p><p>  本畢業(yè)設(shè)計(jì)選用FL2440平臺(tái),以完成一個(gè)嵌入式圖像采集系統(tǒng)為目標(biāo),該平臺(tái)使用三星S3C2440A片上系統(tǒng)為底板,選用Linux2.6.12版本內(nèi)核,涉及的工作主要是linux USB驅(qū)動(dòng)移植,數(shù)據(jù)采集程序,用于發(fā)送視頻的通信服務(wù)器端

12、和數(shù)據(jù)接收的客戶端編寫。</p><p>  畢業(yè)設(shè)計(jì)論文的主要內(nèi)容為:</p><p>  1、研究linux內(nèi)核的usb驅(qū)動(dòng)模型,給出嵌入式linux開發(fā)環(huán)境的搭建方法和編寫linux驅(qū)動(dòng)代碼的方法,并移植開源的gspca驅(qū)動(dòng)到內(nèi)核中。 </p><p>  2、研究linux服務(wù)器端數(shù)據(jù)采集程序接口(v4L)和tcp/ip協(xié)議接口,編寫上層的數(shù)據(jù)采集程序和基于

13、tcp/ip的圖像傳輸程序(服務(wù)器端)。</p><p>  3、在Ubuntu Linux PC上編寫客戶端,利用SDL顯示圖像。</p><p>  關(guān)鍵詞:ARM9 Linux 嵌入式 視頻監(jiān)控 USB驅(qū)動(dòng) V4L </p><p><b>  Abstract</b></p><p>  Linux is

14、 an open source operating system, and with the character of open source code, powerful kernel, safe, supporting more hardware platforms, Linux get a very wide range of applications in embedded systems and server.Linux is

15、 currently the most popular embedded operating systems,and has the highest market share. In recent years, with the android rising, commercial linux market is growing, Many large companies to develop a new operating syste

16、m on the basis of the linux kernel and try to use it</p><p>  Linux system porting and driver development is the primary work to apply Linux kernel to a particular embedded image acquisition system. When thi

17、s part of the work is completed,the kernel will shield the complexity and diversity of the hardware platform for the upper layer application development, greatly increase the efficiency of product development.</p>

18、<p>  This graduation design use FL2440 platform, in order to complete the embedded video monitoring system as the goal, the platform using the Samsung S3C2440A chip selecting Linux2.6.12 version of the kernel, the

19、 work involved in the linux USB drive transplant, the data acquisition program used to send the video communication server side and client data receiving programming.</p><p>  The main content of the graduat

20、e design thesis as follows:</p><p>  1. Study linux kernel usb driver model, given the structures of embedded Linux development environment and the preparation of the linux driver code.</p><p> 

21、 2.Study linux server-side data collection program interface (v4L,) and tcp / ip protocol interface, write the top of the data collection procedures and tcp / ip-based image transmission program (server side).</p>

22、<p>  3.Writing the client on Ubuntu Linux PC with SDL library to display images.</p><p>  Key words: ARM9  Linux  Embedded  Video Monitor USB Driver</p>

23、<p><b>  目 錄</b></p><p>  摘 要..........................................................................................................................Ⅲ</p><p>  Abstract.....

24、...................................................................................................................Ⅳ</p><p><b>  引 言1</b></p><p><b>  1 概述2</b></p&

25、gt;<p>  1.1 課題任務(wù)與目的2</p><p>  1.1.1課題任務(wù)2</p><p>  1.1.2課題目的2</p><p>  2 總體方案設(shè)計(jì)3</p><p>  2.1系統(tǒng)的總體方案設(shè)計(jì)3</p><p><b>  2.2硬件設(shè)計(jì)3</b>&l

26、t;/p><p><b>  2.3軟件設(shè)計(jì)4</b></p><p>  3嵌入式Arm-Linux交叉開發(fā)環(huán)境的配置7</p><p>  3.1 交叉開發(fā)環(huán)境概述7</p><p>  3.2 GNU工具鏈7</p><p>  3.2.1 交叉編譯工具鏈7</p>&l

27、t;p>  3.2.2 交叉編譯相關(guān)工具7</p><p>  3.2.3 交叉編譯的構(gòu)建8</p><p>  3.3 系統(tǒng)硬件平臺(tái)配置9</p><p>  3.3.1 ARM9處理器介紹9</p><p>  3.3.2 USB攝像頭原理11</p><p>  4 Linux USB驅(qū)動(dòng)程序1

28、4</p><p>  4.1 Linux驅(qū)動(dòng)程序14</p><p>  4.1.1設(shè)備驅(qū)動(dòng)的簡(jiǎn)介14</p><p>  4.1.2設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)15</p><p>  4.1.3 linux設(shè)備模型18</p><p>  4.2 Linux USB驅(qū)動(dòng)22</p><p>

29、  4.2.1 usb協(xié)議22</p><p>  4.2.2 內(nèi)核中的USB框架25</p><p>  4.2.3 usb驅(qū)動(dòng)程序設(shè)計(jì)26</p><p>  4.3 內(nèi)核、文件系統(tǒng)及驅(qū)動(dòng)移植28</p><p>  4.3.1 USB攝像頭設(shè)備驅(qū)動(dòng)移植28</p><p>  4.3.2 Linux

30、 文件系統(tǒng)移植30</p><p>  5 嵌入式圖像采集系統(tǒng)的服務(wù)器端31</p><p>  5.1 Linux V4L視頻采集31</p><p>  5.1.1 Linux V4L視頻采集編程接口分析31</p><p>  5.1.2 服務(wù)器端視頻采集程序33</p><p>  5.2 Linux

31、網(wǎng)絡(luò)編程37</p><p>  5.2.1 linux套接字編程API37</p><p>  5.2.2 linux多線程API和線程間的通信方式43</p><p>  5.3 服務(wù)器端程序45</p><p>  6 圖像采集系統(tǒng)的客戶端程序47</p><p>  6.1 SDL庫47<

32、;/p><p>  6.2 客戶端程序49</p><p><b>  結(jié) 論52</b></p><p><b>  致 謝53</b></p><p><b>  參考文獻(xiàn)54</b></p><p><b>  引 言&

33、lt;/b></p><p><b>  1、研究背景與意義</b></p><p>  近年來,隨著通信、計(jì)算機(jī)技術(shù)的飛速發(fā)展,尤其是移動(dòng)互聯(lián)網(wǎng)的發(fā)展和消費(fèi)電子產(chǎn)品尤其是智能手機(jī)、pad上網(wǎng)本等設(shè)備的大眾化,電子產(chǎn)品的微型化和專業(yè)化成為潮流,嵌入式產(chǎn)品日漸成為IT產(chǎn)業(yè)的中流砥柱。Linux從1991年產(chǎn)生到現(xiàn)在,二十多年時(shí)間已經(jīng)發(fā)展成為功能極其強(qiáng)大的操作系統(tǒng);

34、可運(yùn)行在X86、Alpha、Sparc、MIPS、PPC、Motorola、NEC、ARM等各類硬件平臺(tái),并且開放所有源代碼,可以按需定制,可與傳統(tǒng)的windows競(jìng)爭(zhēng)。</p><p>  目前,Linux應(yīng)用相當(dāng)廣泛,如信息家電,移動(dòng)計(jì)算設(shè)備,網(wǎng)絡(luò)設(shè)備,工控,仿真,醫(yī)療儀器等智能信息和通信產(chǎn)品。[1]因?yàn)榍度胧绞袌?chǎng)遠(yuǎn)大于pc市場(chǎng),Linux在嵌入式市場(chǎng)的大作為也吸引了許多大公司、科研單位和高校進(jìn)行研究。嵌入式

35、Linux開發(fā)的主要部分是驅(qū)動(dòng)開發(fā),即對(duì)新的硬件芯片進(jìn)行內(nèi)核的支持,是當(dāng)前的嵌入式的熱門。</p><p>  圖像采集系統(tǒng)作為視頻監(jiān)測(cè)的一個(gè)部分,在安全防范領(lǐng)域有著廣泛的應(yīng)用,也是嵌入式Linux的一個(gè)應(yīng)用方向。視頻監(jiān)測(cè)系統(tǒng)其直觀、方便、信息內(nèi)容豐富而被廣泛應(yīng)用于許多重要場(chǎng)合,成為監(jiān)控的主要手段。監(jiān)控系統(tǒng)作為現(xiàn)代企業(yè)不可或缺的重要組成部分,已廣泛應(yīng)用于交通、醫(yī)院、銀行、家居和教育等諸多領(lǐng)域,可以有效地避免安全隱

36、患,提高工作效率。[2]</p><p>  2 、本畢業(yè)設(shè)計(jì)論文的主要工作</p><p>  論文主要解決的問題是在飛凌公司的FL2440開發(fā)平臺(tái)上,通過移植linux2.6.12內(nèi)核和usb網(wǎng)絡(luò)攝像頭的驅(qū)動(dòng),并編寫通信的服務(wù)器端程序和客戶端程序,從而實(shí)現(xiàn)圖像的采集,編碼,傳輸和保存,最終初步實(shí)現(xiàn)一個(gè)視頻監(jiān)控系統(tǒng)。</p><p>  本畢業(yè)設(shè)計(jì)的主要工作分為5

37、部分,分別是對(duì)linux編程環(huán)境的熟悉,對(duì)linux下usb驅(qū)動(dòng)進(jìn)行移植,對(duì)linux內(nèi)核的進(jìn)行裁剪和配置,對(duì)服務(wù)器端的采集和發(fā)送程序的編寫,linux客戶端pc的程序編寫。</p><p>  Linux的入門是一項(xiàng)艱辛的工作,由于linux的開源特性,linux社區(qū)中上有大量的參考資料,對(duì)于本畢業(yè)設(shè)計(jì)的完成有很大的幫助,本畢業(yè)設(shè)計(jì)也是站在巨人的肩膀上,對(duì)嵌入式linux系統(tǒng)的圖像采集系統(tǒng)做一個(gè)初步的探索。&l

38、t;/p><p>  實(shí)現(xiàn)嵌入式圖像采集系統(tǒng)需要作很多的硬件和軟件工作,通過本畢業(yè)設(shè)計(jì),本人參考閱讀了大量的linux源代碼和USB的規(guī)范,對(duì)usB總線協(xié)議有了一定的理解,會(huì)熟練使用嵌入式交叉開發(fā)環(huán)境,對(duì)linux c語言編程開發(fā),多線程編程和跨平臺(tái)的圖形開發(fā)框架qt都有深入的理解和掌握。</p><p><b>  1 概述</b></p><p&g

39、t;  1.1 課題任務(wù)與目的</p><p><b>  1.1.1課題任務(wù)</b></p><p>  圖像采集系統(tǒng)作為一種比較通用的圖像采集裝置,在各個(gè)行業(yè)有著廣泛應(yīng)用,本題目設(shè)計(jì)以嵌入式系統(tǒng)為核心的圖像采集系統(tǒng),具有一定的通用性。</p><p><b>  基本要求:</b></p><p&g

40、t;  1. 設(shè)計(jì)系統(tǒng)的總體方案。</p><p>  2. 設(shè)計(jì)圖像傳感器與嵌入式系統(tǒng)的接口。</p><p>  3. 設(shè)計(jì)圖像采集和存儲(chǔ)的軟件。</p><p>  4. 部分實(shí)驗(yàn)及調(diào)試。</p><p>  5. 撰寫畢業(yè)設(shè)計(jì)論文,答辯。</p><p><b>  1.1.2課題目的</b&g

41、t;</p><p>  在當(dāng)前的數(shù)字信息技術(shù)和網(wǎng)絡(luò)技術(shù)高速發(fā)展的后pc時(shí)代,嵌入式系統(tǒng)已經(jīng)廣泛的滲透到科學(xué)研究、工程設(shè)計(jì)、軍事技術(shù)以及人們生活的各個(gè)方面之中。</p><p>  嵌入式系統(tǒng)的定義是指以應(yīng)用為核心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟硬件可剪裁,對(duì)功能、可靠性、成本、體積和功耗有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。它一般由嵌入式操作系統(tǒng)、外圍硬件設(shè)備、嵌入式微處理器以及應(yīng)用程序等部分組成,用于實(shí)

42、現(xiàn)特定的功能。[3]</p><p>  嵌入式最大的特色是與人們的生活密切相關(guān),基于嵌入式技術(shù)的電子產(chǎn)品已經(jīng)普及到大眾生活各個(gè)角落,像MP3,手機(jī),上網(wǎng)本等娛樂設(shè)備,智能家電、車載GIS導(dǎo)航儀。嵌入式設(shè)備在總數(shù)量上已經(jīng)遠(yuǎn)超過個(gè)人PC。</p><p>  視頻監(jiān)測(cè)是安全防范系統(tǒng)的重要組成部分,是一種用于保護(hù)個(gè)人隱私,以及公共安全等其他用途的技術(shù)。近年來,隨著網(wǎng)絡(luò)通信以及圖像處理技術(shù)的飛速

43、發(fā)展,視頻監(jiān)測(cè)技術(shù)也有了長(zhǎng)足的進(jìn)步。Linux由于其內(nèi)核具有強(qiáng)大的網(wǎng)絡(luò)通信功能,是嵌入式監(jiān)控系統(tǒng)的一個(gè)優(yōu)選。對(duì)于本畢設(shè)的研究,結(jié)合了arm9微處理器、網(wǎng)絡(luò)、圖像處理和傳輸技術(shù)于一體的嵌入式網(wǎng)絡(luò)視頻圖像監(jiān)測(cè)系統(tǒng)的研究,意義非常明顯。本人通過本畢業(yè)設(shè)計(jì)初步掌握嵌入式系統(tǒng)設(shè)計(jì)的全部流程,也掌握了監(jiān)控系統(tǒng)的設(shè)計(jì)思路和解決方案。本畢業(yè)設(shè)計(jì)主要是針對(duì)病人監(jiān)測(cè)而提出的初步解決方案。</p><p><b>  2 總

44、體方案設(shè)計(jì)</b></p><p>  2.1系統(tǒng)的總體方案設(shè)計(jì)</p><p>  整個(gè)系統(tǒng)由硬件和軟件兩部分組成。</p><p>  硬件部分由主控制板處理器、usb攝像頭圖像采集模塊、網(wǎng)卡傳輸模塊和視頻監(jiān)控PC等組成。軟件部分由linux 2.6.12標(biāo)準(zhǔn)內(nèi)核、gspca usb攝像頭、有線網(wǎng)卡驅(qū)動(dòng)以及圖像的v4l采集程序、服務(wù)器端和客戶端程序等

45、構(gòu)成。</p><p>  系統(tǒng)組成結(jié)構(gòu)如圖2-1所示。首先,通過usb驅(qū)動(dòng)打開攝像頭,然后攝像頭中內(nèi)置的DSP芯片產(chǎn)生JPEG流,主板上通過usb接口接收jpeg流,對(duì)接收到的數(shù)據(jù)進(jìn)行處理及存儲(chǔ),當(dāng)客戶端啟動(dòng)連接時(shí),主板中的linux套接字程序通過有線網(wǎng)卡將圖像發(fā)送出去,最后客戶端的pc對(duì)圖像進(jìn)行顯示。</p><p>  圖2-1 總系統(tǒng)構(gòu)成</p><p>&

46、lt;b>  2.2硬件設(shè)計(jì)</b></p><p>  將飛凌公司的FL2440開發(fā)板作為主板,使用USB攝像頭進(jìn)行圖像的采集,作為采集模塊,并通過USB傳輸?shù)街靼?。傳輸模塊使用有線網(wǎng)卡,采用基于IEEE 802.3x以太局域網(wǎng)標(biāo)準(zhǔn),對(duì)數(shù)據(jù)進(jìn)行發(fā)送和接收。RS232串口把宿主機(jī)和開發(fā)板連接起來,主要用作調(diào)試和通信使用。整個(gè)硬件設(shè)計(jì)如圖2所示。</p><p>  圖2-

47、2 系統(tǒng)硬件圖</p><p><b>  主控制板</b></p><p>  主控制板芯片底板為S3C2440A,它是功能強(qiáng)大的SOC;內(nèi)置的 ARM920T內(nèi)核的32位RISC微處理器S3C2440,主頻最高可達(dá)400MHz,可以完成JPEG圖像壓縮以及傳輸?shù)幕疽?。FL2440對(duì)S3C2440A進(jìn)行了擴(kuò)充,其外設(shè)資源包括256MB NAND Flash、6

48、4MB SDRAM,串口和USB等接口電路。</p><p><b>  數(shù)字?jǐn)z像頭</b></p><p>  采用中星微的ZC301PH USB攝像頭,該攝像頭通過內(nèi)部A/D轉(zhuǎn)換和DSP芯片,輸出JPEG圖像流,圖像分辨率最高能達(dá)到640×480,最小為160X 120。</p><p><b>  2.3軟件設(shè)計(jì)&l

49、t;/b></p><p>  程序開發(fā)環(huán)境是在ubuntu Linux系統(tǒng)下搭建的,所以首先需要在pc上搭建好嵌入式Linux的環(huán)境,然后才可以調(diào)試、編譯和運(yùn)行應(yīng)用程序。</p><p>  嵌入式Linux環(huán)境的建立</p><p>  本文選用的是FL2440開發(fā)板,飛凌公司的開發(fā)板自帶了建立嵌入式Linux環(huán)境所需要的開發(fā)包,依次將boot-loade

50、r,kernel,yaffs文件系統(tǒng)下載到開發(fā)板上對(duì)開發(fā)板。</p><p>  Usb攝像頭驅(qū)動(dòng)和網(wǎng)卡驅(qū)動(dòng)的移植</p><p>  將開發(fā)板自帶的有線網(wǎng)卡驅(qū)動(dòng)源代碼以及在網(wǎng)上將萬能usb攝像頭驅(qū)動(dòng)程序源代碼gspca webcam drivers下載下來,gspca webcam drivers 是linux下攝像頭支持的最廣泛的一個(gè)驅(qū)動(dòng),  這是由一個(gè)法

51、國醫(yī)生(http://mxhaard.free.fr/)所設(shè)計(jì)編寫的開源驅(qū)動(dòng),針對(duì)FL2440開發(fā)板修改后,把它們放在相應(yīng)的內(nèi)核目錄下,修改相應(yīng)的Kconfig,Makefile和編譯器,內(nèi)核選項(xiàng)等修改后,通過make menuconfig命令進(jìn)入內(nèi)核配置界面,選擇模塊的方式,重新編譯內(nèi)核,最終得到它們相應(yīng)的驅(qū)動(dòng)(.ko文件)。亦可用驅(qū)動(dòng)補(bǔ)丁直接將gspca驅(qū)動(dòng)加進(jìn)內(nèi)核中,此方法較簡(jiǎn)單。</p><p>  基于

52、V4L的視頻采集程序</p><p>  視頻采集是整個(gè)視頻采集模塊的核心。Video4Linux(簡(jiǎn)稱V4L)是Linux專門針對(duì)視頻設(shè)備提供的應(yīng)用程序接口,是Linux對(duì)視頻設(shè)備的內(nèi)核級(jí)驅(qū)動(dòng)。通過它可以執(zhí)行打開、讀寫及關(guān)閉等操作。視頻采集程序的流程如圖2-3所示。</p><p>  圖2-3 視頻采集流程圖</p><p><b>  網(wǎng)絡(luò)傳輸程序

53、</b></p><p>  本文選用的是基于802.3x的以太局域網(wǎng),可支持高達(dá)54Mbps的速率,而FL2440選用的以太網(wǎng)卡,可支持高達(dá)100Mbps的數(shù)據(jù)流。采用套接字編程,初步利用利用TCP/IP協(xié)議基于線程對(duì)數(shù)據(jù)進(jìn)行無線傳輸。整體程序分為服務(wù)器端和客戶端。通信流程如圖2-4所示。</p><p>  圖2-4 網(wǎng)絡(luò)傳輸流程圖</p><p>

54、;  在服務(wù)端,利用pthread_create()創(chuàng)建server_th線程,使用socket()創(chuàng)建流式套接字,用bind()函數(shù)綁定端地址與和套接字,用listen()將剛創(chuàng)建的套接字轉(zhuǎn)化到監(jiān)聽模式下,提醒內(nèi)核應(yīng)接受來自客戶端的連接請(qǐng)求。而此時(shí),服務(wù)器的狀態(tài)從close轉(zhuǎn)換到了listen監(jiān)聽狀態(tài)。</p><p>  在客戶端PC,創(chuàng)建socket(),使用connect()函數(shù)連接服務(wù)器端。當(dāng)TCP的三

55、次握手完成后,服務(wù)器端采集程序?qū)D像數(shù)據(jù)從圖像緩沖區(qū)映射到網(wǎng)絡(luò)傳輸緩沖區(qū),最后將圖像數(shù)據(jù)發(fā)送給客戶端程序??蛻舳顺绦蛲ㄟ^接收?qǐng)D像,把數(shù)據(jù)存放在數(shù)據(jù)緩沖區(qū)中,對(duì)其處理后,顯示在監(jiān)控PC上。</p><p>  3嵌入式Arm-Linux交叉開發(fā)環(huán)境的配置</p><p>  3.1 交叉開發(fā)環(huán)境概述</p><p>  嵌入式系統(tǒng)的開發(fā)環(huán)境和通用計(jì)算機(jī)是大不相同的,從

56、硬件資源上說它有很大的局限性,比如存儲(chǔ)空間小,處理器頻率低,沒有鍵盤和鼠標(biāo)等設(shè)備,這限制了已有的開發(fā)工具的在其上的使用。除此之外,硬件資源的局限性會(huì)給嵌入式軟件帶來一定的約束,比如內(nèi)存的使用。經(jīng)過的嵌入式開發(fā)人員的長(zhǎng)期探索,提出了一中方便和有效的開發(fā)模式,即宿主機(jī)--目標(biāo)板交叉開發(fā)環(huán)境模式。</p><p>  宿主機(jī)--目標(biāo)板交叉開發(fā)環(huán)境模式主要有兩部分組成:一是宿主機(jī),就是平時(shí)使用的桌面計(jì)算機(jī)。二是目標(biāo)板,指

57、的是嵌入式開發(fā)板。通過交叉開發(fā)環(huán)境的方式,在宿主機(jī)上利用已有的成熟的開發(fā)工具,專門針對(duì)目標(biāo)板定制一套系統(tǒng),包括引導(dǎo)程序,內(nèi)核,文件系統(tǒng),然后下載目標(biāo)板上測(cè)試執(zhí)行,最后利用宿主機(jī)上的調(diào)試工具對(duì)目標(biāo)板上運(yùn)行的程序進(jìn)行遠(yuǎn)程調(diào)試。</p><p>  Linux系統(tǒng)作為一款非常優(yōu)秀的開源操作系統(tǒng),使用了大量的GNU軟件,包括shell、glibc、gcc、gdb等,還有強(qiáng)大的程序,比如vim和emacs。</p&g

58、t;<p>  通常,宿主機(jī)和目標(biāo)板的連接方式有四種,分別是串口、以太網(wǎng)接口、usb接口和JATG接口。在本開發(fā)板中,使用串口和usb接口連接的方式來進(jìn)行調(diào)試和測(cè)試工作。</p><p>  3.2 GNU工具鏈</p><p>  3.2.1 交叉編譯工具鏈</p><p>  交叉編譯工具鏈?zhǔn)且粋€(gè)由編譯器、鏈接器和解釋器組成的集成開發(fā)環(huán)境。和本地編

59、譯類似,交叉編譯的過程也是由編譯、鏈接等階段組成,源程序通過交叉編譯器編譯生成目標(biāo)模塊,并由交叉鏈接器最后鏈接成可在目標(biāo)平臺(tái)上執(zhí)行得代碼。</p><p>  交叉編譯工具鏈主要包括:</p><p><b>  標(biāo)準(zhǔn)庫</b></p><p><b>  編譯器 </b></p><p><

60、b>  鏈接器</b></p><p><b>  匯編器</b></p><p><b> ?、?調(diào)試器</b></p><p>  3.2.2 交叉編譯相關(guān)工具</p><p><b> ?、?glibc庫</b></p><p>

61、  glibc 是gnu發(fā)布的libc庫,也即c運(yùn)行庫。glibc是linux系統(tǒng)中最底層的api(應(yīng)用程序開發(fā)接口), 幾乎其它任何的運(yùn)行庫都會(huì)依賴于glibc。</p><p><b>  ⑵ gcc編譯器</b></p><p>  Gcc是一個(gè)跨平臺(tái)的編譯器,它是GNU Compiler Collection的縮寫,目前被許多unix/li

62、nux系統(tǒng)作為默認(rèn)的編譯器。Gcc最初被命名為GNU C Compiler,后來,隨著支持的編譯語言越來越多,編程更加強(qiáng)大的GNU Compiler Collection。目前,gcc已經(jīng)被移植到多種處理器架構(gòu)上,并且在商業(yè)、專利和開源軟件商廣泛使用。</p><p>  Gcc編譯器編譯的過程一般分為四個(gè)階段,分別為預(yù)處理、編譯、匯編和鏈接。在linux shell中對(duì)gcc提供了強(qiáng)大的命令支持,在實(shí)際編程中可

63、以靈活運(yùn)用。</p><p>  binutils開發(fā)工具包</p><p>  Binutils是一組開發(fā)工具包,包括鏈接器、匯編器和其他用于目標(biāo)文件和檔案的工具。Binutils中的不少工具和gcc相似,binutils工具包是嵌入式系統(tǒng)開發(fā)中必須掌握的,主要包括addr2line、ar、as、c++filt、gprof、ld、nm、objcopy、objdump、ranlib、rea

64、delf、size、 strings、strip、libiberty、libbfd和libopcodes。</p><p><b>  gdb調(diào)試器</b></p><p>  GDB全名是Gnu Debugger,是GNU C自帶的調(diào)試工具,它是一款非常強(qiáng)大的調(diào)試器,功能上可以與visual studio 媲美,它支持多種硬件平臺(tái),目前支持的主要調(diào)試語言有c/c++

65、、java等</p><p>  KDEVELOP IDE</p><p>  KDevelop的是一個(gè)自由,開放源碼的Linux,Solaris和FreeBSD的IDE(集成開發(fā)環(huán)境),Max OS X和其他Unix系統(tǒng)。它是一個(gè)功能全面,可擴(kuò)展的IDE,可以使用C / C++和其他編程語言的插件,功能非常強(qiáng)大,可以媲美VC++ IDE。本畢業(yè)設(shè)計(jì)的軟件編程都是用Kdevelop IDE

66、進(jìn)行編譯調(diào)試的。</p><p>  linux shell簡(jiǎn)介</p><p>  linux 有多個(gè)版本的shell,一般默認(rèn)的是bash shell。Shell中文的意思是外殼,實(shí)際上是操作系統(tǒng)內(nèi)核和用戶進(jìn)行交互的接口,shell和windows下面的dos命令行非常相似。常用的命令有l(wèi)s,cd,rm,cp,mv,du,man,mount等。</p><p>

67、  3.2.3 交叉編譯的構(gòu)建</p><p>  交叉編譯的過程本身并不復(fù)雜,完成交叉編工具鏈的制作卻是比較困難的,網(wǎng)上又有很多交叉編譯的構(gòu)建方法可以提供參考。制作交叉編譯工具鏈之前,需要明確目標(biāo)平臺(tái),本平臺(tái)的嵌入式開發(fā)是在arm平臺(tái)下,所以選擇交叉編譯工具為arm-linux-gcc,arm-linux-gdb等。</p><p>  對(duì)于本平臺(tái)的所開發(fā)的系統(tǒng),直接選用網(wǎng)上配置好的交叉

68、編譯工具鏈,雖然不夠靈活,已經(jīng)滿足本系統(tǒng)的開發(fā)需求。</p><p>  3.3 系統(tǒng)硬件平臺(tái)配置</p><p>  FL2440硬件平臺(tái)的主要配置介紹:</p><p> ?、?S3C2440A處理器,主頻400MHz,可倍頻至533MHz;</p><p>  64M字節(jié)SDRAM,可擴(kuò)展到256M ;</p><p

69、>  4M NOR Flash,256M字節(jié)NAND Flash;</p><p>  12MHz系統(tǒng)外部時(shí)鐘源;32.768KHz的RTC時(shí)鐘源;</p><p>  支持3.3V或5V電壓供電;</p><p>  兩個(gè)三線串口,一個(gè)TTL串口;</p><p>  一個(gè)100M網(wǎng)口,采用DM9000AE,帶聯(lián)接和傳輸指示燈;<

70、;/p><p>  四個(gè)USB HOST接口;一個(gè)USB Device接口;</p><p>  3.3.1 ARM9處理器介紹</p><p>  本論文從應(yīng)用領(lǐng)域、設(shè)計(jì)需求和開發(fā)的難易程度等因素進(jìn)行考慮,最終選用三星公司的嵌入式微處理器S3C2440。下面分別介紹ARM處理器的優(yōu)點(diǎn)和具用ARM9內(nèi)核的S3C2440的特點(diǎn)。</p><p> 

71、 ARM處理器以其完整的體系結(jié)構(gòu)發(fā)展系列,以及極小的體積、極低的功耗、極低的成本和極高的性能,并能及時(shí)根據(jù)嵌入對(duì)象的不同進(jìn)行功能上的擴(kuò)展的優(yōu)勢(shì),從眾多種類的嵌入式微處理器中脫穎而出?;贏RM技術(shù)的微處理器占據(jù)了32位RISC微處理器75%以上的市場(chǎng)份額,ARM技術(shù)正在逐步滲入到我們生活的各個(gè)方面。</p><p>  采用RISC架構(gòu)的ARM微處理器一般具有如下特點(diǎn):</p><p> 

72、?。?)支持Thumb (16位)/ARM (32位)雙指令集,能很好的兼容8位/16位器件;</p><p> ?。?)大量使用寄存器,指令執(zhí)行速度更快;</p><p> ?。?)加載存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)處理的操作只針對(duì)寄存器的內(nèi)容,而不直接對(duì)存儲(chǔ)器進(jìn)行操作;</p><p> ?。?)簡(jiǎn)單的尋址模式,所有加載和存儲(chǔ)的地址都只由寄存器的內(nèi)容和指令域決定,執(zhí)行效率高;&

73、lt;/p><p>  3.3.2 USB攝像頭原理</p><p>  攝像頭(CAMERA)作為一種視頻輸入設(shè)備,在過去被廣泛的運(yùn)用于視頻會(huì)議、遠(yuǎn)程醫(yī)療及實(shí)時(shí)監(jiān)控等方面。近年來,互聯(lián)網(wǎng)技術(shù)的發(fā)展,圖像傳感器技術(shù)的成熟,使得攝像頭的圖像質(zhì)量得到明顯改善,同時(shí)攝像頭的價(jià)格也大幅度下降。攝像頭在人們的日常生活中扮演著越來越重要的角色。</p><p>  攝像頭分為數(shù)字?jǐn)z

74、像頭和模擬攝像頭兩大類。模擬攝像頭可以將視頻采集設(shè)備產(chǎn)生的模擬視頻信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),進(jìn)而將其儲(chǔ)存在計(jì)算機(jī)里。模擬攝像頭捕捉到的視頻信號(hào)必須經(jīng)過特定的視頻捕捉卡將模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),并加以壓縮后才可以轉(zhuǎn)換到計(jì)算機(jī)上運(yùn)用。數(shù)字?jǐn)z像頭可以直接捕捉影像,然后通過串、并口或者 USB接口傳到計(jì)算機(jī)里?,F(xiàn)在市場(chǎng)上的攝像頭主要以數(shù)字?jǐn)z像頭為主,而數(shù)字?jǐn)z像頭中又以接口簡(jiǎn)單的USB數(shù)字?jǐn)z像頭為主,以下主要介紹USB數(shù)字?jǐn)z像頭。</p>

75、<p>  USB數(shù)字?jǐn)z像頭的工作原理為:景物通過鏡頭(LENS)生成的光學(xué)圖像投射到圖像傳感器表面上,然后轉(zhuǎn)為電信號(hào),經(jīng)過A/D(模數(shù)轉(zhuǎn)換)轉(zhuǎn)換后變?yōu)閿?shù)字圖像信號(hào),再送到數(shù)字信號(hào)處理芯片DSP中加工處理,將其轉(zhuǎn)化為特定的圖像格式,如JPEG格式,再通過USB接口傳輸?shù)教幚砥髦刑幚?,?shí)現(xiàn)圖像顯示存儲(chǔ)或編碼傳輸。</p><p>  USB數(shù)字?jǐn)z像頭的結(jié)構(gòu)框圖如圖3-1所示。</p>&l

76、t;p>  圖3-1 USB數(shù)字?jǐn)z像頭的結(jié)構(gòu)框圖</p><p>  在組成攝像頭的所有重要部件當(dāng)中,最為核心的兩個(gè)部件是圖像傳感器芯片和DSP芯片。</p><p>  圖像傳感器(SENSOR)是一種半導(dǎo)體芯片,其表面包含有幾十萬到幾百萬的光電二極管。光電二極管受到光照射時(shí),就會(huì)產(chǎn)生電荷。它可以分為CCD(charge couple device)和CMOS(complemen

77、tary metal oxide semiconductor)兩類,它們的性能將直接決定攝像頭的最大分辨率和圖像的質(zhì)量。CCD的優(yōu)點(diǎn)是靈敏度高,噪音小,信噪比大,但是生產(chǎn)工藝復(fù)雜、成本高、功耗高。CMOS的優(yōu)點(diǎn)是集成度高、功耗低(不到CCD的1/3)、成本低,但是噪音比較大、靈敏度較低、對(duì)光源要求高。從成本考慮,市場(chǎng)上大多還是采用CMOS的圖像傳感器,各廠商通過采用影像光源自動(dòng)增益補(bǔ)償技術(shù),自動(dòng)亮度、白平衡控制技術(shù),色飽和度、對(duì)比度、邊

78、緣增強(qiáng)以及伽馬矯正等先進(jìn)的影像控制技術(shù),完全可以達(dá)到與CCD攝像頭相媲美的效果。</p><p>  數(shù)字信號(hào)處理芯片DSP一般包括這三個(gè)模塊:鏡像信號(hào)處理器ISP(image signal processor),JPEG圖像解碼器(JPEG encoder),USB設(shè)備控制器(USB device controller),主要功能是通過一系列復(fù)雜的數(shù)學(xué)算法運(yùn)算,對(duì)數(shù)字圖像信號(hào)進(jìn)行優(yōu)化處理(如壓縮編碼),并把處理

79、后的信號(hào)通過USB等接口傳到PC等設(shè)備。DSP芯片類型的不同將直接影響圖片格式的差異。</p><p>  目前主要有國內(nèi)的中星微,臺(tái)灣的松翰、凌越和凌陽這些企業(yè)生產(chǎn)攝像頭的DSP芯片。雖然市場(chǎng)上攝像頭種類繁多,但絕大部分采用了以上公司的DSP芯片。特別是國內(nèi)的中星微,憑借其產(chǎn)品良好的兼容性、較高的性價(jià)比和中國政府的大力支持,很快占領(lǐng)了攝像頭DSP芯片市場(chǎng)的大半壁江山。如今中星微電子的“星光”系列數(shù)字多媒體芯片成

80、功占據(jù)了全球計(jì)算機(jī)圖像輸入芯片市場(chǎng)60%的市場(chǎng)份額,更占據(jù)國內(nèi)市場(chǎng)的90%。這是具有我國自主知識(shí)產(chǎn)權(quán)的集成電路芯片第一次在一個(gè)重要應(yīng)用領(lǐng)域占到領(lǐng)先地位。本論文中采用的正是中星微系列芯片的USB攝像頭zc301。</p><p>  USB攝像頭的圖像格式主要有以下幾種:JPEG格式、YUV格式和第三格式。中星微的zc301p和松翰的sn9c105采用的是JPEG格式;凌陽的spca506和spca508采用YUV

81、格式;松翰的 sn9c101和凌陽的spca56la采用第三格式。第三格式是指廠家用自己的圖像壓縮算法對(duì)RGB數(shù)據(jù)壓縮后得到的圖片格式。同一種圖像格式的攝像頭由于采用芯片型號(hào)的不同,捕獲的圖像數(shù)據(jù)流可能也會(huì)存在微小的差異。有些芯片會(huì)在JPEG圖像數(shù)據(jù)前加一定長(zhǎng)度的頭部,如中星微的zco301p;有些則沒有,如松翰的sn9c105。有些YUV格式的芯片采用YYUV的數(shù)據(jù)流格式,而有些則采用YUVY數(shù)據(jù)流格式。表2-1列出了一些主要芯片的圖

82、像格式。</p><p>  表3-1 主流DSP芯片及其圖像格式</p><p>  4 Linux USB驅(qū)動(dòng)程序</p><p>  4.1 Linux驅(qū)動(dòng)程序</p><p>  4.1.1設(shè)備驅(qū)動(dòng)的簡(jiǎn)介</p><p>  驅(qū)動(dòng)程序本質(zhì)上是硬件和應(yīng)用程序之間的中間層。驅(qū)動(dòng)程序工作在內(nèi)核空間,應(yīng)用程序一般運(yùn)行于

83、用戶空間(32位Linux操作系統(tǒng)一般把內(nèi)存地址的0~3g空間作為用戶空間,3~4G空間作為內(nèi)核空間)。Linux下驅(qū)動(dòng)程序和dos或windows下的區(qū)別很大。設(shè)備驅(qū)動(dòng)程序是作為內(nèi)核與機(jī)器硬件之間的接口,而系統(tǒng)調(diào)用則是內(nèi)核和應(yīng)用程序的接口。設(shè)備驅(qū)動(dòng)為應(yīng)用程序屏蔽了硬件的細(xì)節(jié),硬件設(shè)備對(duì)于應(yīng)用程序來說只是一個(gè)設(shè)備文件,應(yīng)用程序可以像操作普通程序一樣對(duì)硬件設(shè)備進(jìn)行操作。[5]設(shè)備驅(qū)動(dòng)是內(nèi)核的一部分,一般完成以下功能:</p>

84、<p>  設(shè)備的初始化和釋放。</p><p>  把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)到內(nèi)核。</p><p>  讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序的請(qǐng)求的數(shù)據(jù)。這需要在用戶空間、內(nèi)核空間、總線以及外設(shè)之間傳送數(shù)據(jù)。</p><p>  檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。[6]</p><p>  Linux設(shè)備驅(qū)動(dòng)的

85、特點(diǎn)是可以以模塊的形式加載各種設(shè)備驅(qū)動(dòng),因此允許驅(qū)動(dòng)的開發(fā)人員隨著內(nèi)核版本的更新,在最新版本的內(nèi)核上對(duì)各種新的硬件進(jìn)行設(shè)備驅(qū)動(dòng)的編寫和開發(fā),這對(duì)嵌入式系統(tǒng)非常重要,因?yàn)榍度胧皆O(shè)備往往具有大量獨(dú)有的外設(shè),開發(fā)人員需要把主要的精力放在設(shè)備驅(qū)動(dòng)方面。</p><p><b>  設(shè)備的分類</b></p><p>  Linux支持三種硬件設(shè)備:塊設(shè)備、字符設(shè)備、網(wǎng)絡(luò)設(shè)備。

86、字符設(shè)備是指那些無緩沖可以直接進(jìn)行讀寫的設(shè)備,如系統(tǒng)的串口通信設(shè)備。塊設(shè)備則只能以塊為單位進(jìn)行讀寫,一般塊大小是512和1024 Byte,塊設(shè)備的存取是通過buffer和cache進(jìn)行并且可以隨機(jī)訪問,一般通過文件系統(tǒng)來訪問塊設(shè)備,只有塊設(shè)備可以安裝文件系統(tǒng)。塊設(shè)備主要針對(duì)慢速設(shè)備,一般采用緩存技術(shù),支持?jǐn)?shù)據(jù)的隨即讀寫,典型的塊設(shè)備是硬盤和cd-rom等。對(duì)于用戶來說,塊設(shè)備和字符設(shè)備的訪問接口都是一樣的,都是一組基于文件的系統(tǒng)的調(diào)用

87、,如read、write等,實(shí)際上它們的細(xì)節(jié)區(qū)別僅在內(nèi)核和驅(qū)動(dòng)程序的軟件接口上。</p><p>  Linux操作系統(tǒng)中的網(wǎng)絡(luò)設(shè)備的實(shí)現(xiàn)方法不同于字符設(shè)備和塊設(shè)備,它面對(duì)的上一層是網(wǎng)絡(luò)協(xié)議層,而不是字符型和塊設(shè)備所面向的文件系統(tǒng)層。</p><p><b>  設(shè)備文件</b></p><p>  從用戶的角度,在使用不同的設(shè)備時(shí),需要使用不

88、同的操作方法,是非常麻煩的。用戶一般希望能用同樣的應(yīng)用程序接口和命令來訪問設(shè)備和普通文件。</p><p>  Linux抽象了對(duì)硬件的處理,所有的設(shè)備都看做文件:它們可以使用和操作普通文件相同的系統(tǒng)調(diào)用接口來完成打開、讀寫、關(guān)閉和I/O控制等,而驅(qū)動(dòng)程序的本質(zhì)就是將這些系統(tǒng)調(diào)用接口函數(shù)具體實(shí)現(xiàn)。Linux中的所有外圍和內(nèi)部硬件設(shè)備都用特殊的設(shè)備文件來表示。[7]</p><p>  由于

89、linux引入的設(shè)備文件的概念,linux為文件和設(shè)備提供了統(tǒng)一的接口。對(duì)用戶來說,設(shè)備文件和普通文件沒有區(qū)別。</p><p><b>  主設(shè)備號(hào)和次設(shè)備號(hào)</b></p><p>  Linux為每個(gè)設(shè)備分配了一個(gè)主設(shè)備號(hào)和一個(gè)次設(shè)備號(hào);主設(shè)備號(hào)標(biāo)識(shí)具體設(shè)備的實(shí)例。有同一個(gè)設(shè)備驅(qū)動(dòng)程序控制的所有設(shè)備都具有相同的主設(shè)備號(hào)。次設(shè)備號(hào)主要用來區(qū)分具有相同主設(shè)備號(hào)且由相

90、同設(shè)備驅(qū)動(dòng)控制的不同設(shè)備。設(shè)備文件的主設(shè)備號(hào)必須與設(shè)備驅(qū)動(dòng)程序在登陸該設(shè)備時(shí)申請(qǐng)的主設(shè)備號(hào)一致,否則設(shè)備驅(qū)動(dòng)程序?qū)o法被用戶程序訪問到。所有已經(jīng)加載(即注冊(cè))的硬件設(shè)備的主設(shè)備號(hào)能夠從文件系統(tǒng)中/proc/devices文件中得到。</p><p>  當(dāng)應(yīng)用程序通過系統(tǒng)調(diào)用對(duì)某個(gè)設(shè)備文件操作時(shí),linux內(nèi)核會(huì)根據(jù)設(shè)備文件的設(shè)備類型和主設(shè)備號(hào)調(diào)用對(duì)應(yīng)的驅(qū)動(dòng)程序,并從用戶態(tài)轉(zhuǎn)換到內(nèi)核態(tài),在由驅(qū)動(dòng)程序找到對(duì)應(yīng)的次設(shè)

91、備號(hào),最終完成對(duì)硬件的操作。</p><p>  linux驅(qū)動(dòng)程序代碼的分布</p><p>  所有的linux設(shè)備驅(qū)動(dòng)源代碼都放在drivers目錄下。</p><p>  4.1.2設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)</p><p>  Linux驅(qū)動(dòng)程序與外界的接口可以分成三部分:</p><p>  ⑴驅(qū)動(dòng)程序與操作系統(tǒng)內(nèi)核

92、的接口。只是通過include/linux/fs.h中的file_operations數(shù)據(jù)結(jié)構(gòu)來完成的,下面會(huì)介紹這個(gè)數(shù)據(jù)結(jié)構(gòu)。</p><p>  驅(qū)動(dòng)程序與系統(tǒng)引導(dǎo)的接口。這部分利用驅(qū)動(dòng)程序?qū)υO(shè)備進(jìn)行初始化。</p><p>  驅(qū)動(dòng)程序與設(shè)備的接口。這部分描述了驅(qū)動(dòng)程序如何與設(shè)備進(jìn)行交互。</p><p>  這與具體的設(shè)備密切相關(guān)。[8]</p>

93、<p>  按照功能劃分,linux設(shè)備驅(qū)動(dòng)程序的代碼結(jié)構(gòu)大致劃分為以下幾個(gè)部分:驅(qū)動(dòng)程序的注冊(cè)與注銷、設(shè)備的打開與釋放、設(shè)備的讀寫操作、設(shè)備的控制操作、設(shè)備的中斷與輪詢處理。</p><p>  1. 驅(qū)動(dòng)程序的注冊(cè)和注銷</p><p>  往系統(tǒng)注冊(cè)一個(gè)設(shè)備驅(qū)動(dòng)需要賦予設(shè)備一個(gè)主設(shè)備號(hào),通過驅(qū)動(dòng)程序初始化時(shí)調(diào)用定義在fs/devices.c中的register_chrd

94、ev()函數(shù)或者fs/block_dev.c中的register_blkdev()函數(shù)來完成。而關(guān)閉字符或者塊設(shè)備,需要通過使用unregister_chrdev()或unregister_blkdev()函數(shù)注銷設(shè)備,并同時(shí)釋放分配得到的主設(shè)備號(hào)。</p><p>  2. 設(shè)備的打開與釋放</p><p>  通過調(diào)用定義在include/linux/fs.h中的file_operat

95、ions中的open()函數(shù)來完成的硬件設(shè)備的打開,本操作是驅(qū)動(dòng)程序用來完成初始化工作的。以下是file_operations的數(shù)據(jù)結(jié)構(gòu)定義:</p><p>  struct file_operations {</p><p>  struct module *owner;</p><p>  loff_t( *llseek) (struct file *,l

96、off_t,int);</p><p>  ssize_ t( *read) (struct file *,size_t,loff_t *);</p><p>  ssize t( *write) (struct file *,const char *,size_t,loff_t *);</p><p>  int( *readdir) (struct file *

97、,void *,filldir_t *);</p><p>  unsigned int( *poll) (struct file *,struct poll_table_struct *);</p><p>  int( *ioctl) (struct inode *,struct file *,unsigned int,unsigned long);</p><p&

98、gt;  int( *mmap) (struct file *,struct vm_ area_struct *);</p><p>  int( *open) (struct inode *,struct file *);</p><p>  int( *flush) (struct file *);</p><p>  int( *release) (struc

99、t inode *,struct file *);</p><p>  int( *fsync) (struct file *,struct dentry *,int);</p><p>  int( *fasync) (int,struct file *,int);</p><p>  int( *lock) (struct file *,int,struct f

100、ile_lock *);</p><p>  ssize_t( *readv) (struct file *,const struct iovec *,unsigned long,loff_t *);</p><p>  ssize_ t( *writev) (struct file *,const struct iovec *,unsigned long,loff_t *);</p

101、><p>  ssize_ t ( *sendpage) (struct file *,struct page *,int,size_t,loff_t *,int);</p><p>  unsigned long( *get_unmapped_area) (struct file *,unsigned long,unsigned long,unsigned long,unsigned lon

102、g);</p><p>  int (*check_flags) (int);</p><p><b>  }</b></p><p>  當(dāng)應(yīng)用程序?qū)υO(shè)備文件進(jìn)行諸如open、close、read、write等操作時(shí),linux內(nèi)核將通過file_operations結(jié)構(gòu)訪問驅(qū)動(dòng)程序提供的函數(shù)。如應(yīng)用程序?qū)υO(shè)備文件執(zhí)行讀操作時(shí),內(nèi)核調(diào)用fil

103、e_operations結(jié)構(gòu)中的read函數(shù)。</p><p>  一般在驅(qū)動(dòng)程序中,open()需要完成如下工作:首先檢查設(shè)備的相關(guān)錯(cuò)誤,如設(shè)備尚未準(zhǔn)備就緒等;對(duì)于第一次打開的設(shè)備,則需要對(duì)硬件設(shè)備初始化;識(shí)別次設(shè)備號(hào);若有必要的話需更新讀寫操作的當(dāng)前位置f_ops指針;對(duì)file->private_data里的數(shù)據(jù)進(jìn)行分配和填寫;引用計(jì)數(shù)值增加一。</p><p>  同樣,一般

104、通過調(diào)用file_operations結(jié)構(gòu)中函數(shù)release()來完成釋放設(shè)備,這個(gè)方法一般等同于close(),作用正好與open()相反,通常需要完成一下工作:使用計(jì)數(shù)減一,釋放file->private_data中分配的內(nèi)存;如果被釋放設(shè)備是最后一個(gè),則設(shè)備關(guān)閉。</p><p><b>  3.設(shè)備的讀寫操作</b></p><p>  讀寫字符設(shè)備的

105、操作使用函數(shù)read()和write()。對(duì)于塊設(shè)備,使用函數(shù)block_read()和block_write()來對(duì)數(shù)據(jù)進(jìn)行讀寫。</p><p><b>  設(shè)備的控制操作</b></p><p>  除了設(shè)備的讀和寫以外,有時(shí)應(yīng)用程序需對(duì)硬件設(shè)備進(jìn)行控制,這時(shí)需要函數(shù)ioctl()來完成。Ioctl()與具體的設(shè)備對(duì)象關(guān)系密切,需要結(jié)合具體的設(shè)備來分析。<

106、/p><p>  設(shè)備的輪詢與中斷操作</p><p>  當(dāng)設(shè)備執(zhí)行某個(gè)命令時(shí),設(shè)備驅(qū)動(dòng)可以從輪詢或者中斷中選擇一種以判斷設(shè)備是否已經(jīng)完成了此命令。</p><p>  對(duì)于不支持中斷的設(shè)備,讀寫時(shí)需要輪流查詢?cè)O(shè)備狀態(tài),以便決定是否技術(shù)進(jìn)行數(shù)據(jù)傳輸。輪詢方式意味著需經(jīng)常對(duì)設(shè)備的狀態(tài)進(jìn)行讀取,直到設(shè)備狀態(tài)表明請(qǐng)求已經(jīng)完成為止。如果設(shè)備驅(qū)動(dòng)程序被連接進(jìn)入內(nèi)核,輪詢方式會(huì)帶

107、來災(zāi)難性的后果:cpu將無所事事,直到設(shè)備完成此請(qǐng)求。輪詢方式最好的方法就是通過內(nèi)核定時(shí)器定期對(duì)設(shè)備的狀態(tài)進(jìn)行查詢,使內(nèi)核周期性調(diào)用設(shè)備驅(qū)動(dòng)中的某個(gè)例程來完成檢查設(shè)備狀態(tài)。輪詢方式比較消耗內(nèi)核資源。</p><p>  中斷是一種更有效的方法,如果硬件支持中斷則可以按照中斷的方式進(jìn)行操作。讓硬件在需要的時(shí)候會(huì)向內(nèi)核發(fā)出中斷請(qǐng)求信號(hào),內(nèi)核負(fù)責(zé)把信號(hào)傳遞給對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序。[9]此過程由內(nèi)核中設(shè)備驅(qū)動(dòng)注冊(cè)的中斷來協(xié)

108、助完成。系統(tǒng)記錄下中斷處理程序中的地址和中斷號(hào)。在系統(tǒng)的proc/interrupts文件中可以看到驅(qū)動(dòng)程序?qū)?yīng)的中斷號(hào)和類型。</p><p>  在驅(qū)動(dòng)初始化一般已經(jīng)完成對(duì)中斷資源的請(qǐng)求。系統(tǒng)中某些中斷時(shí)固定的,大多數(shù)中斷需要在啟動(dòng)時(shí)進(jìn)行動(dòng)態(tài)分配。設(shè)備驅(qū)動(dòng)所控制的中斷號(hào)(IRQ)必須在取得對(duì)此中斷的所有權(quán)之前找到。</p><p>  體系結(jié)構(gòu)決定了如何將中斷發(fā)送給cpu,在大多數(shù)體系

109、結(jié)構(gòu)中,中斷用特殊模式發(fā)送,并且會(huì)阻止系統(tǒng)其他中斷的產(chǎn)生。驅(qū)動(dòng)程序在中斷處理過程中做得越少越好,這樣linux內(nèi)核能夠很快從中斷狀態(tài)返回。為了在接收中斷后能夠完成更多的工作,設(shè)備驅(qū)動(dòng)還需要能夠使用內(nèi)核的底層處理例程,或者任務(wù)隊(duì)列來對(duì)之后需要調(diào)用的那些任務(wù)例程進(jìn)行排隊(duì)。</p><p>  4.1.3 linux設(shè)備模型</p><p><b>  1. 設(shè)備模型概要</b&

110、gt;</p><p>  Linux內(nèi)核設(shè)備模型與具體的設(shè)備驅(qū)動(dòng)編程是無關(guān)的,但是對(duì)理解linux下的設(shè)備驅(qū)動(dòng)程序中設(shè)備在底層的實(shí)現(xiàn)至關(guān)重要。</p><p>  由于各種熱插拔設(shè)備特別是usb設(shè)備的大量使用,內(nèi)核需要處理在系統(tǒng)運(yùn)行時(shí)設(shè)備的動(dòng)態(tài)插入和拔除,以及設(shè)備間復(fù)雜的依賴關(guān)系。為此,linux2.6之后引進(jìn)了新的內(nèi)核設(shè)備模型。設(shè)備模型提供了獨(dú)立的機(jī)制表示設(shè)備,并表示其在系統(tǒng)中的拓?fù)浣Y(jié)

111、構(gòu)。這樣做的優(yōu)點(diǎn)是:代碼重復(fù)最??;提供如引用計(jì)數(shù)這樣的統(tǒng)一機(jī)制;列舉系統(tǒng)中所有的設(shè)備,觀察其狀態(tài),查看其連接總線。用樹的形式將全部設(shè)備結(jié)構(gòu)完整、有效的展現(xiàn)出來,包括所有總線和內(nèi)部連接;將設(shè)備與對(duì)應(yīng)驅(qū)動(dòng)聯(lián)系起來;將設(shè)備按照類型進(jìn)行分類;從樹的葉子向根的方向依次遍歷,確保以正確的順序關(guān)閉各個(gè)設(shè)備的電源。[10]</p><p>  設(shè)備模型設(shè)計(jì)的初衷是為了節(jié)能,有助于電源管理。通過建立表示系統(tǒng)設(shè)備拓?fù)潢P(guān)系的樹結(jié)構(gòu),能

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論