基于嵌入式Linux的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)的研究_第1頁
基于嵌入式Linux的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)的研究_第2頁
基于嵌入式Linux的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)的研究_第3頁
基于嵌入式Linux的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)的研究_第4頁
基于嵌入式Linux的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)的研究_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、摘要隨著電子技術(shù)和多媒體及網(wǎng)絡(luò)技術(shù)的快速發(fā)展,視頻監(jiān)控系統(tǒng)正向嵌入式,數(shù)字化,網(wǎng)絡(luò)化方向發(fā)展。嵌入式視頻監(jiān)控系統(tǒng)利用大規(guī)模集成電路和網(wǎng)絡(luò)的科技成果。實(shí)現(xiàn)體積小,性能穩(wěn)定,通訊便利的監(jiān)控設(shè)備。本項(xiàng)目提出了在arm微處理器平臺上移植嵌入式linux操作系統(tǒng),并完成視頻采集、壓縮、控制等任務(wù)。系統(tǒng)硬件設(shè)備選擇采用實(shí)驗(yàn)室配備的arm9微處理器s3c2410作為主處理器,利用usb接口的攝像頭作為視頻采集設(shè)備。為降低產(chǎn)品成本,在此基礎(chǔ)上,借助linux下的開源軟件,構(gòu)建了整個嵌入式視頻監(jiān)控系統(tǒng)。關(guān)鍵詞:視頻監(jiān)控 嵌入式系統(tǒng) arm9 linux v4l視頻采集abstract with the rapi

2、d development of the electronic technology, multimedia technology and network technology, video surveillance system is going to the embedded, digital, networked direction. taking full advantage of lsi and networks of scientific and technological achievements, the embedded video surveillance system a

3、chieves delicate volume, stable performance, facilitates the communication of the surveillance equipment.the project is in arm microprocessor platform, and porting embedded linux system in it. it completes video capturing, compression, transmission and control tasks. the hard devices select the arm9

4、 (s3c2410) as the main processor in the system; and the usb camera as the device of video capture. in order to reduce the cost of the product, based on the architecture and with the open source software in linux, the whole embedded video surveillance system is implemented.keywords: video surveillanc

5、e embedded system arm9 linux video for linux 摘要11緒論41.1項(xiàng)目背景41.2視頻監(jiān)控系統(tǒng)的發(fā)展41.3論文的主要研究工作52視頻監(jiān)控系統(tǒng)方案設(shè)計(jì)52.1系統(tǒng)硬件設(shè)計(jì)方案52.2軟件設(shè)計(jì)方案63軟件開發(fā)環(huán)境的建立72.1嵌入式linux操作系統(tǒng)72.2建立交叉編譯環(huán)境92.3 bootloader的移植93.4 linux內(nèi)核編譯與移植103.5文件系統(tǒng)的移植114設(shè)備驅(qū)動程序開發(fā)簡介124.1 linux的驅(qū)動程序?qū)哟谓Y(jié)構(gòu)124.2字符型設(shè)備驅(qū)動程序144.3linux下驅(qū)動程序的實(shí)現(xiàn)144.4usb攝像頭選擇以及驅(qū)動設(shè)計(jì)155 linux下視

6、頻采集165.1視頻采集模塊的設(shè)計(jì)165.2 基于v4l的編程175.2.1video4linux中主要的數(shù)據(jù)結(jié)構(gòu)175.2.2視頻數(shù)據(jù)的讀取185.3在lcd上顯示視頻圖像196 視頻網(wǎng)絡(luò)傳輸模塊研究與實(shí)現(xiàn)206.1 tcpip協(xié)議簡介206.2基于webserver的視頻網(wǎng)絡(luò)傳輸模塊226.3播放視頻流231緒論1.1項(xiàng)目背景隨著電子技術(shù)和多媒體技術(shù)的飛速發(fā)展,利用嵌入式設(shè)備進(jìn)行數(shù)字處理傳送成為可能。嵌入式設(shè)備具有體積小、功耗低、數(shù)字化、安裝方便、價格低廉等優(yōu)點(diǎn),因此基于嵌入式的視頻采集和監(jiān)控成為了當(dāng)前嵌入式應(yīng)用開發(fā)領(lǐng)域的一個熱門課題。相比較傳統(tǒng)的視頻采集監(jiān)控系統(tǒng),它具有高可靠性、組網(wǎng)方便

7、、可遠(yuǎn)程監(jiān)控等優(yōu)點(diǎn),因而更適用于工業(yè)控制、銀行、政府部門的安防系統(tǒng)中。本文通過建立一個適用于家庭安保、學(xué)校等應(yīng)用場合的嵌入式網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng),在實(shí)驗(yàn)室環(huán)境下針對網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)的各項(xiàng)關(guān)鍵技術(shù)進(jìn)行研究,包括嵌入式linux技術(shù)、視頻采集、視頻圖像網(wǎng)絡(luò)化傳輸和運(yùn)動目標(biāo)檢測等。論文工作也將為網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)在其它領(lǐng)域的應(yīng)用起到一定的作用。如環(huán)境與安保集中監(jiān)控系統(tǒng)、移動監(jiān)控系統(tǒng)等領(lǐng)域以及智能小區(qū)、銀行、商場等場所。同時為了更好的學(xué)習(xí)linux,熟悉linux移植中的難點(diǎn)、要點(diǎn)。所以選擇以linux作為項(xiàng)目所需的操作系統(tǒng)。通過此項(xiàng)目,可以更深入的了解linux,熟悉驅(qū)動程序的編寫等。1.2視頻監(jiān)控系統(tǒng)的

8、發(fā)展隨著圖像(視頻)處理、網(wǎng)絡(luò)通信和微電子技術(shù)的快速發(fā)展,視頻以其直觀、方便和內(nèi)容豐富等特點(diǎn),日益受到人們的青睞。然而在很多應(yīng)用領(lǐng)域。智能視頻監(jiān)控是計(jì)算機(jī)視覺領(lǐng)域一個新興的應(yīng)用方向和備受關(guān)注的前沿課題。伴隨網(wǎng)絡(luò)技術(shù)和數(shù)字視頻技術(shù)的飛速發(fā)展,監(jiān)控技術(shù)正向著數(shù)字化、智能化、網(wǎng)絡(luò)化的方向不斷前進(jìn)。智能視頻監(jiān)控系統(tǒng)的需求主要來自那些對安全要求敏感的場合,如銀行、停車場、無人值守的變電站等。比如通過傳統(tǒng)的多媒體監(jiān)控系統(tǒng)雖然也可實(shí)現(xiàn)變電站的無人值守,但它只能獲取變電站的電氣參數(shù),并不能反映變電站運(yùn)行的其它方面的情況,如防火防盜,變壓器、開關(guān)等設(shè)備表面檢查等。另外,對于異常入侵及各類故障缺乏足夠的事后分析手

9、段,所以要實(shí)現(xiàn)變電站綜合全面的自動化管理,就需要一個功能完備的遠(yuǎn)程智能視頻監(jiān)控系統(tǒng)。智能監(jiān)控技術(shù)包括運(yùn)動目標(biāo)檢測、跟蹤、目標(biāo)分類和行為理解等方面。其中,處于整個視覺系統(tǒng)底層的運(yùn)動目標(biāo)檢測與跟蹤是各種后續(xù)高級處理如目標(biāo)分類、行為理解的基礎(chǔ)和關(guān)鍵,在自動導(dǎo)航、機(jī)器人目標(biāo)捕獲等研究方向上都具有舉足輕重的作用,從而更受到廣泛的研究和探討。視頻監(jiān)控系統(tǒng)大致經(jīng)歷了以下幾個階段,第一代模擬監(jiān)控系統(tǒng)、第二代數(shù)字化視頻監(jiān)控系統(tǒng)、第三代網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)三個階段。其中,第三代視頻監(jiān)控系統(tǒng)以網(wǎng)絡(luò)為依托,以數(shù)字視頻的壓縮、傳輸、存儲和播放為核心,以智能實(shí)用的圖像分析為特色,引發(fā)了視頻監(jiān)控行業(yè)的技術(shù)革命,受到了學(xué)術(shù)界、產(chǎn)

10、業(yè)界和使用部門的高度重視。1.3論文的主要研究工作論文基于中國科學(xué)技術(shù)大學(xué)軟件學(xué)院研究生的工程實(shí)踐項(xiàng)目,在深入研究了嵌入式linux操作系統(tǒng)、視頻數(shù)據(jù)的采集、壓縮與流媒體實(shí)時傳輸技術(shù)的基礎(chǔ)上,將上述三者有機(jī)結(jié)合起來設(shè)計(jì)了一套基于嵌入式linux操作系統(tǒng)的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)。論文的研究工作主要集中在以下幾個方面:(1) 系統(tǒng)軟硬件平臺的搭建;(2) linux系統(tǒng)的裁剪配置以及移植;(3) usb攝像頭的選擇以及l(fā)inux平臺上驅(qū)動程序的開發(fā);(4) 基于vidoo4linux的視頻采集程序的研究與實(shí)現(xiàn);(5) 基于webserver的視頻網(wǎng)絡(luò)傳輸模塊研究與實(shí)現(xiàn);(6) 客戶端視頻接收模塊的選擇與

11、設(shè)計(jì)實(shí)現(xiàn);2視頻監(jiān)控系統(tǒng)方案設(shè)計(jì)2.1系統(tǒng)硬件設(shè)計(jì)方案系統(tǒng)在總體布置上分為遠(yuǎn)程視頻監(jiān)測、現(xiàn)場視頻采集、本地lcd顯示三個部分。遠(yuǎn)程監(jiān)測端運(yùn)行于控制中心,它實(shí)時接收和顯示圖像數(shù)據(jù),采用普通pc即可,關(guān)鍵要能連入以太網(wǎng)。現(xiàn)場視頻采集采用ov511的網(wǎng)眼攝像頭,處理器采用基于三星s3c2410處理器的arm開發(fā)系統(tǒng),這里我們用了博創(chuàng)up-net arm2410-s試驗(yàn)箱。該試驗(yàn)箱提供了眾多的外設(shè)接口,特別是開發(fā)平臺上的10/l00m自適應(yīng)網(wǎng)絡(luò)接口和usb接口,特別適合本項(xiàng)目的使用環(huán)境。本系統(tǒng)硬件平臺集成了arm cpu、sdram以及flash,外設(shè)接口:rs-232串口 (com1),usb ho

12、st接口,自適應(yīng)以太網(wǎng)接口,tftlcd接口,一個觸摸屏接口。通過rs-232接口連接到宿主機(jī)上;通過在usb接口上外接一個usb口的攝像頭,將采集到的視頻圖像數(shù)據(jù)輸入緩沖區(qū)中,在本地lcd 上顯示,或是通過以太網(wǎng)傳到遠(yuǎn)端。系統(tǒng)硬件平臺如圖2-1所示用戶終端監(jiān)控終端數(shù)據(jù)壓縮數(shù)據(jù)傳輸層usb攝像頭s3c2410xsram電源及復(fù)位電路控制臺nand flash存儲設(shè)備sdramjtag接口圖2-1 系統(tǒng)硬件平臺結(jié)構(gòu)圖2.2軟件設(shè)計(jì)方案通過對嵌入式操作系統(tǒng)linux體系結(jié)構(gòu)的分析,結(jié)合arm處理器及其外圍設(shè)備的的特性,本系統(tǒng)中將軟件的體系結(jié)構(gòu)分為兩層:內(nèi)核空間和用戶空間。內(nèi)核空間:linux內(nèi)核以

13、及視頻采集、以及相關(guān)協(xié)議棧的移植。操作系統(tǒng)內(nèi)核的主要功能是管理任務(wù)、任務(wù)排序、提供中斷、系統(tǒng)時鐘管理以及實(shí)現(xiàn)硬件抽象層和視頻編碼內(nèi)核間的通信;為了使系統(tǒng)具有網(wǎng)絡(luò)傳輸功能,必須用到嵌入式操作系統(tǒng)中網(wǎng)絡(luò)協(xié)議如tcp/ip協(xié)議。應(yīng)用程序的接口由api來實(shí)現(xiàn),api的實(shí)現(xiàn)包括二個部分:一部分api作為庫來實(shí)現(xiàn)與應(yīng)用程序間的連接,一部分在socket中實(shí)現(xiàn)。用戶空間:即應(yīng)用層軟件,當(dāng)usb攝像頭驅(qū)動加載之后,視頻采集模塊采集攝像頭的視頻數(shù)據(jù),然后通過網(wǎng)絡(luò)傳送到遠(yuǎn)程客戶端。如圖2-2所示為系統(tǒng)的整體軟件設(shè)計(jì)架構(gòu)圖。視頻采集模塊usb攝像頭驅(qū)動程序bootloader網(wǎng)絡(luò)視頻流服務(wù)模塊以太網(wǎng)遠(yuǎn)程網(wǎng)絡(luò)監(jiān)控端圖

14、2-2 軟件系統(tǒng)架構(gòu)3軟件開發(fā)環(huán)境的建立基于嵌入式linux開發(fā)環(huán)境一般由目標(biāo)系統(tǒng)硬件開發(fā)板和裝有l(wèi)inux桌面版的主機(jī)平臺pc組成。linux主機(jī)上操作系統(tǒng)采用redhat9.0版本。目標(biāo)系統(tǒng)硬件開發(fā)板用來運(yùn)行嵌入式linux操作系統(tǒng)、用戶系統(tǒng)應(yīng)用程序等,而主機(jī)平臺用來進(jìn)行嵌入式操作系統(tǒng)內(nèi)核編譯,文件系統(tǒng)的制作和系統(tǒng)應(yīng)用程序開發(fā)和調(diào)試等。雙方通過串口、并口或者以太網(wǎng)口等建立連接。2.1嵌入式linux操作系統(tǒng)linux類似于unix,是免費(fèi)的,源代碼開放的,符合posix標(biāo)準(zhǔn)規(guī)范的操作系統(tǒng)。近幾年linux在嵌入式領(lǐng)域獲得了飛速發(fā)展,選擇linux作為嵌入式操作系統(tǒng)的嵌入式系統(tǒng)占很大比例。l

15、inux之所以有能在嵌入式系統(tǒng)市場上取得如此迅速的發(fā)展,與自身的優(yōu)點(diǎn)有著不可分割的關(guān)系。linux作為嵌入式操作系統(tǒng)的優(yōu)勢:linux正在嵌入式開發(fā)領(lǐng)域穩(wěn)步發(fā)展,是由于其自身具有非常適合于作為嵌入式操作系優(yōu)點(diǎn),主要表現(xiàn)在:使用成本低幾乎所有的商業(yè)用操作系統(tǒng)如microsoft公司的windows系列,都需要為每一個拷貝支付數(shù)量的費(fèi)用。但是limix是免費(fèi)軟件,只要遵守gpl的規(guī)定,就可以免費(fèi)獲得拷貝。linux同樣遵循gpl規(guī)定的c、c+、java等等一系列的軟件工具開發(fā)包,同時可以極大的降低開發(fā)成本。這點(diǎn)優(yōu)勢是其他商用操作系統(tǒng)無法比擬的。源代碼公開linux可以隨意地配置不需要任何的許可證或

16、商家的合作關(guān)系,任何人可修改并在linux下發(fā)行。linux帶有unix用戶熟悉的完善的開發(fā)工具,幾乎所有的unix系統(tǒng)的應(yīng)用軟件都己移植到了linux上。其強(qiáng)大的語言編譯器gcc、g+等也是開源的,可以很容易得到,并在不斷完善與成熟。支持多種硬件平臺linux擁有了一個龐大的支持者群體,其中許多人都編寫驅(qū)動程序和其它的更新程序并且免費(fèi)的通過intenet網(wǎng)絡(luò)進(jìn)行分發(fā)。現(xiàn)在linux已經(jīng)被移植到多種硬件平臺,支持包括x86、alpha、sparc、mips、powerpc、arm等現(xiàn)有的絕大部分微處理器體系結(jié)構(gòu)中。這對受開銷和時間限制的研究與開發(fā)項(xiàng)目是很有吸引力的,原型可以在標(biāo)準(zhǔn)平臺上開發(fā)然后

17、移植到具體的硬件上,加快了軟件與硬件的開發(fā)過程。強(qiáng)大的網(wǎng)絡(luò)功能linux操作系統(tǒng)最突出的是網(wǎng)絡(luò)部分,基本上所有的網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)接口都可以在linux上找到,linux內(nèi)核比標(biāo)準(zhǔn)的unix能夠更加高效地處理網(wǎng)絡(luò)協(xié)議,系統(tǒng)的網(wǎng)絡(luò)吞吐性能非常好,這也是為什么linux在網(wǎng)絡(luò)服務(wù)器市場上占據(jù)越來越大市場份額的一個原因。微內(nèi)核模塊化體系結(jié)構(gòu)linux操作系統(tǒng)本身的微內(nèi)核體系結(jié)構(gòu)相當(dāng)簡單,網(wǎng)絡(luò)和文件系統(tǒng)以模塊形式置于微內(nèi)核的上層,驅(qū)動程序和其它部件可在運(yùn)行時作為可加載模塊編譯到或者是添加到內(nèi)核,這為構(gòu)造定制的可嵌入系統(tǒng)提供了高度模塊化的構(gòu)件方法,使添加部件非常容易。系統(tǒng)小巧一個功能完備的linux內(nèi)核要求

18、大約imb內(nèi)存。而linux微內(nèi)核只占用其中很小一部分內(nèi)存,包括虛擬內(nèi)存和所有核心的操作系統(tǒng)功能在內(nèi),只需占用系統(tǒng)的100k內(nèi)存。2.2建立交叉編譯環(huán)境交叉編譯是嵌入式開發(fā)過程中的一項(xiàng)重要技術(shù),主要特征是某機(jī)器中執(zhí)行的程序代碼不是在本機(jī)編譯生成,而是由另一臺機(jī)器編譯生成。采用交叉編譯的主要原因在于,多數(shù)嵌入式目標(biāo)系統(tǒng)不能提供足夠的資源供編譯過程使用,因而只好將編譯工程轉(zhuǎn)移到pc中進(jìn)行。 當(dāng)前交叉編譯器有多種版本,本設(shè)計(jì)中使用2.95.3版的arm-linux-gcc。在網(wǎng)上下載該版本的交叉編譯器包:arm-linux-gcc2.95.3.tar.gz,將arm-linux-gcc2.95.3.

19、tar.gz拷貝到某個目錄下,然后進(jìn)入該目錄,執(zhí)行解包命令tar zxv arm-linux-gcc2.95.3.tar.gz ,然后編輯/etc/bash.rc文件,修改環(huán)境變量。以后編譯內(nèi)核或其他應(yīng)用程序均可用arm-linux-的前綴來指定交叉編譯器。2.3 bootloader的移植圖是一個典型的嵌入式應(yīng)用系統(tǒng)固態(tài)存儲設(shè)備的空間分配示意圖。bootloader是系統(tǒng)一加電所執(zhí)行的第一個程序,在操作系統(tǒng)內(nèi)核或用戶應(yīng)用程序運(yùn)行之前運(yùn)行。通過這段小程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),為最終調(diào)用操作系統(tǒng)內(nèi)核或用戶應(yīng)用程序準(zhǔn)備好正確的環(huán)境。b

20、ootloader 啟動參數(shù) 內(nèi)核 文件系統(tǒng)圖2-1bootloader及系統(tǒng)各個部分所處的層次bootloader是依賴于硬件而實(shí)現(xiàn)的,特別是在嵌入式系統(tǒng)中建立一個通用的bootloader幾乎是不可能的,不同的體系結(jié)構(gòu)需求的bootloader是不同的。除了體系結(jié)構(gòu),bootloader還依賴于具體的嵌入式板級設(shè)備的配置。也就是說,對于兩塊不同的嵌入式板而言,即使它們基于相同的cpu構(gòu)建,運(yùn)行在其中一塊電路板上的bootloader,未必能夠運(yùn)行在另一塊電路開發(fā)板上,因此我們必須對其進(jìn)行移植,這也是我們開發(fā)的第一步。通常都是對己有的bootloader進(jìn)行移植工作,如vivi和uboot等

21、。本系統(tǒng)中,采用vivi作為armg處理器的bootloader。vivi是韓國的而mizi公司開發(fā)的bootloader,適用于arm9處理器。vivi有兩種工作模式:啟動加載模式和下載模式。啟動加載模式可以在一段時間后(這個時間可更改)自行啟動linux內(nèi)核,這時vivi的默認(rèn)模式。在下載模式下,vivi為用戶提供一個命令行接口,通過接口可以使用vivi提供的一些命令。在vivi代碼的頭文件公共目錄 /include中,s3c2440.h文件定義了該處理器的一些寄存器,platform/smdk2440.h定義了與開發(fā)板相關(guān)的資源配置參數(shù),我們只需要修改這些文件就可以配置目標(biāo)板的參數(shù),如波

22、特率、引導(dǎo)參數(shù)、物理內(nèi)存映射等。vivi的嵌入式移植過程主要有以下六個步驟:(l)從mizi公司網(wǎng)站獲得vivi源文件,進(jìn)入vivi根目錄執(zhí)行vi命令修改makefile文件。(2)修改三個宏定義。liniuxincludedir:更改為交叉編譯器的include文件夾crosscompile:更改為交叉編譯器的可執(zhí)行文件的路徑armgcclibs:更改為交叉編譯器的lib庫文件的路徑(3)修改arch/s3c2440/smdk.c,主要是修改 nandflash的分區(qū)信息。(4)修改內(nèi)核啟動時使用的命令行初始參數(shù)。(5)#makemenucofig配置vivi。(6)#make vivi命令

23、編譯vivi源文件。可以獲得編譯成功的vivi二進(jìn)制代碼。 我們這里采用的是博創(chuàng)公司提供的已經(jīng)編譯好的適合于博創(chuàng)試驗(yàn)箱的vivi的二進(jìn)制文件。將vivi通過jtag燒寫在nandflash的地址ox00處,即完成了vivi的編譯和移植。3.4 linux內(nèi)核編譯與移植在對內(nèi)核移植前,需要根據(jù)系統(tǒng)硬件資源對linux內(nèi)核進(jìn)行配置和裁剪,以便在實(shí)現(xiàn)功能的前提下盡量減小內(nèi)核,充分利用嵌入式系統(tǒng)有限的資源。在宿主機(jī)linux系統(tǒng)終端下,進(jìn)入內(nèi)核源代碼的目錄,輸入 makemenucoonfig可以對內(nèi)核進(jìn)行配置,如圖所示。本系統(tǒng)中主要需要對一下參數(shù)進(jìn)行配置:處理器結(jié)構(gòu)、網(wǎng)絡(luò)功能、設(shè)備驅(qū)動、可執(zhí)行文件格

24、式等。內(nèi)核配置完畢后,即可通過以下命令對內(nèi)核進(jìn)行編譯: (1)makeclean:清除之前編譯生成的文件。 (2)makedep:建立內(nèi)核文件之間的聯(lián)系和依賴關(guān)系。 (3)makezlmage:生成最終所需要的映像文件。運(yùn)行以上三個命令之后,即可在二 /arch/arm/boot目錄下生成所需要的zimage映像文件。之后利用終端仿真程序minicom和bootloader引導(dǎo)程序通過串口就可以把linux內(nèi)核映像移植到目標(biāo)系統(tǒng)板的flash存儲中了,這兒我們用的是tftp工具:tftp flash kernel zimage3.5文件系統(tǒng)的移植在嵌入式系統(tǒng)中,一般采用 nandflash作為

25、代碼和數(shù)據(jù)存儲器。引導(dǎo)程序、內(nèi)核以及需要保存的數(shù)據(jù)等都要放在flash中,而且操作系統(tǒng)一般都需要在存儲器上建立文件系統(tǒng)才能對存儲器進(jìn)行操作,因此需要在flash上建立文件系統(tǒng)以滿足嵌入式操作系統(tǒng)和實(shí)際的需要。在linux里,系統(tǒng)對獨(dú)立的文件系統(tǒng)不是用設(shè)備標(biāo)示符來存取(比如驅(qū)動器編號或驅(qū)動器名稱),而是連接成為一個樹型結(jié)構(gòu)。linux在安裝新的文件系統(tǒng)時,把它安裝到指定的安裝目錄,從而合并到這個單一的文件系統(tǒng)樹上。linux的一個重要特征是它支持多種不同的文件系統(tǒng),文件系統(tǒng)將存放在系統(tǒng)硬盤上的文件和目錄用可以理解的統(tǒng)一形式提供給用戶,讓用戶不必考慮文件系統(tǒng)的類型或底層物理設(shè)備的特性。在嵌入式系統(tǒng)

26、中,常用的文件系統(tǒng)有ramfs、jffs2、cramfs等。cramfs是針對linux2.4內(nèi)核之后的版本所設(shè)計(jì)的一種新型文件系統(tǒng),也是壓縮和只讀格式的。它主要優(yōu)點(diǎn)是將文件數(shù)據(jù)以壓縮形式存儲,在需要運(yùn)行的時候進(jìn)行解壓縮。由于它存儲的文件形式是壓縮的格式,所以文件系統(tǒng)不能直接在flash上運(yùn)行。雖然這樣可以節(jié)約很多flash存儲空間,但是文件系統(tǒng)運(yùn)行需要將大量的數(shù)據(jù)拷貝進(jìn)ram中,消耗了ram空間。cramfs的移植過程如下:首先生成image:在kernel/script/cramfs有生成image程序的源代碼,編譯之后生成mkcramfs。建立一個目錄,將需要放到文件系統(tǒng)的文件復(fù)制到這個

27、目錄。如果目錄名為/mnt,要生成的image文件名為root.cramfs,則命令語句為:./mkcramfs /mnt root.cramfs然后,讓內(nèi)核支持cramfs:在kemel目錄執(zhí)行命令make menuconfig配置內(nèi)核需求,選中mtd(memorytechnologydeviee)設(shè)備,選擇直接編譯到內(nèi)核中去,這樣就不用insmod了。選中其中的相關(guān)選項(xiàng),可以根據(jù)自己的使用情況定制,多選中一些只是使啟動變得慢一些,內(nèi)核大一點(diǎn),沒有什么其他壞處。如果cramfs文件系統(tǒng)不是作為系統(tǒng)的根文件系統(tǒng),要改mtdblock0的主設(shè)備號從31改為30,這個修改在文件kernel/inc

28、lude/linux/mtd/mtd.h中。然后重新編譯內(nèi)核,重新燒寫內(nèi)核和文件系統(tǒng)的映像。系統(tǒng)啟動以后,就可以移植cramfs文件系統(tǒng)了,燒寫如下:tftp flash root root.cramfs至此本系統(tǒng)開發(fā)環(huán)境己經(jīng)建立起來。4設(shè)備驅(qū)動程序開發(fā)簡介4.1 linux的驅(qū)動程序?qū)哟谓Y(jié)構(gòu)在嵌入式系統(tǒng)中,操作系統(tǒng)是介于應(yīng)用程序與硬件之間的一個系統(tǒng)軟件,其作用是為用戶提供統(tǒng)一的api接口。操作系統(tǒng)所面對的硬件設(shè)備種類非常多,不同型號不同廠家的設(shè)備又具有各自不同的特點(diǎn),因此,要支持某種設(shè)備就必須提供這種設(shè)備的控制代碼,然后把它加載進(jìn)內(nèi)核,內(nèi)核才能使用該設(shè)備。從內(nèi)核的角度來看,驅(qū)動程序是一個設(shè)備

29、的代表。當(dāng)內(nèi)核需要與某個設(shè)備交互時,就找到該設(shè)備的驅(qū)動程序,而后通過標(biāo)準(zhǔn)的接口調(diào)用驅(qū)動程序的相應(yīng)函數(shù),控制設(shè)備,而內(nèi)核并不需要知道驅(qū)動程序如何工作,也不需要了解設(shè)備的細(xì)節(jié),設(shè)備的細(xì)節(jié)由驅(qū)動程序掌握。驅(qū)動程序可以動態(tài)地加載和卸載,內(nèi)核只包含必需設(shè)備的驅(qū)動程序。設(shè)備驅(qū)動程序一般需要完成以下功能:(1)對設(shè)備初始化和釋放;(2)把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);(3)讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序的請求數(shù)據(jù);(4)檢測和處理設(shè)備出現(xiàn)的錯誤。在linux操作系統(tǒng)下有三類主要設(shè)備文件類型:塊設(shè)備、字符設(shè)備和網(wǎng)絡(luò)設(shè)備。用戶進(jìn)程正是通過設(shè)備文件來與硬件打交道。每個設(shè)備文件都有其文件屬性

30、(cb),表示是字符設(shè)備還是塊設(shè)備。另外每個文件都有2個設(shè)備號,第一個是主設(shè)備號,標(biāo)識驅(qū)動程序;第二個是從設(shè)備號,標(biāo)識使用同一個設(shè)備驅(qū)動程序的不同硬件設(shè)備。設(shè)備文件的主設(shè)備號必須與設(shè)備驅(qū)動程序在登記時申請的設(shè)備號一致,否則用戶進(jìn)程將無法訪問驅(qū)動程序。linux的設(shè)備驅(qū)動程序可分為三個主要部分:(1) 自動配置和仞始化子程序,負(fù)責(zé)檢測所要驅(qū)動的硬件設(shè)備是否存在和能否正常工作。如果該設(shè)備正常,則對這個設(shè)備及其他必需的條件(如中斷、dma通道)進(jìn)行申請并初始化。這部分驅(qū)動程序僅在初始化時被調(diào)用一次。(2) 服務(wù)于io請求的子程序,又稱為驅(qū)動程序的上半部分。調(diào)用這部分程序是由于系統(tǒng)調(diào)用的結(jié)果。這部分程

31、序在執(zhí)行時,系統(tǒng)仍認(rèn)為是與進(jìn)行調(diào)用的進(jìn)程屬于同一個進(jìn)程,只是由用戶態(tài)變成了核心態(tài),但仍具有進(jìn)行此系統(tǒng)調(diào)用的用戶程序的運(yùn)行環(huán)境,因而可以在其中調(diào)用與進(jìn)程運(yùn)行環(huán)境相關(guān)的函數(shù)。(3) 中斷服務(wù)子程序,又稱為驅(qū)動程序的下半部分。在linux操作系統(tǒng)中,并不是直接從中斷向量表中調(diào)用設(shè)備驅(qū)動程序的中斷服務(wù)子程序,而是由linux系統(tǒng)束接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務(wù)子程序。中斷可以在任何一個進(jìn)程運(yùn)行時產(chǎn)生,因而在中斷服務(wù)子程序被調(diào)用時,不能依賴于任何進(jìn)程的狀態(tài),也就不能調(diào)用任何與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。因?yàn)樵O(shè)備驅(qū)動程序一般支持同一類型的若干設(shè)備,所以一般在系統(tǒng)調(diào)用中斷服務(wù)子程序時,都帶有一個或多個參數(shù),

32、以唯一標(biāo)識請求服務(wù)的設(shè)備。4.2字符型設(shè)備驅(qū)動程序在系統(tǒng)內(nèi)部,i/o設(shè)備的存取通過設(shè)備驅(qū)動程序提供的一組固定的入口點(diǎn)來進(jìn)行,這組入口點(diǎn)在驅(qū)動程序初始化時向系統(tǒng)進(jìn)行登記,以便在系統(tǒng)適當(dāng)?shù)臅r候調(diào)用。一般來說,字符型設(shè)備驅(qū)動程序能夠提供如下幾個入口點(diǎn):(1) open入口點(diǎn):打開設(shè)備準(zhǔn)備io操作,對字符特別設(shè)備進(jìn)行打丌操作,都會調(diào)用設(shè)備的open入口點(diǎn)。open子程序必須對將要進(jìn)行的io操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。如果設(shè)備是獨(dú)占的,即同一時刻只能有一個程序訪問此設(shè)備,則open子程序必須設(shè)置一些標(biāo)志以表示設(shè)備的狀態(tài)。函數(shù)原型:int (*open)(struct innod*,struc

33、t file* ) (2)close入口點(diǎn):關(guān)閉一個設(shè)備,當(dāng)最后一次使用設(shè)備結(jié)束后,調(diào)用close子程序。獨(dú)占設(shè)備必須標(biāo)記設(shè)備可再次使用。函數(shù)原型:int (*release)(struct innod*,struct file* )(3)read入口點(diǎn):讀取設(shè)備,對于有緩沖區(qū)的io操作,一般從緩沖區(qū)罩讀取設(shè)備數(shù)據(jù)。函數(shù)原型:ssize_t(*read)(struet flle*,char*,size_st,loff_t*):(4)write入口點(diǎn):向設(shè)備寫數(shù)據(jù),對于有緩沖區(qū)的io操作,一般向緩沖區(qū)里寫入數(shù)據(jù)。函數(shù)原型:ssize_t(*write)(struet flle*,const ch

34、ar*,size_st,loff_t*):(5)ioctl入口點(diǎn):執(zhí)行讀寫之外的操作。函數(shù)原型:int (*ioctl)(struct inode*,struct file*,unsighed int,unsighed long)4.3linux下驅(qū)動程序的實(shí)現(xiàn)linux對一個硬件設(shè)備的驅(qū)動有兩種方式:一種是直接加載到內(nèi)核代碼中,啟動內(nèi)核時就會驅(qū)動此硬件設(shè)備;另一種是以模塊方式,編譯生成一個.o文件。模塊(module)是在內(nèi)核空間運(yùn)行的程序,實(shí)際上是一種目標(biāo)對象文件,沒有鏈接,不能獨(dú)立運(yùn)行,但是可以裝載到系統(tǒng)中作為內(nèi)核的一部分運(yùn)行,從而可以動態(tài)擴(kuò)充內(nèi)核的功能。模塊最主要的用處就是用來實(shí)現(xiàn)設(shè)備

35、驅(qū)動程序,當(dāng)應(yīng)用程序需要它時再加載進(jìn)內(nèi)核空間運(yùn)行。通常一個硬件的驅(qū)動程序就是指一個驅(qū)動模塊。對于任何一個硬件設(shè)備,它在/dev下面存在一個對應(yīng)的邏輯設(shè)備節(jié)點(diǎn),即通常所說的設(shè)備文件。這個節(jié)點(diǎn)是通過mknod命令建立的,其中指定了主設(shè)備號和次設(shè)備號。主設(shè)備號表明了某一類設(shè)備,一般對應(yīng)確定的驅(qū)動程序;次設(shè)備號一般用于區(qū)分不同屬性,例如不同的使用方法,不同的位置,不同的操作。這個設(shè)備號是從/proc/devices文件中獲得的,所以一般是先有驅(qū)動程序在內(nèi)核中,才有設(shè)備節(jié)點(diǎn)在目錄中。圖4-1表明了驅(qū)動程序與系統(tǒng)之間的關(guān)系。通過模塊的read writ操作mknod通過主次設(shè)備號相連返回主設(shè)備號insmo

36、d向系統(tǒng)注冊open read write操作應(yīng)用程序硬件設(shè)備文件驅(qū)動模塊/etc/modules.conf文件內(nèi)核圖4-1 驅(qū)動程序與系統(tǒng)的關(guān)系4.4usb攝像頭選擇以及驅(qū)動設(shè)計(jì)目前比較流行的攝像頭是基于ov511芯片和zc301芯片的,已有很多關(guān)于zc301芯片的開發(fā)文檔之類,ov511可能比較陳舊,可參考的資料不是很多,我們攝像頭的選擇取決于實(shí)驗(yàn)室配置的開發(fā)板三星s3c2410的開發(fā)板,選擇網(wǎng)眼的ov511攝像頭。攝像頭屬于視頻設(shè)備,在linux內(nèi)核中,video for linux(簡稱v4l)是關(guān)于視頻設(shè)備的驅(qū)動標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)為應(yīng)用程序定義了一系列的接口函數(shù),內(nèi)核、驅(qū)動和應(yīng)用程序都是

37、依靠這個標(biāo)準(zhǔn)來進(jìn)行交流。本系統(tǒng)所使用的usb攝像頭正是基于該標(biāo)準(zhǔn)來編寫驅(qū)動和應(yīng)用程序的。linux內(nèi)核是依據(jù)設(shè)備號來操作設(shè)備文件的,在內(nèi)核中,攝像頭對應(yīng)的設(shè)備文件名為/dev/video0,主設(shè)備號是81,次設(shè)備號根據(jù)攝像頭數(shù)目來確定,本系統(tǒng)中僅使用一個攝像頭,所以可以通過mknod /dev/video0 c 81 0末創(chuàng)建節(jié)點(diǎn)。如下圖4-2攝像頭驅(qū)動的實(shí)現(xiàn)原理用戶進(jìn)程系統(tǒng)調(diào)用接收緩沖區(qū)|發(fā)送緩沖區(qū)文件操作接口終端服務(wù)程序攝像頭圖4-2 攝像頭驅(qū)動的實(shí)現(xiàn)5 linux下視頻采集5.1視頻采集模塊的設(shè)計(jì)視頻采集模塊的任務(wù)是從usb攝像頭設(shè)備中讀取視頻幀數(shù)據(jù),并將獲取的視頻數(shù)據(jù)壓縮成一定格式保存

38、。它是后邊圖像處理,視頻監(jiān)測的基礎(chǔ)。linux系統(tǒng)中的視頻采集子系統(tǒng)video4linux為視頻應(yīng)用程序提供了一套統(tǒng)一的api,視頻應(yīng)用程序通過標(biāo)準(zhǔn)的系統(tǒng)調(diào)用即可操作各種不同的視頻捕獲設(shè)備。video4linux向虛擬文件系統(tǒng)注冊視頻設(shè)備文件,應(yīng)用程序通過操作視頻設(shè)備文件實(shí)現(xiàn)對視頻設(shè)備的訪問。在嵌入式linux的內(nèi)核定制和編譯階段,已經(jīng)加入了對v4l模塊以及ov511設(shè)備的支持,運(yùn)行l(wèi)inux下的視頻圖像采集程序,可以通過v4l提供的編程接口(api)從ov5n設(shè)備中獲取圖像幀。linux下與video4linux相關(guān)設(shè)備及用途如表所示設(shè)備名稱minor range功能/dev/video0-

39、63視頻捕捉接口/dev/radio64-127am/fm音頻接口/dev/vtx193-224文字電視廣播/dev/vbi224-239原始vbi數(shù)據(jù)這里主要針對設(shè)備文件/dev/video進(jìn)行視頻捕捉方面的程序設(shè)計(jì)。將一個usb hub接到開發(fā)平臺的usb host上,運(yùn)行cat/proc/devices可以知道video capture device的主設(shè)備號是81,再運(yùn)行l(wèi)s -l/dev看到video0的次設(shè)備號是0。為攝像頭建立設(shè)備號,mknod /dev/video0 c 81 0。v4l模塊的視頻采集接口設(shè)備為/dev/video,而usb攝像頭加載后生成的設(shè)備文件為/dev/

40、v4l/video0,為了和v4l模塊相協(xié)調(diào),使用in -s/dev/v4l/video0 /dev/video0為v4l模塊的默認(rèn)設(shè)備video與物理設(shè)備video0建立連接。采集程序打開該接口并掃描以尋找需要的數(shù)據(jù)。5.2 基于v4l的編程5.2.1video4linux中主要的數(shù)據(jù)結(jié)構(gòu)video4linux支持的數(shù)據(jù)結(jié)構(gòu)及其用途(1) video_capability 包含設(shè)備的基本信息(設(shè)備名稱、支持的最大最小分辨率、信號源信息等)包含的分量:name32 /設(shè)備名稱maxwidth ,maxheight,minwidth,minheightchannels /信號源個數(shù)type /是

41、否能capture,彩色還是黑白,是否能裁剪等等。值如vid_type_capture等具體實(shí)現(xiàn)函數(shù)如下:int camere_get_capability(camera_device*vd)if(ioctl(vdfd,vidiocgcap,&(vdcapability)0)permr(“camer_get_cability:”):return -1;return 0; (2)video_picture 讀 video-picnire中信息,成功后可讀取圖像的屬性,包括視頻圖像的亮度、色度、對比度等。 int camere_get_picture(camere_device*vd)if(ioe

42、tl(vdfd,vidiocgpict,&(vdpicture)0)perror(“camera _get_picture:”)return -1;return 0;(3) 設(shè)置video-picture中分量的值,先為分量賦新值,再調(diào)用vidiocgpict。vdpicture.colour=65535;if(ioctl(vdfd,vidiocgpict,&(vdpicture)0)perror(“camere_get_picture:”):return -1;(4) 初始化channel。必須先得到vdc即ability中的信息。實(shí)現(xiàn)過程如下:for(i=0 :i vdcapability

43、.channels: i+)vdchanneli.channel=i:if(ioetl(vdfd,vidiocgchan,&(vdchanneli)videombuf),0,sizeof(vd-videombuf)來清零緩沖區(qū)。然后使用函數(shù)vd-map=(unsigned char*)mmap(0,vd-mbuf.size,prot_read|prot_write,mapshared,vd-fd,ff_t offset)使設(shè)備內(nèi)容映射到內(nèi)存區(qū),其中第一個參數(shù)為共享內(nèi)存的起始地址,一般設(shè)為0,表示由系統(tǒng)分配;第二個參數(shù)為映射到調(diào)用進(jìn)程地址空間的字節(jié)數(shù),它從被映射文件開頭offset個字節(jié)丌始算起

44、;第三個參數(shù)指定共享內(nèi)存的訪問權(quán)限(prot_read(可讀),prot_write(可寫),prot_exec(可執(zhí)行);第四個參數(shù)可以是map_shared或者map_private;第五個參數(shù)為設(shè)備描述符。mmap()成功調(diào)用后返回系統(tǒng)實(shí)際分配的起始地址。內(nèi)存映射方式下真正進(jìn)行視頻截取的是ioctl系統(tǒng)調(diào)用的vidiocmcapture命令,若函數(shù)成功調(diào)用,再用vidiocsync命令來判斷圖像截耿是否已經(jīng)完畢,若該函數(shù)調(diào)用成功,則表明一幀圖像的截取己完成,便丌始下一幀圖像數(shù)據(jù)的截取,并將當(dāng)前截耿的幀號按緩沖區(qū)總幀數(shù)的模加上1。5.3在lcd上顯示視頻圖像在usb攝像頭被驅(qū)動后,只需要再

45、編寫一個對視頻流采集的應(yīng)用程序就可以了。根據(jù)嵌入式系統(tǒng)開發(fā)特征,先在宿主機(jī)上編寫應(yīng)用程序,再使用交叉編譯器進(jìn)行編譯鏈接,生成在目標(biāo)平臺的可執(zhí)行文件。宿主機(jī)與目標(biāo)板通信采用打印終端的方式進(jìn)行交叉調(diào)試,成功后移植到目標(biāo)平臺。首先打開視頻設(shè)備,攝像頭在系統(tǒng)中對應(yīng)的設(shè)備文件為/dev/video0。在類初始化里面完成,其調(diào)用函數(shù)fd = open (/dev/video0, o_ rdwr); fd是設(shè)備打開后返回的文件描述符(打開錯誤返回一1)。以后的系統(tǒng)調(diào)用函數(shù)就可使用它來對設(shè)備文件進(jìn)行操作了。接著,利用ioct1 ( fd, vidiocgcap, & vid_caps)函數(shù)讀取struct v

46、ideo capability中有關(guān)攝像頭的信息。該函數(shù)成功返回后,這些信息從內(nèi)核空間拷貝到用戶程序空間vid_caps各成員分量中。用ioctl(fd, vidiocgpict, & vid_tic)函數(shù)讀取攝像頭緩沖中voideo_picture信息,在用戶空間程序中可以改變這些信息。完成以上初始化設(shè)備工作后,就可以對視頻圖像截取了。在lcd上的顯示如圖所示6 視頻網(wǎng)絡(luò)傳輸模塊研究與實(shí)現(xiàn)要實(shí)現(xiàn)監(jiān)控現(xiàn)場,除了完成視頻采集的編程,還需要把視頻圖像數(shù)據(jù)通過網(wǎng)絡(luò)傳輸出去,因此需要在完成視頻采集的基礎(chǔ)上建立網(wǎng)絡(luò)服務(wù)器,實(shí)現(xiàn)客戶端和服務(wù)器之間的數(shù)據(jù)通信。本系統(tǒng)視頻的網(wǎng)絡(luò)傳輸是基于tcp協(xié)議來實(shí)現(xiàn),前端

47、嵌入式機(jī)作為視頻服務(wù)器負(fù)責(zé)視頻采集并建立好tcp服務(wù)器,等待客戶端的連接;客戶端做好一系列初始化工作后,主動連接服務(wù)器,得到應(yīng)答后建立連接接收壓縮視頻數(shù)據(jù)并實(shí)時顯示,同時可以根據(jù)用戶的要求進(jìn)行實(shí)時或定時保存圖像或者視頻文件。6.1 tcpip協(xié)議簡介tcpip協(xié)議是針對ni司njt-發(fā)的體系結(jié)構(gòu)和協(xié)議標(biāo)準(zhǔn),廣泛地應(yīng)用于組建網(wǎng)絡(luò)中。它雖不是國際標(biāo)準(zhǔn),但卻是用戶可獲得的“既成事實(shí)”的標(biāo)準(zhǔn)。tcpip傳輸層有兩個并列的協(xié)議:tcp協(xié)議和udp協(xié)議。其中tcp是面向連接的,而udp是面向無連接的。它們都是建立在ip協(xié)議之上。tcp提供應(yīng)用程序的服務(wù)與udp提供的服務(wù)是不同的。(1)面向連接tcp協(xié)議是面向連接,客戶程序要與服務(wù)程序建立一個連接才能通過這個連接傳輸數(shù)據(jù),并在結(jié)束時斷開這個連接。(2)可靠性tcp協(xié)議提供了可靠性,發(fā)送的數(shù)據(jù)

溫馨提示

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

最新文檔

評論

0/150

提交評論