第一篇:基于ARM的視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
基于ARM的視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
摘要
本文根據(jù)家庭視頻采集系統(tǒng)的要求,提出一種基于ARM的網(wǎng)絡(luò)視頻采集方案。方案要求視頻的實(shí)時(shí)傳輸、實(shí)時(shí)監(jiān)控。本系統(tǒng)以Intel Xscale 芯片和嵌入式Linux系統(tǒng)為平臺(tái),在平臺(tái)中搭建網(wǎng)絡(luò)視頻服務(wù)器,并以它為中介,負(fù)責(zé)將USB攝像頭采集到得視頻數(shù)據(jù)傳輸?shù)骄W(wǎng)絡(luò)服務(wù)器中,最后發(fā)送到申請監(jiān)控的遠(yuǎn)程PC機(jī)中,遠(yuǎn)程PC只需在網(wǎng)頁中便能實(shí)時(shí)的看到監(jiān)控端的視頻圖像。
論文首先闡述了嵌入式網(wǎng)絡(luò)視頻采集技術(shù)的發(fā)展、現(xiàn)狀和前景,然后介紹了嵌入式硬件系統(tǒng)結(jié)構(gòu)和嵌入式Linux操作系統(tǒng)的特點(diǎn),闡述了嵌入式硬件整體結(jié)構(gòu),使大家大體的完整的對系統(tǒng)硬件有詳細(xì)的了解,實(shí)際記錄了嵌入式操作系統(tǒng)內(nèi)核的編譯和移植,介紹了Bootloader的基本原理和啟動(dòng)過程,實(shí)現(xiàn)了視頻采集程序的編譯和移植,研究了嵌入式一般驅(qū)動(dòng)程序的使用。隨后,本文詳細(xì)描述了視頻采集程序的整體結(jié)構(gòu)框圖和具體功能代碼塊、網(wǎng)絡(luò)通信編程技術(shù)、圖像編解碼、嵌入式視頻服。
關(guān)鍵詞:ARM;嵌入式;Linux;視頻采集
I
目錄
摘 要.............................................................................................................................I 第1章 引言.................................................................................................................1
1.1 課題的背景和來源..........................................................................................1 1.2本文的內(nèi)容及主要工作..................................................................................1 第2章 嵌入式ARM系統(tǒng)硬件結(jié)構(gòu)簡介..................................................................3
2.1 視頻監(jiān)控系統(tǒng)結(jié)構(gòu)簡介..................................................................................3 2.2 ARM處理器簡介.............................................................................................3 2.3 XSCALE體系結(jié)構(gòu)............................................................................................4 2.4 主要硬件電路說明..........................................................................................7 第3章 嵌入式ARM系統(tǒng)軟件結(jié)構(gòu)..........................................................................9
3.1 LINUX操作系統(tǒng)簡介.......................................................................................9 3.2 交叉編譯環(huán)境的建立....................................................................................10 3.3 嵌入式LINUX操作系統(tǒng)移植........................................................................11 3.3.1 BootLorder移植...................................................................................11 3.3.2 Linux 內(nèi)核移植...................................................................................12 3.3.3 嵌入式文件系統(tǒng).................................................................................13 3.4 LINUX下的程序調(diào)試.....................................................................................14 第4章 USB設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)...............................................................................15 4.1 設(shè)備驅(qū)動(dòng)程序簡介........................................................................................15 4.2 LINUX下驅(qū)動(dòng)程序的實(shí)現(xiàn).............................................................................18 4.3 USB攝像頭驅(qū)動(dòng)程序設(shè)計(jì)............................................................................20 第5章 視頻采集功能的設(shè)計(jì)...................................................................................23 5.1 基于V4L的編程...........................................................................................24 5.1.1 攝像頭相關(guān)數(shù)據(jù)結(jié)構(gòu).........................................................................24 5.1.2 攝像頭基本功能實(shí)現(xiàn).........................................................................25 5.1.3 視頻數(shù)據(jù)采集.....................................................................................29 5.2 圖像編解碼....................................................................................................32 5.2.1 編解碼介紹.........................................................................................32 5.2.2 系統(tǒng)壓縮技術(shù).....................................................................................33
第1章引言
1.1課題的背景和來源
二十一世紀(jì)的網(wǎng)絡(luò)化、數(shù)字化讓人們的生活每天都發(fā)生著翻天覆地的變化,獲取信息的方便和快捷可以使人們在信息化的今天領(lǐng)先一步創(chuàng)造出巨大的利益,而獲取信息的重要途徑就是眼睛。據(jù)統(tǒng)計(jì),人類采集信息的80%來自視覺。圖像和視頻是對客觀事物生動(dòng)、形象的描述,是一種最直觀的表現(xiàn)方式。而視頻監(jiān)控技術(shù)因?yàn)樗奖憧旖?、生?dòng)形象、信息豐富等特點(diǎn)日益受到人們的青睞,并在各行各業(yè)得到廣泛的應(yīng)用。與此同時(shí),現(xiàn)代網(wǎng)絡(luò)和數(shù)字技術(shù)的快速發(fā)展也為視頻監(jiān)控技術(shù)的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
二十一世紀(jì),嵌入式技術(shù)、多媒體處理技術(shù)進(jìn)一步發(fā)展,為視頻監(jiān)控系統(tǒng)的發(fā)展提供了新的出路——嵌入式視頻監(jiān)控系統(tǒng)。嵌入式系統(tǒng)是以應(yīng)用為中心,軟硬件可以剪裁,具有高穩(wěn)定、低成本、功耗低、速度快、實(shí)時(shí)好的專用計(jì)算機(jī)系統(tǒng),它由嵌入式微處理器,配以周邊硬件設(shè)備,接口電路組成。嵌入式系統(tǒng)內(nèi)部使用嵌入式操作系統(tǒng),安裝專用的功能軟件。嵌入式技術(shù)把硬件和軟件集于一體,獨(dú)立工作。嵌入式視頻監(jiān)控系統(tǒng)比其他視頻采集系統(tǒng)在布局區(qū)域范圍上要廣泛;由于使用IP技術(shù),嵌入式視頻監(jiān)控技術(shù)比其他視頻采集系統(tǒng)更具緊密的結(jié)合度,能夠充分利用現(xiàn)代網(wǎng)絡(luò)技術(shù)的成果,并能構(gòu)成復(fù)雜的視頻監(jiān)控網(wǎng)絡(luò);性能上,嵌入式視頻采集系統(tǒng)繼承了嵌入式技術(shù)的優(yōu)點(diǎn),非常適合自動(dòng)化的環(huán)境。
因此,嵌入式視頻采集技術(shù)正在我國快速的發(fā)展,積極的研究會(huì)加強(qiáng)我們在這方面技術(shù)的學(xué)習(xí),也會(huì)為視頻監(jiān)控技術(shù)的發(fā)展貢獻(xiàn)力量。
1.2本文的內(nèi)容及主要工作
根據(jù)畢業(yè)設(shè)計(jì)的初衷,我們需要設(shè)計(jì)基于ARM的網(wǎng)絡(luò)視頻采集系統(tǒng)。在監(jiān)控系統(tǒng)中,視頻采集、傳輸、播放的功能不是由專門視頻處理芯片完成,而是由軟件實(shí)現(xiàn)。
論文首先介紹了嵌入式ARM系統(tǒng)的硬件結(jié)構(gòu)和軟件結(jié)構(gòu),方便大家熟悉ARM和Linux系統(tǒng),包括嵌入式設(shè)備的硬件結(jié)構(gòu),邏輯框圖和Linux的基本操作、安裝方法;第二,研究了嵌入式的一些驅(qū)動(dòng)程序,主要是攝像頭驅(qū)動(dòng)程序
V4L,系統(tǒng)中選用的攝像頭芯片——中星微301;第三,研究了視頻監(jiān)控的具體流程和實(shí)現(xiàn)方式,讓大家在總體上對整個(gè)系統(tǒng)有一個(gè)大概的認(rèn)知。
本次設(shè)計(jì)的目的只有一個(gè),就是實(shí)現(xiàn)視頻的實(shí)時(shí)監(jiān)控。圍繞它,不管是硬件結(jié)構(gòu)還是軟件流程,都需要學(xué)習(xí)和研究,不斷調(diào)試,決不放棄。
總之,論文的內(nèi)容都是圍繞如何建立一個(gè)視頻采集系統(tǒng)。無論是從哪個(gè)方面,我們都是為這個(gè)目標(biāo)而努力。2
第2章嵌入式ARM系統(tǒng)硬件結(jié)構(gòu)簡介
2.1視頻監(jiān)控系統(tǒng)結(jié)構(gòu)簡介
網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)是基于嵌入式技術(shù)設(shè)計(jì)的。嵌入式并沒有統(tǒng)一的定義,但目前有一個(gè)廣泛而又被認(rèn)可的規(guī)范:將軟件產(chǎn)品固化到硬件平臺(tái)上,完成應(yīng)有的功能既是嵌入式。
基于嵌入式ARM技術(shù)的視頻監(jiān)控系統(tǒng)服務(wù)器端采用攝像頭不斷的采集圖像,壓縮成視頻流,然后通過網(wǎng)絡(luò)發(fā)送到申請監(jiān)控的客戶端。監(jiān)控系統(tǒng)的使用者可以在遠(yuǎn)程實(shí)現(xiàn)網(wǎng)頁上的實(shí)時(shí)監(jiān)控和一些簡單的功能操作。系統(tǒng)整體結(jié)構(gòu)如圖2.1所示[1]。
LCDJTAG攝像頭ZC301CPU單元Intel Xscale以太網(wǎng)控制器遠(yuǎn)程PC客戶端SDRAMFLASH
圖2.1 系統(tǒng)整體結(jié)構(gòu)圖
該系統(tǒng)中CPU采用基于ARM的PXA270微處理器,通過在其上運(yùn)行Linux操作系統(tǒng),執(zhí)行Boa視頻服務(wù)器,接受并處理來自攝像頭的圖像信號,通過以太網(wǎng)控制器發(fā)送至遠(yuǎn)端,實(shí)現(xiàn)視頻數(shù)據(jù)的遠(yuǎn)程傳輸和接受,達(dá)到視頻監(jiān)控的目的[2]。
2.2ARM處理器簡介
ARM,既是一個(gè)公司的名字,也是對一類微處理器的通稱。ARM嵌入式微處理器是全球領(lǐng)先的16/32位RISK處理器芯片知識產(chǎn)權(quán)設(shè)計(jì)供應(yīng)商ARM(AdvancedRISKMachines)公司的產(chǎn)品。ARM公司本身不直接從事芯片生產(chǎn),而是依靠轉(zhuǎn)讓設(shè)計(jì)許可,由合作公司生產(chǎn)各具特色的芯片。
ARM處理器以其完整的體系結(jié)構(gòu),極小的體積、極低的功耗、極低的成本、極高的性能,及時(shí)根據(jù)嵌入對象的不同進(jìn)行功能上的擴(kuò)展的優(yōu)勢,在眾多種類的嵌入式微處理器中脫穎而出?;贏RM技術(shù)的微處理器應(yīng)用占據(jù)了32位RISC微處理器75%以上的市場份額,ARM技術(shù)正在逐步滲入到我們生活的各個(gè)方面。
采用RISC架構(gòu)的ARM微處理器一般具有如下特點(diǎn):
(1)采用固定長度的指令格式,指令規(guī)整、簡單、基本尋址方式有2~3種;(2)使用單周期指令,便于流水線操作執(zhí)行;
(3)大量使用寄存器,數(shù)據(jù)處理指令只對寄存器進(jìn)行操作,以提高指令的執(zhí)行效率;
(4)所有的指令都可根據(jù)前面的執(zhí)行結(jié)果決定是否被執(zhí)行,從而提高指令的執(zhí)行效率;
(5)可用加載/存儲(chǔ)指令批量傳輸數(shù)據(jù),以提高數(shù)據(jù)的傳輸效率;(6)可在一條數(shù)據(jù)處理指令中同時(shí)完成邏輯處理和移位處理;(7)在循環(huán)處理中使用地址的自動(dòng)增減來提高運(yùn)行效率。
目前,ARM處理器有ARM7、ARM9、ARM9E、ARM10、ARM10E、SecurCore、StrongARM和XScale等系列。每個(gè)系列除了具有ARM體系結(jié)構(gòu)的共同特點(diǎn)以外,都有各自的特點(diǎn)和應(yīng)用領(lǐng)域。
2.3XScale體系結(jié)構(gòu)
Xscale核是采用ARM V5TE架構(gòu)的處理器,是Intel公司的StrongARM的升級換代產(chǎn)品,它具有高性能、低功耗等特點(diǎn),并在流水線設(shè)計(jì)、DSP處理和指令設(shè)計(jì)中有很大改進(jìn)[3]。ARM的體系結(jié)構(gòu)是基于RISK的,XScale是ARM處理器的一種,所以XScale具有RISK的基本特性。而且針對嵌入式系統(tǒng),XScale構(gòu)架還引入了Pentium處理器工藝和系統(tǒng)結(jié)構(gòu)技術(shù),實(shí)現(xiàn)了Pentium微處理器體系結(jié)構(gòu)的一系列高性能技術(shù),達(dá)到了高性能、低功耗和小體積等嵌入式系統(tǒng)要求的特性。它的特點(diǎn)有:超流水線、高主頻、存儲(chǔ)體系、分支預(yù)測和指令集體系結(jié)構(gòu)。本設(shè)計(jì)采用的就是基于英特爾Xscale構(gòu)架的一種32位嵌入式處理器,它除了應(yīng)用于掌上電腦之中外,還可以應(yīng)用于智能手機(jī)、網(wǎng)絡(luò)存儲(chǔ)設(shè)備、骨干網(wǎng)路由器等電子設(shè)備。
PXA27x系列處理器是英特爾當(dāng)前最新推出的嵌入式處理器。它的時(shí)鐘頻率從312到624MHz不等,并內(nèi)建64MB的堆棧型Intel StrataFlash內(nèi)存。內(nèi)置了英特爾的無線MMX技術(shù),能夠顯著提升多媒體性能。
OURS-PXA270-EP是一款基于INTEL XSCALE PXA270處理器,針對高效
嵌入式系統(tǒng)教學(xué)和實(shí)驗(yàn)科研的平臺(tái)。這款設(shè)備主要包括核心板與底版兩個(gè)部分,核心板主要集成了高速的PXA270 CPU,配套的存儲(chǔ)器,網(wǎng)卡等設(shè)備;底版主要是各種類型的接口與擴(kuò)展口。
核心板(8層PCB電路)系統(tǒng)包括:
CPU: INTEL PXA270(520M),支持GDB調(diào)試; SDRAM: 64M 工作在104M外頻上; FLASH: 32M INTEL Nor FLASH;Net: 10/100M Ethernet controller(LAN91C111);SUPERIO: WINBOND 83977;CPLD: XILINX 95144(117USER IO);總線驅(qū)動(dòng)器: 若干;核心板正面如圖2.2所示,核心板背面如圖2.3所示。
SDRAMCPUdrvdrvCPLDdrvFLASHdrvdrvFLASHLDOdrv 圖2.2 核心板正面圖
SDRAMdrvEthernetdrvdrvdrv100PIN CONNECTORSuperIOLDO 圖2.3 核心板背面圖
底版(4層PCB電路)如圖2.4所示。包括: Ethernet: 10/100接口1個(gè)
UART: 6個(gè)(包括RS232,RS485,IRDA,全功能串口)USB1.1:2個(gè)(1個(gè)host 一個(gè)device)PS2:2個(gè)(KEYBOARD&MOUSE)標(biāo)準(zhǔn)并口:1個(gè) PCMCIA: 1個(gè) IDE:1個(gè) SD/MMC: 1個(gè) SMC:1個(gè) CAMERA:1個(gè) 96PIN功能擴(kuò)展口:2個(gè) 4X5 小鍵盤
CPU_JTAG CPLD_JTAG LED SHARP LQ080V3DG01 8寸真彩LCD
640X480 VGA 640X480 LED 8X8點(diǎn)陣
一組7段LED數(shù)碼管
4個(gè)
串口irda串口串口串口LCD接口LCD接口并口VGALED點(diǎn)陣音頻1音頻2音頻3PCMCIA 卡LED數(shù)碼管SMC 卡核心板SDPSPSUSBUSB485NET鍵盤 圖2.4 底版圖
2.4主要硬件電路說明
嵌入式設(shè)備除了以ARM芯片為主要控制單元,也有很多周邊電路和外圍設(shè)備,它們有的幫助ARM處理信號、有的負(fù)責(zé)存儲(chǔ)數(shù)據(jù)、有的進(jìn)行網(wǎng)絡(luò)連接、有的用來數(shù)據(jù)通信,這些周邊設(shè)備缺一不可,不能替代。
首先介紹CPU核心總線[4],總線是CPU和其他設(shè)備的橋梁。CPU是通過總線信號來控制SDRAM ,FLASH,網(wǎng)卡,SUPERIO等外部設(shè)備的,無論是低速還是高速,只要是與總線相關(guān)的芯片,都要和CPU總線信號有關(guān)。其次,研究嵌入式系統(tǒng)內(nèi)存——SDRAM。SDRAM是嵌入式系統(tǒng)的內(nèi)存,具有單位空間存儲(chǔ)容量大和價(jià)格便宜的優(yōu)點(diǎn),已廣泛應(yīng)用在各種嵌入式系統(tǒng)中。當(dāng)系統(tǒng)啟動(dòng)時(shí),CPU首先從復(fù)位地址0x0處讀取啟動(dòng)代碼,在完成系統(tǒng)的初始化后,程序代碼一般應(yīng)調(diào)入SDRAM中運(yùn)行,以提高系統(tǒng)的運(yùn)行速度。同時(shí),系統(tǒng)及用戶堆棧、運(yùn)行數(shù)據(jù)也都放在SDRAM中。SDRAM的存儲(chǔ)單元可以理解為一個(gè)電容,總是傾向于放電,為避免數(shù)據(jù)丟失,必須定時(shí)刷新(充電)。因此,要在系統(tǒng)中使用SDRAM,就要求微處理器具有刷新控制邏輯,或在系統(tǒng)中另外加入刷新控制邏輯電路。PXA270芯片在片內(nèi)具有獨(dú)立的SDRAM刷新控制邏輯,可方便地與SDRAM接口。除了SDRAM,F(xiàn)LASH也是一種存儲(chǔ)媒介。FLASH一般具有NOR型和NAND型。NAND型FLASH單元密度高,寫入和擦除速度非???,而且一般NAND型FLASH的存儲(chǔ)容量很大。NOR型FLASH的優(yōu)點(diǎn)是芯片內(nèi)執(zhí)行命令,這樣應(yīng)用程序可以直接在FLASH內(nèi)運(yùn)行,不用進(jìn)入內(nèi)存,使得它的傳輸效率很高。嵌入式設(shè)備最大的優(yōu)點(diǎn)就是網(wǎng)絡(luò)功能強(qiáng)大,它能像PC一樣方便地連接到互聯(lián)網(wǎng)上,這些功能都是網(wǎng)絡(luò)控制器的作用。也就是Ethernet Controller,本系統(tǒng)采用SMSC公司的單芯片的網(wǎng)絡(luò)控制器,LAN91C111。它可以工作在兩種速度下,10M以太網(wǎng)或者100M以太網(wǎng)。LAN91C111的工作流程是,驅(qū)動(dòng)程序?qū)⒁l(fā)送的數(shù)據(jù)包按指定格式寫入芯片并啟動(dòng)發(fā)送命令,LAN91C111會(huì)自動(dòng)把數(shù)據(jù)包轉(zhuǎn)換成物理幀格式在物理信道上傳輸;反之芯片收到物理信號后自動(dòng)將其還原成數(shù)據(jù),并按指定格式存放在芯片RAM中以便主機(jī)程序取用。就是LAN91C111完成數(shù)據(jù)包和電信號之間的相互轉(zhuǎn)換。最后,說明一下串口電路,在嵌入式視頻監(jiān)控系統(tǒng)中,串口起到了很重要地作用,嵌入式系統(tǒng)啟動(dòng)的信息都可以通過串口傳到PC上,極大地方便了系統(tǒng)的移植和軟件的調(diào)試。大多數(shù)情況下,嵌入式CPU的串口0會(huì)作為CPU的一個(gè)終端,為用戶與CPU交互提供基本的輸出輸入信息。當(dāng)CPU運(yùn)行BOOT代碼時(shí),通常只有這個(gè)終端 ;運(yùn)行LINUX內(nèi)核時(shí),如果有LCD顯示,串口0與LCD終端會(huì)同時(shí)有效。串口0終端的交互
方式是命令行的模式,在BOOT階段,支持簡單的BOOT命令。8
第3章嵌入式ARM系統(tǒng)軟件結(jié)構(gòu)
3.1Linux操作系統(tǒng)簡介
Linux是一個(gè)類似Unix的操作系統(tǒng),它起源于芬蘭一個(gè)名為LinusTorvaldS的業(yè)余愛好者,現(xiàn)已成為最流行的一款開放源代碼的操作系統(tǒng)。Linux從問世至今,短短時(shí)間內(nèi)已發(fā)展成為一個(gè)功能強(qiáng)大、設(shè)計(jì)完善的操作系統(tǒng)。Linux系統(tǒng)不僅能夠運(yùn)行于PC平臺(tái),還在嵌入式系統(tǒng)方面大放光芒。由于Linux的源碼開放,內(nèi)核精簡且性能強(qiáng)悍,不依賴于具體廠商,能廣泛適用于各種硬件設(shè)備,系統(tǒng)二次開發(fā)成本極低,因此在IT業(yè)界已經(jīng)達(dá)成共識,即采用嵌入式Linux作為嵌入式操作系統(tǒng)是大勢所趨[5]。
嵌入式Linux是目前嵌入式系統(tǒng)領(lǐng)域中發(fā)展勢頭非常迅猛的系統(tǒng)。嵌入式Linux是指對Linux經(jīng)過小型化裁剪后,能夠固化在容量只有幾百K字節(jié)或幾M字節(jié)的存儲(chǔ)器芯片或單片機(jī)中,應(yīng)用于特定嵌入式場合的專用操作系統(tǒng)。目前正在開發(fā)的嵌入式系統(tǒng)中,49%的項(xiàng)目選擇嵌入式Linux作為操作系統(tǒng)。嵌入式Linux現(xiàn)已成為嵌入式操作系統(tǒng)的理想選擇[6]。目前基于嵌入式Linux的應(yīng)用已經(jīng)遍布很多領(lǐng)域,比如移動(dòng)多媒體設(shè)備、手持設(shè)備、車載導(dǎo)航系統(tǒng)、機(jī)械控制等。嵌入式Linux分為兩種類型:在沒有使用MMU的平臺(tái)上(無內(nèi)存虛實(shí)地址轉(zhuǎn)換和映射)的一般為uCLinux;而在有MMU平臺(tái)上,則使用原本地嵌入式Linux版本。由于在目前的主流嵌入式ARM中大多不具有MMU,因此只用IM左右的內(nèi)核就能實(shí)現(xiàn)網(wǎng)絡(luò)功能和任務(wù)調(diào)度的Linux系統(tǒng)就可以適用于從高端服務(wù)器到嵌入式應(yīng)用的各級平臺(tái)。ARM技術(shù)和Linux成功地結(jié)合,應(yīng)用于數(shù)以千計(jì)的商業(yè)產(chǎn)品中。從便攜式消費(fèi)品、網(wǎng)絡(luò)和無線設(shè)備,到自動(dòng)化設(shè)備、醫(yī)療設(shè)備和存儲(chǔ)產(chǎn)品,這一應(yīng)用列表與日俱增。ARM和Linux的結(jié)合充分滿足了各類應(yīng)用對嵌入式平臺(tái)高性能、低功耗和低價(jià)格的要求,通過開發(fā)環(huán)境、開源社區(qū)和ARM的商業(yè)伙伴的優(yōu)勢為嵌入式開發(fā)提供了更靈活的選擇。
本次設(shè)計(jì)的開發(fā)環(huán)境為redhat9.0系統(tǒng),在Windows XP 下安裝虛擬機(jī),在虛擬機(jī)中安裝Linux系統(tǒng),這樣可以屏蔽底層差別,避免硬件驅(qū)動(dòng)帶來的麻煩,而且還能方便的使用串口、并口、USB接口,快速的進(jìn)入實(shí)驗(yàn)環(huán)境。圖3.1為虛擬機(jī)下Linux系統(tǒng)啟動(dòng)后的情況。
圖3.1 虛擬機(jī)下Linux操作系統(tǒng)
3.2交叉編譯環(huán)境的建立
通常嵌入式系統(tǒng)的軟件編譯和執(zhí)行是在兩個(gè)不同平臺(tái)上進(jìn)行的。編譯是在宿主機(jī),一般為裝有Linux的pc;執(zhí)行是在目標(biāo)機(jī),即嵌入式系統(tǒng)的硬件平臺(tái)。一般是在宿主機(jī)上通過跨平臺(tái)交叉編譯器把源文件編譯成目標(biāo)平臺(tái)上可執(zhí)行的文件,再通過串口、并口或者網(wǎng)絡(luò)下載至目標(biāo)平臺(tái)上的FLASH或者其它存儲(chǔ)介質(zhì),然后由目標(biāo)機(jī)來運(yùn)行這些軟件。這里所說的跨平臺(tái)編譯器和一般的編譯器功能類似,都是把源代碼通過編譯器編譯成目標(biāo)文件,然后通過鏈接器、可重定位器程序和定位器把目標(biāo)文件重新定位成可執(zhí)行文件。和通用的編譯器之間最大的差別就在于跨平臺(tái)編譯器編譯出來的可執(zhí)行程序通常只能在特定CPU所屬平臺(tái)上運(yùn)行。所以一般來說每種CPU都對應(yīng)有不同的跨平臺(tái)編譯器。
本系統(tǒng)采用基于XScale的PXA270,可以使用常用的ARM-LINUX-GCC交叉編譯器。要成功構(gòu)建完整的交叉編譯環(huán)境需要在宿主機(jī)上創(chuàng)建一系列的工具包括C/C++編譯器、匯編器、鏈接器、嵌入式系統(tǒng)的標(biāo)準(zhǔn)C庫和GDB代碼級調(diào)試器。成功建立好開發(fā)環(huán)境后便可以運(yùn)用這些工具進(jìn)行嵌入式系統(tǒng)開發(fā)[7]。
3.3嵌入式Linux操作系統(tǒng)移植 3.3.1BootLorder移植
BootLoader是系統(tǒng)加電后運(yùn)行的第一段代碼。一般只是在啟動(dòng)時(shí)運(yùn)行很短的時(shí)間,然而對一個(gè)嵌入式系統(tǒng)來說,這一部分卻是整個(gè)系統(tǒng)的一個(gè)無比重要的組成部分,不可缺少。在一般嵌入式系統(tǒng)中,系統(tǒng)復(fù)位或者加電后通常從地址0x00000000處開始執(zhí)行,而這個(gè)地址一般正是存放的BootLoader啟動(dòng)代碼。通過這段程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終加載操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。
BootLoader一般情況下需要包含以下幾個(gè)必備的功能 :(l)初始化處理器。這個(gè)動(dòng)作都是用匯編語言完成的,稱為重置碼(resetcode)或者稱為bootcode,而且對于每個(gè)CPU都不一樣的,當(dāng)電源接通后就會(huì)執(zhí)行這個(gè)動(dòng)作,通常只有兩三個(gè)匯編指令,目的是將CPU的控制權(quán)轉(zhuǎn)給硬件初始化的程序。
(2)初始化一些必要的硬件。這個(gè)動(dòng)作也大都由匯編語言來完成,主要是初始化CPU、SDRAM等,其他的硬件,例如串口,可以由c語言等比較高級的程序語言來完成后續(xù)動(dòng)作。
(3)設(shè)置處理器的寄存器以及內(nèi)存,關(guān)掉所有的輸入管腳(包括中斷管腳),以防止突然有信號進(jìn)入妨礙接下來的硬件初始化動(dòng)作。然后初始化串口,以便后續(xù)運(yùn)行的程序能夠同HOST端進(jìn)行通信,便于調(diào)試。
(4)從特定的位置把操作系統(tǒng)和文件系統(tǒng)調(diào)入內(nèi)存,并設(shè)置一些操作系統(tǒng)所必需的參數(shù),然后把CPU控制權(quán)交給操作系統(tǒng)。有的BootLoader會(huì)先從串口或者網(wǎng)絡(luò)等其他途徑得到內(nèi)核的映像文件,然后把這些文件寫入目標(biāo)系統(tǒng)的FLASH或者其它存儲(chǔ)介質(zhì),最后再把內(nèi)核載入RAM執(zhí)行,交出控制權(quán)。
一般BootLoader都包含兩種不同的操作模式:“啟動(dòng)加載”模式和“下載”模式,這種區(qū)別僅對于開發(fā)人員才有意義。從最終用戶的角度看,BootLoader的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動(dòng)加載模式與下載模式的區(qū)別。
(l)啟動(dòng)加載(Bootloading)模式:這種模式也稱為“自主”(Autonomous)模式,即BootLoader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個(gè)過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時(shí)候,BootLoader顯然必須工作在這種模式下。
(2)下載(Downloading)模式:在這種模式下,目標(biāo)機(jī)上的BootLoader將通過串
口連接或者網(wǎng)絡(luò)連接等通信手段從主機(jī)(HOST)下載文件,比如下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常首先被BootL0ader保存到目標(biāo)機(jī)的RAM中,然后再被BootLoader寫到目標(biāo)機(jī)上的FLASH類固態(tài)存儲(chǔ)設(shè)備中。BootLoader的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時(shí)被使用,此外,以后的系統(tǒng)更新也會(huì)使用BootLoader的這種工作模式。工作于這種模式下的BootLoader通常都會(huì)向它的終端用戶提供一個(gè)簡單的命令行接口。
BootLoader的實(shí)現(xiàn)依賴于CPU的體系結(jié)構(gòu),一般來說啟動(dòng)過程分為兩個(gè)階段。
第一階段依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在第一階段中,而且通常都用匯編語言來實(shí)現(xiàn),運(yùn)行效率比較高。這個(gè)階段完成的任務(wù)一般如下:(l)硬件設(shè)備初始化(屏蔽所有的中斷、關(guān)閉處理器內(nèi)部的指令/數(shù)據(jù)cache);(2)為第二階段準(zhǔn)備RA.M空間;(3)復(fù)制BootLoader的第二階段代碼到RAM空間中;(4)設(shè)置好堆棧并跳轉(zhuǎn)到第二階段的C程序入口點(diǎn)。
第二階段則通常用C語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)復(fù)雜的功能,而且代碼會(huì)具有更好的可讀性和可移植性。這個(gè)階段主要任務(wù)有:(l)初始化本階段要使用的硬件設(shè)備;(2)檢測系統(tǒng)內(nèi)存映射;(3)將內(nèi)核映像和根文件系統(tǒng)從FLASH讀到RAM中;(4)為內(nèi)核設(shè)置啟動(dòng)參數(shù);(5)調(diào)用內(nèi)核文件運(yùn)行。
本設(shè)計(jì)中的Bootloader采用Blob,Blob是Boot Loader Object的縮寫,是一款功能強(qiáng)大的Bootloader。Blob最初是由Jan-Derk Bakker和Erik Mouw兩人為一塊名為LART(Linux Advanced Radio Terminal)的開發(fā)板寫的,該板使用的處理器是StrongARM SA-1100,現(xiàn)在Blob已經(jīng)被成功移植到許多基于ARM的CPU上了。本設(shè)計(jì)中的Intel Xcale就是采用Blob作為Bootloader[8]。
3.3.2Linux 內(nèi)核移植
選用嵌入式Linux作為目標(biāo)機(jī)操作系統(tǒng),一方面由于Linux是一款免費(fèi)的操作系統(tǒng),能很好的降低成本,同時(shí)Linux的開發(fā)應(yīng)用現(xiàn)在已經(jīng)成為熱門,有大量的資源可用于學(xué)習(xí)與重復(fù)應(yīng)用,并且Linux系統(tǒng)具有良好的可移植性和可裁剪性,能自動(dòng)支持多任務(wù)管理。一般常用的GUI如QT/E,MiniGUI等都支持Linux。
Linux的開發(fā)工具也都可以很方便的免費(fèi)獲得。
系統(tǒng)采用的嵌入式Linux內(nèi)核為隨實(shí)驗(yàn)平臺(tái)光盤中的Linux內(nèi)核,它是針對這套實(shí)驗(yàn)平臺(tái)所配置的Linux內(nèi)核,內(nèi)核版本為Linux2.4.20[9]。在實(shí)驗(yàn)過程中,只需要在這個(gè)內(nèi)核的基礎(chǔ)上進(jìn)行添加和刪減所需要和不需要的功能,編譯后就可以使用了。
在編譯內(nèi)核之前,需要對內(nèi)核進(jìn)行必要的配置,通過虛擬機(jī)進(jìn)入/pxa270_linux/linux/目錄后在終端執(zhí)行make menuconfig[10]命令,就可以可視化的配置內(nèi)核需要的功能和要求,本次試驗(yàn),主要是針對視頻方面,選擇了對V4L的靜態(tài)加載、對spca5xx攝像頭驅(qū)動(dòng)的動(dòng)態(tài)加載,這樣就結(jié)束了對內(nèi)核的配置。編譯內(nèi)核需要?jiǎng)?chuàng)建內(nèi)核依賴關(guān)系、創(chuàng)建內(nèi)核鏡像文件和創(chuàng)建內(nèi)核模塊。首先執(zhí)行makedep命令,讀取配置過程生成的配置文件,來創(chuàng)建對應(yīng)于配置的依賴關(guān)系樹,從而決定哪些需要編譯而哪些不需要;接著需要makeclean刪除前面步驟留下的文件,以避免出現(xiàn)一些錯(cuò)誤;然后便可以生成所需要的內(nèi)核文件了,用make zlmage來實(shí)現(xiàn)得到可移植的內(nèi)核。內(nèi)核文件通過并口下載線燒寫入開發(fā)板中,便可以通過BootLoader加載運(yùn)行。
3.3.3嵌入式文件系統(tǒng)
嵌入式Linux操作系統(tǒng)一般采用FLASH作為存儲(chǔ)介質(zhì)。FLASH具有獨(dú)特的物理特性,所以必須使用專門的嵌入式文件系統(tǒng)。嵌入式系統(tǒng)對文件的操作是通過層次結(jié)構(gòu)實(shí)現(xiàn)的。對于用戶程序來說,文件是有結(jié)構(gòu)的文件,用戶程序通過對文件IO函數(shù)操作文件。嵌入式文件系統(tǒng)是嵌入式操作系統(tǒng)的一部分,它的任務(wù)是對邏輯文件進(jìn)行管理,其工作包括提供對邏輯文件的操作(復(fù)制、刪除、修改等)接口,方便用戶操作文件和目錄。在文件系統(tǒng)內(nèi)部,根據(jù)存儲(chǔ)設(shè)備的特點(diǎn),使用不同的文件組織模式來實(shí)現(xiàn)文件的邏輯結(jié)構(gòu)。此外,文件系統(tǒng)要對管理文件的安全性負(fù)責(zé)。文件系統(tǒng)不能直接控制物理設(shè)備,它是通過FLASH驅(qū)動(dòng)實(shí)現(xiàn)控制的[11]。
目前FLASH支持的文件系統(tǒng)技術(shù)主要有JFFS2,YAFFS2,TrueFFS,F(xiàn)TL/NTFL,RAMFS,CRAMFS和ROMFS等等。本系統(tǒng)采用的是JFFS2文件系統(tǒng)。
JFFS2文件系統(tǒng)是專門為NAND閃存設(shè)計(jì)的嵌入式文件系統(tǒng),根據(jù)NAND閃存以頁面為單位存取的特點(diǎn),將文件組織成固定大小的數(shù)據(jù)段。利用NAND閃存提供的每個(gè)頁面16B的備用空間來存放ECC(ErrorCorrectionCode)和文件系統(tǒng)的組織信息、,不僅能夠?qū)崿F(xiàn)錯(cuò)誤檢測和壞塊處理,也能夠提高文件系統(tǒng)的加
載速度。JFFS2采用一種多策略混合的垃圾回收算法,結(jié)合了貪心策略的高效性和隨機(jī)選擇的平均性,達(dá)到了兼顧損耗平均和系統(tǒng)開銷的目的。它是日志結(jié)構(gòu)的文件系統(tǒng),提供了損耗平衡和掉電保護(hù),可以有效地避免意外掉電對文件系統(tǒng)一致性和完整性的影響。JFFS2文件系統(tǒng)是按層次結(jié)構(gòu)設(shè)計(jì)的,分為文件系統(tǒng)管理層接口、JFFS2內(nèi)部實(shí)現(xiàn)層和NAND接口層,這樣就簡化了其與系統(tǒng)的接口設(shè)計(jì),可以方便地集成到系統(tǒng)中去。與YAFFS相比,它增加了一些功能,因此功能更強(qiáng)。
3.4Linux下的程序調(diào)試
調(diào)試是程序開發(fā)過程中必不可少的一個(gè)重要環(huán)節(jié),通用PC機(jī)的程序調(diào)試與嵌入式操作系統(tǒng)的調(diào)試環(huán)境上有著明顯的區(qū)別,前者調(diào)試器和被調(diào)試的程序往往是運(yùn)行在同一臺(tái)機(jī)器上,是相同操作系統(tǒng)下的兩個(gè)不同的進(jìn)程,調(diào)試器通過操作系統(tǒng)專用調(diào)用接口控制被調(diào)試進(jìn)程,后者通常為遠(yuǎn)程調(diào)試,調(diào)試器一般運(yùn)行于桌面操作系統(tǒng)上,而被調(diào)試的程序則運(yùn)行在嵌入式系統(tǒng)之上,因此需要協(xié)調(diào)這兩個(gè)程序之間的通信。Linux下的調(diào)試工具非常的少,gdb是Linux下最著名的調(diào)試工具,它是GNUC自帶的調(diào)試工具,它可以使開發(fā)人員了解程序運(yùn)行的詳細(xì)細(xì)節(jié),從而消除程序的錯(cuò)誤,達(dá)到調(diào)試的目的,gdb還具有遠(yuǎn)程調(diào)試功能,可以滿足嵌入式系統(tǒng)調(diào)試的要求,在調(diào)試過程中PC機(jī)也稱為宿主機(jī)和嵌入式系統(tǒng)通過串口協(xié)議或者TCP/IP協(xié)議連接起來,遠(yuǎn)程主機(jī)上運(yùn)行被gdb規(guī)范斷點(diǎn)改造過的內(nèi)核,當(dāng)條件成立時(shí),斷點(diǎn)被激活,然后等待本地宿主機(jī)的連接命令,一旦連接成功,宿主機(jī)就可以向遠(yuǎn)程嵌入式系統(tǒng)發(fā)送調(diào)試命令了。在調(diào)試過程中g(shù)db通過調(diào)試stub來完成通信功能,調(diào)試stub是嵌入式操作系統(tǒng)中的一小段代碼,它提供了運(yùn)行g(shù)db的宿主機(jī)和嵌入式系統(tǒng)進(jìn)程之間交互的一個(gè)媒介。
除了使用調(diào)試器外還可以直接在程序中使用printf()或printk打印函數(shù),這種方法功能比較弱,效率低下,但在內(nèi)核模塊調(diào)試時(shí)這是唯一的方法。14
第4章USB設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)
4.1設(shè)備驅(qū)動(dòng)程序簡介
Linux系統(tǒng)中,設(shè)備驅(qū)動(dòng)程序扮演著特殊的角色。它就像一個(gè)獨(dú)立的黑盒子一樣,使某個(gè)特定的硬件可以相應(yīng)一個(gè)定義良好的內(nèi)部編程接口并且完成隱藏設(shè)備的作用。用戶只需調(diào)用一組標(biāo)準(zhǔn)化的函數(shù)完成操作,而且這些操作與特定的驅(qū)動(dòng)程序無關(guān)。驅(qū)動(dòng)程序的任務(wù)就是將這些函數(shù)映射到作用硬件的具體操作上。這樣的模塊化的驅(qū)動(dòng)程序結(jié)構(gòu)使得Linux系統(tǒng)中的驅(qū)動(dòng)程序可以獨(dú)立于內(nèi)核的其他部分,可以在需要使用的時(shí)候?qū)Ⅱ?qū)動(dòng)“插入”內(nèi)核。
從系統(tǒng)運(yùn)行順序來看,硬件平臺(tái)啟動(dòng)運(yùn)行Linux后,啟用了MMU單元即內(nèi)存管理單元,在這種模式下系統(tǒng)不能直接對物理地址進(jìn)行訪問。若要對某一硬件外設(shè)進(jìn)行讀寫,需要通過內(nèi)核調(diào)用該硬件的驅(qū)動(dòng)來實(shí)現(xiàn)。
上面已經(jīng)說過,驅(qū)動(dòng)程序的作用在于向應(yīng)用程序提供訪問硬件設(shè)備的接口,驅(qū)動(dòng)程序屏蔽了硬件實(shí)現(xiàn)上的細(xì)節(jié)操作,于是應(yīng)用程序可以像操作普通文件一樣對硬件設(shè)備進(jìn)行操作。Linux以模塊的形式加載設(shè)備類型,通常是一個(gè)模塊對應(yīng)實(shí)現(xiàn)一個(gè)設(shè)備驅(qū)動(dòng)。模塊是內(nèi)核的一部分,它們沒有被編譯到內(nèi)核中,而是分別被編譯并鏈接成一組目標(biāo)文件。可以根據(jù)用戶的需要在不需要對內(nèi)核進(jìn)行重新編譯的情況下動(dòng)態(tài)載入正在運(yùn)行的內(nèi)核,或從正在運(yùn)行的內(nèi)核中卸載。利用這種機(jī)制,內(nèi)核尺寸可以保持在最小,并具有最大的靈活性,也便于檢驗(yàn)新的內(nèi)核代碼,而不需要重新編譯內(nèi)核并重新引導(dǎo)。設(shè)備驅(qū)動(dòng)程序一般需要完成以下功能:(l)對設(shè)備初始化和釋放;(2)把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);(3)讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序的請求數(shù)據(jù);(4)檢測和處理設(shè)備出現(xiàn)的錯(cuò)誤。
在Linux操作系統(tǒng)下有兩類主要設(shè)備文件類型:塊設(shè)備、字符設(shè)備。用戶進(jìn)程正是通過設(shè)備文件來與硬件打交道。每個(gè)設(shè)備文件都有其文件屬性,表示是字符設(shè)備還是塊設(shè)備。另外每個(gè)文件都有2個(gè)設(shè)備號,第一個(gè)是主設(shè)備號,標(biāo)識驅(qū)動(dòng)程序;第二個(gè)是從設(shè)備號,標(biāo)識使用同一個(gè)設(shè)備驅(qū)動(dòng)程序的不同硬件設(shè)備。設(shè)備文件的主設(shè)備號必須與設(shè)備驅(qū)動(dòng)程序在登記時(shí)申請的設(shè)備號一致,否則用戶進(jìn)程將無法訪問驅(qū)動(dòng)程序。
Linux驅(qū)動(dòng)程序可以分為三個(gè)主要部分: 15
(l)自動(dòng)配置和初始化子程序,負(fù)責(zé)檢測所要驅(qū)動(dòng)的硬件設(shè)備是否存在和能否正常工作。如果該設(shè)備正常,則對這個(gè)設(shè)備及其他必需的條件位口中斷、DMA通道)進(jìn)行申一請并初始化。這部分驅(qū)動(dòng)程序僅在初始化時(shí)被調(diào)用一次。
(2)服務(wù)于I/O請求的子程序,又稱為驅(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)程,只是由用戶態(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ū)動(dòng)程序的下半部分。在Linux操作系統(tǒng)中,并不是直接從中斷向量表中調(diào)用設(shè)備驅(qū)動(dòng)程序的中斷服務(wù)子程序,而是由Linux系統(tǒng)來接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務(wù)子程序。中斷可以在任何一個(gè)進(jìn)程運(yùn)行時(shí)產(chǎn)生,因而在中斷服務(wù)子程序被調(diào)用時(shí),不能依賴于任何進(jìn)程的狀態(tài),也就不能調(diào)用任何與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。因?yàn)樵O(shè)備驅(qū)動(dòng)程序一般支持同一類型的若干設(shè)備,所以一般在系統(tǒng)調(diào)用中斷服務(wù)子程序時(shí),都帶有一個(gè)或多個(gè)參數(shù),以唯一標(biāo)識請求服務(wù)的設(shè)備。
在系統(tǒng)內(nèi)部,I/O設(shè)備的存取通過設(shè)備驅(qū)動(dòng)程序提供的一組固定的入口點(diǎn)來進(jìn)行,這組入口點(diǎn)在驅(qū)動(dòng)程序初始化時(shí)向系統(tǒng)進(jìn)行登記,以便在系統(tǒng)適當(dāng)?shù)臅r(shí)候調(diào)用。一般來說,字符型設(shè)備驅(qū)動(dòng)程序能夠提供如下幾個(gè)入口點(diǎn):(1)open入口點(diǎn):打開設(shè)備準(zhǔn)備I/O操作,對字符特別設(shè)備進(jìn)行打開操作,都會(huì)調(diào)用設(shè)備的open入口點(diǎn)。open子程序必須對將要進(jìn)行的I/O操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。如果設(shè)備是獨(dú)占的,即同一時(shí)刻只能有一個(gè)程序訪問此設(shè)備,則open子程序必須設(shè)置一些標(biāo)志以表示設(shè)備的狀態(tài)。
(2)close入口點(diǎn):關(guān)閉一個(gè)設(shè)備,當(dāng)最后一次使用設(shè)備結(jié)束后,調(diào)用dose子程序。獨(dú)占設(shè)備必須標(biāo)記設(shè)備可再次使用。
(3)read入口點(diǎn):讀取設(shè)備,對于有緩沖區(qū)的I/0操作,一般從緩沖區(qū)里讀取設(shè)備數(shù)據(jù)。
(4)write入口點(diǎn):向設(shè)備寫數(shù)據(jù),對于有緩沖區(qū)的I/O操作,一般向緩沖區(qū)里寫入數(shù)據(jù)。
(5)ioctl入口點(diǎn):執(zhí)行讀寫之外的操作。
USB(Universal Serial Bus)即“通用串行外部總線”,用途廣泛,可以外接硬盤、鍵盤、鼠標(biāo)、打印機(jī)等多種設(shè)備,USB能夠使用盡可能少的接口支持盡可能多的外設(shè),尤為適合在嵌入式設(shè)備中使用,是嵌入式接口標(biāo)準(zhǔn)的一個(gè)很好的選擇。
USB總線規(guī)范有1.1版和2.0版。USB1.1支持兩種傳輸速率:低速1.5Mbit/s、全速12Mbit/s,這樣的速率完全滿足鼠標(biāo)、鍵盤、CD-ROM等設(shè)備,但是在嵌入式視頻監(jiān)控系統(tǒng)中,這樣的速度還是很慢。所以,USB2.0提供了一種更好的傳輸速率:高速,它可以達(dá)到480Mbit/s。USB2.0向下兼容USB1.1,可以將遵循USB1.1規(guī)范的設(shè)備連接到USB2.0控制器上,也可以把USB2.0的設(shè)備鏈接到USB1.1控制器上。
USB總線的硬件拓?fù)浣Y(jié)構(gòu)[12]如圖4.1所示。
USB主機(jī)控制器USB設(shè)備根集線器USB設(shè)備USB設(shè)備集線器USB設(shè)備集線器USB設(shè)備集線器USB設(shè)備USB設(shè)備USB設(shè)備USB設(shè)備 圖4.1 USB總線硬件拓?fù)鋱D
USB主機(jī)控制器通過根集線器與其他USB設(shè)備相連。集線器也屬于USB設(shè)備,通過它可以在一個(gè)USB接口上擴(kuò)展出多個(gè)接口。除根集線器外,最多可以層疊5個(gè)集線器,每條USB電纜的最大長度是5m,所以USB總線的最大距離為30m。一條USB總線上可以外接127個(gè)設(shè)備,包括根集線器和其他集線器。整個(gè)結(jié)構(gòu)圖是一個(gè)星狀結(jié)構(gòu),一條USB總線上所有設(shè)備共享一條通往主機(jī)的數(shù)據(jù)通道,同一時(shí)刻只能有一個(gè)設(shè)備與主機(jī)通信。
通過USB主機(jī)控制器來管理外接的USB設(shè)備,USB主機(jī)控制器共分3種:UHCI、OHCI和EHCI。在配置Linux內(nèi)核的時(shí)候,看到的“HCD”字樣表示“Host Controller Drivers”,即主機(jī)控制器驅(qū)動(dòng)程序。
USB驅(qū)動(dòng)程序分為兩類:USB主機(jī)控制器驅(qū)動(dòng)程序(Host Controller Drivers)、USB設(shè)備驅(qū)動(dòng)程序(USB device drivers)。它們在內(nèi)核中的層次如圖4.2所示。
UserUSB Device DriversUSB Host Controller DriversHardware 圖4.2 USB驅(qū)動(dòng)程序?qū)哟谓Y(jié)構(gòu)
在試驗(yàn)中,教學(xué)平臺(tái)上的Linux嵌入式內(nèi)核已經(jīng)配置了USB主機(jī)控制器驅(qū)動(dòng)程序,只需要添加需要的USB設(shè)備驅(qū)動(dòng)程序,就能實(shí)現(xiàn)USB設(shè)備的正常使用。
4.2Linux下驅(qū)動(dòng)程序的實(shí)現(xiàn)
Linux操作系統(tǒng)下對硬件設(shè)備進(jìn)行驅(qū)動(dòng)開發(fā)的一般步驟如下:(l)注冊設(shè)備
在系統(tǒng)啟動(dòng)時(shí)或者在模塊加載的時(shí)候需要將設(shè)備和重要的數(shù)據(jù)結(jié)構(gòu)登記到內(nèi)核的設(shè)備數(shù)組中,并確定該設(shè)備的主次設(shè)備號。在Linux系統(tǒng)中,對于字符設(shè)備一般通過調(diào)用register_chrdev向系統(tǒng)注冊設(shè)備驅(qū)動(dòng)程序,register_chrdev在fs/deviees.c文件中的定義如下:int register_chrdev(unsigned int major,const char*name,struct file_operations fops)定義中的major是設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請的主設(shè)備號,如果major為O,則系統(tǒng)為該驅(qū)動(dòng)程序動(dòng)態(tài)的分配一個(gè)主設(shè)備號,不過此設(shè)備號是臨時(shí)的;name是設(shè)備名:fops是各個(gè)調(diào)用入口點(diǎn)的說明。函數(shù)返回O表示注冊成功,返回-INVAL表示申請的主設(shè)備號非法,返回-EBUSY表示申請的主設(shè)備號正在被其它設(shè)備驅(qū)動(dòng)程序使用。
以后對設(shè)備驅(qū)動(dòng)程序的file_operations的操作都可以通過該主設(shè)備號的索引來完成。register_chrdev函數(shù)操作成功后,設(shè)備名便出現(xiàn)在/proc/devices文件目錄中,使用命令cat/proc/devices可以查看設(shè)備的工作狀態(tài)。
(2)定義操作集
驅(qū)動(dòng)程序中要通過一系列函數(shù)完成對設(shè)備的不同操作,這些操作在面向?qū)ο缶幊绦g(shù)語中也稱為方法,該操作集通過數(shù)據(jù)結(jié)構(gòu)file_operations實(shí)現(xiàn)。內(nèi)核內(nèi)部通過file結(jié)構(gòu)識別設(shè)備,通過file_operations數(shù)據(jù)結(jié)構(gòu)提供的文件系統(tǒng)的入口點(diǎn)函數(shù)訪問設(shè)備。
file_operations定義在
int(*release)(struct inode*, struct file*);int(*fsync)(struct file*, struct dentry*, int datasync);int(*fsyne)(int, struct file*, int);int(*lock)(struct file*,int, struct file_lock*);ssize_t(*readv)(struct file*, const struct iovec*, unsigned long, loff_t*);ssize_t(*writev)(struct file*, const struct iovec*, unsigned long, loff_t*);ssize_t(*sendpage)(struct file*, struct page*, int, size_t, loff_t*, int);unsigned long(*get_unmapped_area)(struct file*, unsigned long, unsigned long,unsigned long, unsigned long);}
這個(gè)結(jié)構(gòu)的每一個(gè)成員的名字對應(yīng)一個(gè)系統(tǒng)調(diào)用,在用戶程序利用系統(tǒng)調(diào)用對設(shè)備文件進(jìn)行諸如讀/寫操作時(shí),系統(tǒng)調(diào)用會(huì)通過設(shè)備文件的主設(shè)備號找到相應(yīng)的驅(qū)動(dòng)程序,然后讀取這個(gè)數(shù)據(jù)結(jié)構(gòu)的相應(yīng)函數(shù)指針,把控制權(quán)交給該函數(shù)。對于具體的設(shè)備驅(qū)動(dòng)并不需要實(shí)現(xiàn)結(jié)構(gòu)中所有的例程,只要完成設(shè)備功能就可以了。例如對于一個(gè)常見的字符設(shè)備驅(qū)動(dòng)來說,可能只有操作open(),write(),read(),ioctl()和close(),當(dāng)用戶程序通過系統(tǒng)調(diào)用訪問設(shè)備時(shí),最終要通過這些操作集來完成。
(3)卸載模塊
當(dāng)不再需要使用一個(gè)模塊或設(shè)備時(shí),需要將其從內(nèi)核中卸載下來,這時(shí)會(huì)動(dòng)態(tài)調(diào)用模塊中的module_exit()函數(shù),并需要在該函數(shù)中調(diào)用modul_unregister_chrdev()或module_unregister_blkdev()釋放掛入內(nèi)核的數(shù)據(jù)結(jié)構(gòu)同時(shí)釋放該設(shè)備號。
4.3USB攝像頭驅(qū)動(dòng)程序設(shè)計(jì)
攝像頭屬于視頻設(shè)備,在Linux內(nèi)核中,VideoforLinux(簡稱V4L)是關(guān)于視頻設(shè)備的驅(qū)動(dòng)標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)為應(yīng)用程序定義了一系列的接口函數(shù),內(nèi)核、驅(qū)動(dòng)和應(yīng)用程序都是依靠這個(gè)標(biāo)準(zhǔn)來進(jìn)行交流。本系統(tǒng)所使用的USB攝像頭正是基于該標(biāo)準(zhǔn)來編寫驅(qū)動(dòng)和應(yīng)用程序的。
Linux內(nèi)核是依據(jù)設(shè)備號來操作設(shè)備文件的,在內(nèi)核中,攝像頭對應(yīng)的設(shè)備文件名為/dev/video0,主設(shè)備號是81,次設(shè)備號根據(jù)攝像頭數(shù)目來確定,本系統(tǒng)中僅使用一個(gè)攝像頭,所以可以通過mknod/dev/video0 c 81 0來創(chuàng)建節(jié)點(diǎn)。USB攝像頭驅(qū)動(dòng)程序?qū)崿F(xiàn)原理如圖4.3所示。
USB攝像頭的驅(qū)動(dòng)和通用設(shè)備的驅(qū)動(dòng)準(zhǔn)則一樣,但需要與內(nèi)核提供的視頻驅(qū)動(dòng)掛鉤。即首先在驅(qū)動(dòng)中聲明一個(gè) video_device結(jié)構(gòu),并為其指定文件操作函數(shù)指針數(shù)組fops,向系統(tǒng)注冊。在應(yīng)用程序發(fā)出文件操作的相關(guān)命令時(shí),核心根據(jù)這些指針調(diào)用相應(yīng)函數(shù),并將該結(jié)構(gòu)作為參數(shù)傳遞給它們。這樣,就完成了驅(qū)動(dòng)和核心之間的通信。
例如: Static struct video_devie vdev_template={……};
聲明 video_deviee,指出掛接驅(qū)動(dòng)
用戶進(jìn)程系統(tǒng)調(diào)用攝像頭驅(qū)動(dòng)文件操作接口接收緩沖區(qū)發(fā)送緩沖區(qū)中斷服務(wù)程序攝像頭 圖4.3 攝像頭驅(qū)動(dòng)實(shí)現(xiàn)框圖
Static Struct file_operation spcasxx_fops= {……};
聲明本驅(qū)動(dòng)的文件操作函數(shù)指針 Struct video_device*vdev=video_devdata(file);從文件指針中提取出 video_deviee結(jié)構(gòu)
在video_deviee結(jié)構(gòu)中,有一個(gè)私有指針priv,可以將它指向一塊保留內(nèi)存。在這塊內(nèi)存中,保存著本驅(qū)動(dòng)、本設(shè)備的相關(guān)初始化信息。這塊內(nèi)存的申請、初始化、指針指向等工作都是在USB驅(qū)動(dòng)的枚舉函數(shù)probe中完成。這樣,在枚舉函數(shù)將控制權(quán)返還給系統(tǒng)后,因?yàn)閮?nèi)核不銷毀保留內(nèi)存,所以驅(qū)動(dòng)仍然保留著自己的信息。在驅(qū)動(dòng)卸載函數(shù)中需要將申請的各塊內(nèi)存全部釋放。
Linux系統(tǒng)中任何USB傳輸都通過URB實(shí)現(xiàn)。為提高速度,可以考慮擴(kuò)大URB的緩沖,這樣可以降低每個(gè)USB事務(wù)中握手信息所占比例,提高有效數(shù)據(jù)的輸速度。但是受限于總線帶寬和具體的USB設(shè)備芯片,單純擴(kuò)大URB的緩沖不能無限制地解決問題。USB在操作系統(tǒng)中每次傳輸都要包括URB的建立、發(fā)出、回收、數(shù)據(jù)整理等階段,這些時(shí)間不產(chǎn)生有效數(shù)據(jù)。因此可以建立兩個(gè)URB,在等待一個(gè)URB被回收時(shí),也就是圖像正在被傳感器采集時(shí),處理、初始化另一個(gè)URB,并在回收后立刻將其發(fā)出。兩個(gè)URB交替使用,大大減少了額外時(shí)間。
由于嵌入式平臺(tái)上運(yùn)行的Linux2.4.20內(nèi)核,內(nèi)部已經(jīng)集成了對USB2.0的支持,所以無需移植相應(yīng)的USB驅(qū)動(dòng)。
在設(shè)計(jì)中,攝像頭芯片采用中星微的Z301系列芯片,Linux2.4內(nèi)核并不支持這種芯片,所以我們通過移植芯片驅(qū)動(dòng)程序來達(dá)到目的。芯片的驅(qū)動(dòng)程序是spca5**系列,如果不重新編譯內(nèi)核的話,將驅(qū)動(dòng)程序動(dòng)態(tài)加載就可以正常使用。設(shè)計(jì)中動(dòng)態(tài)加載的命令使用insmod命令,它和modprobe命令在使用上有所不同,modprobe在加載模塊時(shí)不用指定模塊文件的絕對路徑,也不用帶模塊文件的后綴.o或.ko;而insmod需要的是模塊的所在目錄的絕對路徑,并且一定要帶有模塊文件名后綴的.o或者.ko。但是在功能上,它們所達(dá)到的效果基本相同[13]。22
第5章視頻采集功能的設(shè)計(jì)
視頻采集程序是基于V4L開發(fā)的,包括攝像頭的初始化、打開/關(guān)閉、參數(shù)設(shè)置和數(shù)據(jù)讀取等操作,視頻采集程序流程圖如圖5.1所示[14]。
開始初始化攝像頭init_videoIn()打開攝像頭open_v4l()獲取攝像頭參數(shù)icotl(int->vd,int cmd,..)設(shè)置攝像頭參數(shù)ioctl()獲取一幀圖像N一幀是否截取完畢Y存儲(chǔ)并準(zhǔn)備傳輸N是否終止視頻采集Y關(guān)閉攝像頭終止 圖5.1 視頻采集程序流程圖
5.1基于V4L的編程 5.1.1攝像頭相關(guān)數(shù)據(jù)結(jié)構(gòu)
攝像頭的組成部分是傳感器、DSP、鏡頭、外殼、USB連線、電路板和周邊電路構(gòu)成,其中最重要的是傳感器和DSP(數(shù)字信號處理器)。本系統(tǒng)選用的攝像頭采用了CMOS傳感器和中星微301處理器。
V4L[15]提供了一系列的接口應(yīng)用程序,可以利用這些程序?qū)崿F(xiàn)對攝像頭的調(diào)用,其中有read、open、ioctl等。V4l同時(shí)將這些函數(shù)和參數(shù)封裝成一個(gè)數(shù)據(jù)結(jié)構(gòu)vdIn。struct vdIn {
int fd;char *videodevice;struct video_mmap vmmap;struct video_capability videocap;int mmapsize;struct video_mbuf videombuf;struct video_picture videopict;struct video_window videowin;struct video_channel videochan;struct video_param videoparam;
int cameratype;char *cameraname;char bridge[9];int sizenative;int sizeothers;int palette;int norme;int channel;int grabMethod;unsigned char *pFramebuffer;unsigned char *ptframe [4];
};int framelock [4];pthread_mutex_t grabmutex;int framesizeIn;volatile int frame_cour;int bppIn;int hdrwidth;int hdrheight;int formatIn;int signalquit;
int fd :打開攝像頭時(shí),open函數(shù)返回的文件描述符,其他函數(shù)使用這個(gè)描述符對攝像頭進(jìn)行操作。
struct video_mmap vmmap: 用于內(nèi)存映射的結(jié)構(gòu)體。
struct video_capability videocap :描述攝像頭基本信息,如設(shè)備名稱、支持的最大分辨率、信號源信息、信道數(shù)等。
struct video_mbuf videombuf :在進(jìn)行內(nèi)存映射時(shí)讀取幀的信息,實(shí)際上是輸入到攝像頭存儲(chǔ)緩存中的幀信息。
struct video_picture videopict :攝像頭采集圖像的屬性,如亮度、色調(diào)、對比度、色度、深度等。
struct video_window videowin :表示采集窗口參數(shù),如分辨率等。struct video_channal videochan :關(guān)于信號源的屬性。
5.1.2攝像頭基本功能實(shí)現(xiàn)
(1)初始化攝像頭參數(shù)
在對攝像頭進(jìn)行操作之前,要對攝像頭進(jìn)行初始化,即對vdIn這個(gè)結(jié)構(gòu)進(jìn)行初始化。使用init_videoIn 函數(shù)。
int init_videoIn(struct vdIn *vd, char *device, int width, int height, int format, int grabmethod){
int err =-1;int i;if(vd == NULL || device == NULL)return-1;
} if(width == 0 || height == 0)return-1;grabmethod = 1;//read by default;if(grab method < 0 || grabmethod > 1)// check format
vd->videodevice = NULL;vd->cameraname = NULL;vd->videodevice = NULL;vd->videodevice =(char *)realloc(vd->videodevice, 16);vd->cameraname =(char *)realloc(vd->cameraname, 32);snprintf(vd->videodevice, 12, “%s”, device);if(debug)printf(“video %s n”,vd->videodevice);memset(vd->cameraname, 0, sizeof(vd->cameraname));memset(vd->bridge, 0, sizeof(vd->bridge));vd->signalquit = 1;vd->hdrwidth = width;vd->hdrheight = height;vd->formatIn = format;
vd->bppIn = GetDepth(vd->formatIn);vd->grabMethod = grabmethod;vd->pFramebuffer = NULL;err = init_v4l(vd);for(i = 0;i < OUTFRMNUMB;i++){
} vd->frame_cour = 0;pthread_mutex_init(&vd->grabmutex, NULL);return err;vd->ptframe[i] = NULL;(unsigned char *)realloc(vd->ptframe[i], sizeof(struct frame_t)+(size_t)vd->framelock[i] = 0;vd->framesizeIn);
(2)打開攝像頭
在Linux中,類似攝像頭的設(shè)備是作為文件來看待的,叫做設(shè)備文件。我們可以使用open函數(shù)來對設(shè)備進(jìn)行打開操作,open帶有兩個(gè)參數(shù),第一個(gè)為設(shè)備文件名稱,本實(shí)驗(yàn)的攝像頭設(shè)備名稱是/dev/video0,第二個(gè)則是打開的類型。
在使用open函數(shù)打開攝像頭之前,要判斷是否有攝像頭設(shè)備,即檢查參數(shù)videodevice是否為空。Open函數(shù)執(zhí)行結(jié)束后會(huì)返回?cái)z像頭的文件描述符,如果返回值為-1,則說明打開設(shè)備出錯(cuò)。
int open_v4l(char *vd->videodevice){
if(!vd->videodevice){
printf(“No device file, ERROR opening V4L interface”);
return-1;}
if((vd->fd=open(vd->videodevice, O_RDWR))==-1){
printf(“ERROR opening V4L interface”);
return-1;} return vd->fd;}(3)獲取攝像頭參數(shù)
成功打開攝像頭后,需要獲取攝像頭的一些參數(shù),利用ioctl函數(shù)控制I/O通道來實(shí)現(xiàn)。Ioctl函數(shù)的使用是ioctl(int->fd, int cmd,……),fd代表文件描述符,cmd表示用戶對設(shè)備的控制命令,第三個(gè)參數(shù)是一個(gè)其他的參數(shù)。其中,cmd包括VIDIOCGCAP(獲得video_capbility中有關(guān)攝像頭的信息)、VIDIOCGPICT(獲取圖像信息)、VIDIOCSPICT(改變圖像信息)、VIDIOCGMBUF(獲取攝像頭存儲(chǔ)緩沖區(qū)幀信息)、VIDIOCAMCAPTURE(獲取視頻圖像)、VIDIOSYNC(判斷攝像頭是否截取成功)等。
讀取video_capability中有關(guān)攝像頭的信息
if(ioctl(vd->fd, VIDIOCGCAP, &(vd->videocap))==-1){ printf(“Fail to get video_capability!/n”);return-1;} 讀取video_picture中的圖像信息 printf(“Fail to get video_picture!/n”);return-1;} if(ioctl(vd->fd, VIDIOCGPICT, &(vd->videopict))==-1){
讀取video_window信息
if(ioctl(vd->fd,VIDIOCGWIN,&(vd->videowin))==-1){
printf(“Fail to get video_window!/n”);
return-1;}(4)設(shè)置攝像頭參數(shù)
在對攝像頭參數(shù)進(jìn)行設(shè)置的時(shí)候,應(yīng)該按照以下步驟:比如更改圖像信息,首先,先給video_picture結(jié)構(gòu)中所要修改的變量賦值,如vd->videopict.palette=vd->formaIn;vd->videopict.depth=GetDepth(vd->formatIn);然后通過ioctl函數(shù)的VIDIOCSPICT來設(shè)置,如if(ioctl(vd->fd,VIDIOCSPICT,&(vd->videopict))<0){ printf(Fail to set videopict params with VIDIOCSPICT!/n“);return-1;} 在設(shè)置好了之后可以通過VIDIOCGPICT命令來查詢圖像信息設(shè)置是否成功。(5)關(guān)閉攝像頭
在Linux編程過程中,必須養(yǎng)成一個(gè)好的編程習(xí)慣,就是在開啟一個(gè)設(shè)備后一定要關(guān)閉它,這樣可以避免很多諸如內(nèi)存泄露等嚴(yán)重的問題。
本系統(tǒng)支持兩種讀取方式來獲得視頻流,它們是內(nèi)存映射和直接讀取,所以首先需要判斷視頻采集的方式,如果是內(nèi)存映射,則在系統(tǒng)任務(wù)完成后關(guān)閉內(nèi)存映射,然后關(guān)閉攝像頭設(shè)備。同樣道理,如果采用的是直接讀取,則在任務(wù)完成后關(guān)閉直接讀取,然后在關(guān)閉攝像頭設(shè)備。在代碼中,采用了一個(gè)判斷語句,判斷vd->grabMethod的值來判斷系統(tǒng)采用哪種讀取方式。int close_v4l(struct vdIn *vd){
int i;if(vd->grabMethod){
} else { free(vd->pFramebuffer);vd->pFramebuffer = NULL;if(debug)printf(“unmapping frame buffern”);munmap(vd->pFramebuffer, vd->mmapsize);
} } if(debug)printf(“close video_devicen”);close(vd->fd);/* dealloc the whole buffers */ if(vd->videodevice){
} if(vd->cameraname){
} for(i = 0;i < OUTFRMNUMB;i++){
} pthread_mutex_destroy(&vd->grabmutex);if(vd->ptframe[i]){
} free(vd->ptframe[i]);vd->ptframe[i] = NULL;vd->framelock[i] = 0;if(debug)printf(“freeing output buffer %dn”, i);
free(vd->cameraname);vd->cameraname = NULL;free(vd->videodevice);vd->videodevice = NULL;5.1.3視頻數(shù)據(jù)采集
視頻數(shù)據(jù)的采集是系統(tǒng)實(shí)現(xiàn)的第一步,是所有工作的前提。嵌入式Linux系統(tǒng)支持兩種視頻數(shù)據(jù)采集的方式:內(nèi)存映射、直接讀取視頻。
(1)內(nèi)存映射
內(nèi)存映射方式是通過mmap系統(tǒng)調(diào)用函數(shù)來實(shí)現(xiàn)的。mmap系統(tǒng)調(diào)用使得進(jìn)程之間通過映射同一個(gè)普通文件實(shí)現(xiàn)共享內(nèi)存。普通文件被映射到進(jìn)程地址空間
后,進(jìn)程可以像訪問普通內(nèi)存一樣對文件進(jìn)行訪問,不必再調(diào)用read()、write()等操作。
首先,使用ioctl系統(tǒng)調(diào)用的VIDIOCSFBUF命令獲得攝像頭存儲(chǔ)緩沖區(qū)的幀信息,之后初始化video_mbuf,修改video_mmap中的設(shè)置,重新設(shè)置圖像信息,如幀的垂直及水平分辨率、彩色顯示格式等。為了防止緩沖區(qū)的內(nèi)容與有用信息疊加產(chǎn)生干擾,在初始化之前可以先調(diào)用memset(&(vd->videombuf),0,sizeof(vd->videombuf)來清零緩沖區(qū)。然后使用函數(shù)vd->map=(unsigned char*)mmap(O,vd->mbuf.size,PROT_READ|PROT_WRITE,MAP_SHARED,vd->fd,ff_t offset)使設(shè)備內(nèi)容映射到內(nèi)存區(qū),其中第一個(gè)參數(shù)為共享內(nèi)存的起始地址,一般設(shè)為0,表示由系統(tǒng)分配;第二個(gè)參數(shù)為映射到調(diào)用進(jìn)程地址空間的字節(jié)數(shù),它從被映射文件開頭offset個(gè)字節(jié)開始算起;第三個(gè)參數(shù)指定共享內(nèi)存的訪問權(quán)限(PROT_READ(可讀),PROT_WRITE(可寫),PROT_EXEC(可執(zhí)行));第四個(gè)參數(shù)可以是MAP_SHARED或者M(jìn)AP_PRIVATE;第五個(gè)參數(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ù)的模加上l。
vd->vmmap.height=vd->hdrheight;vd->vmmap.width=vd->hdrwidth;vd->vmmap.format=vd->formatln;/*判斷圖像截取是否完成*/ if(ioctl(vd->fd,VIDIOCSYNC,&vd->vmmap.frame)<0){ perror(??cvsync errn);erreur=-I;} while((vd->framelock [vd->frame_cour]!=0)&&vd->signalquit)usleep(1000);temps=ms_time();
pthread_mutex_lock(&vd->grabmutex);jpegsize=convertframe(vd->ptframe[vd->frame_cour]+sizeof(struct frame_t),vd->pFramebuffer+vd->videombuf.offsets[vd->vmmap.frame],vd->hdrwidth,vd->hdrheight,vd->formatln,vd->framesizeIn);headerframe=(struct frame_t*)vd->ptframe [vd->frame_cour];
snprintf(headerframe->header, 5,”%s”.”SPCA”);
headerframe->seqtimes=ms_time();headerframe->w=vd->hdrwidth;headerframe->h=vd->hdrheight;headerframe->size=((jpegsize<0)? 0: jpegsize);headerframe->format=vd->formatln;headerframe->nbframe=frame++;pthread_mutex_unlock(&vd->grabmutex);/*截取視頻幀*/ if((ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->vmmap)))<0){ perror(“cmcapture”);
if(debug)printf(“>>cmcapture err n”);erreur=-l;} vd->vmmap.frame=(vd->vmmap.frame+1)%vd->videombuf.frames;vd->frame_cour=(vd->frame_cour+l)%OUT FRMNUMB;(2)直接讀取方式
直接讀取視頻數(shù)據(jù)是通過read系統(tǒng)調(diào)用函數(shù)來實(shí)現(xiàn)。read是一個(gè)用來從指定的文件或設(shè)備中讀取數(shù)據(jù)的系統(tǒng)調(diào)用。參數(shù)表為read(fd,(void*)pFramebuff,(size_t)framesizeln)。其中fd為文件描述符,pFramebuffer為指向存放數(shù)據(jù)的內(nèi)存的指針,framesizeln為需要讀取的數(shù)據(jù)的長度。對于攝像頭設(shè)備的讀取,需要先分配內(nèi)存空間,用來存儲(chǔ)從攝像頭讀取過來的視頻數(shù)據(jù),然后直接調(diào)用read系統(tǒng)調(diào)用讀取視頻數(shù)據(jù),返回值為實(shí)際讀取的視頻幀大小,也正是在視頻傳輸過程中發(fā)送的視頻數(shù)據(jù)大小。
size=vd->framesizeln;vd->pFramebuffer=(unsigned char*)realloc(vd->pFramebuffer,(size_t)size);Len=read(vd->fd, vd->pFramebuffer, size);if(len<0){ if(debug)printf(“v41 read errorn”);
if(debug)printf(“l(fā)en %d asked %dn”, len, size);return 0;}
/*是否有其他進(jìn)程正在使用該視頻幀*/ while((vd->framelock [vd->frame_cour]!=0)&&vd->signalquit)
headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);
usleep(1000);temps=ms_time();
pthread_mutex_lock(&vd->grabmutex);jpegsize=convertframe(vd->ptframe[vd->frame_cour]+sizeof(structframe_t),vd->pFramebuffer,vd->hdrwidth,vd->hdrheight,vd->formatln,vd->framesizeln);headerframe=(struct frame_t*)vd->ptframe [vd->frame_cour];snprintf(headerframe->header, 5,”%s”,”SPCA”);headerframe->seqtimes=ms_time();headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);headerframe->w=vd->hdrwidth;headerframe->h=vd->hdrheight;headerframe->size=((jpegsize<0)? 0: jpegsize);headerframe->format=vd->formatln;headerframe->nbframe=frame++;vd->frame_cour=(vd->frame_cour+1)%OUTFRMNUMB;pthread_mutex_unlock(&vd->grabmutex);5.2圖像編解碼 5.2.1編解碼介紹
通過攝像頭采集到數(shù)據(jù)后,還并不能把它們直接通過網(wǎng)卡傳輸,因?yàn)檫@樣的數(shù)據(jù)很大,網(wǎng)絡(luò)不能承擔(dān)如此龐大的數(shù)據(jù)傳輸。所以,必須將采集到得數(shù)據(jù)進(jìn)行編碼,壓縮數(shù)據(jù)大小。通過這樣的操作,我們采集到得數(shù)據(jù)就會(huì)變得很小,然后再把這些數(shù)據(jù)通過網(wǎng)絡(luò)傳輸。同樣的道理,在輸出端我們還要把接收到的已經(jīng)壓縮的數(shù)據(jù)還原回來,這就涉及到解碼的內(nèi)容。通過這一系列的操作,圖像和視頻數(shù)據(jù)就實(shí)現(xiàn)的遠(yuǎn)程的傳輸。如果沒有編解碼,遠(yuǎn)程傳輸就是實(shí)際上不可能的事情,所以圖像的編解碼是非常重要的。
現(xiàn)在普遍使用的編解碼技術(shù)。對于靜態(tài)圖像,普遍使用靜態(tài)壓縮JPEG標(biāo)準(zhǔn);對于動(dòng)態(tài)視頻,普遍使用動(dòng)態(tài)壓縮MPEG標(biāo)準(zhǔn)。
JPEG是由ISO和CCITT為靜態(tài)圖像壓縮所建立的國際上第一個(gè)靜態(tài)圖像壓縮標(biāo)準(zhǔn),JPEG有著較高的壓縮比,復(fù)雜度適中,既可以用硬件實(shí)現(xiàn),也可以用軟件實(shí)現(xiàn),實(shí)用性強(qiáng),被廣泛使用于計(jì)算機(jī)和通信行業(yè)。
MPEG中文譯名為動(dòng)態(tài)圖像專家組。到目前為止,MPEG標(biāo)準(zhǔn)主要有五個(gè),32
MPEG-
1、MPEG-
2、MPEG-
4、MPEG-7和MPEG-21。它是由ISO/IEC1172壓縮編碼標(biāo)準(zhǔn)得出的視頻壓縮格式,MPEG的出現(xiàn)使視聽傳播進(jìn)入數(shù)碼化時(shí)代。MPEG標(biāo)準(zhǔn)的視頻壓縮編碼技術(shù)主要利用了具有運(yùn)動(dòng)補(bǔ)償?shù)膸g壓縮編碼技術(shù)以減少時(shí)間冗余度,利用DCT技術(shù)以減少圖像的空間冗余度,利用熵編碼技術(shù)在信息表示方面減少了統(tǒng)計(jì)冗余度。通過一系列技術(shù),極大的體現(xiàn)了壓縮性能[16]。
5.2.2系統(tǒng)壓縮技術(shù)
由于本系統(tǒng)要求實(shí)現(xiàn)遠(yuǎn)程視頻傳輸,為了達(dá)到預(yù)計(jì)的設(shè)計(jì)要求,設(shè)計(jì)采用基于MJPEG算法的壓縮技術(shù)進(jìn)行視頻壓縮。MJPEG和MPEG的不同點(diǎn)在于MJPEG不使用幀間編碼??墒荕JPEG與MPEG仍然是一脈相承的,它對MEPG進(jìn)行了一些改進(jìn)和發(fā)展,功能更加強(qiáng)大,能發(fā)送高質(zhì)圖片、清晰視頻,編碼容易實(shí)現(xiàn)。但MJPEG也有一些缺點(diǎn),由于功能的提升,MJPEG對帶寬的要求很高,編碼效率低。
參考文獻(xiàn)
1.張永強(qiáng),趙勇勇,李崇德.嵌入式遠(yuǎn)程視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2006,05(02):57-60.2.Jing Li, Weidong Hao.Research and Design of Embedded Network Video Monitoring System Based on Linux[C].The 2008 International Conference on Embedded Software and Systems Symposia, 2008, 1310-1313.3.陳章龍,唐志強(qiáng),涂時(shí)亮.嵌入式技術(shù)與系統(tǒng)——Intel Xscale 結(jié)構(gòu)與開發(fā)[M].北 京:北京航空航天大學(xué)出版社,2004,143.4.奧爾博公司.PXA270嵌入式實(shí)驗(yàn)開發(fā)系統(tǒng)——Linux實(shí)驗(yàn)指導(dǎo)[M],2007.5.Seon Gyu Kim and Sung Ho Cho.Implementation of an Embedded Software Modem Platform[J].Division of Electrical & Computer Engineering,2006,04(2):5-9 6.杜春雷.ARM體系結(jié)構(gòu)與編程[M].北京:清華大學(xué)出版社,2003.7.朱珍民,隋雪青.嵌入式實(shí)時(shí)操作系統(tǒng)及其應(yīng)用開發(fā)[M].北京:北京郵電大學(xué)出版社,2006.8.李亞峰 歐文盛.ARM嵌入式Linux系統(tǒng)開發(fā)從入門到精通[M].北京:清華大學(xué) 33
出版社,2007,51-54.9.李善平.Linux內(nèi)核2.4版源代碼分析大全[M].北京:機(jī)械工業(yè)出版社,2002.10.廖日坤.ARM嵌入式應(yīng)用開發(fā)技術(shù)白金手冊[M].北京:中國電力出版社,2007, 284-290.11.劉昆.Linux環(huán)境下宿主機(jī)與ARM開發(fā)板NFS服務(wù)的配置[J].科技資訊,2008,05(04):65-80.12.韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].北京:人民教育出版社,2008.13.孫紀(jì)坤,張小全.嵌入式Linux系統(tǒng)開發(fā)技術(shù)詳解——基于ARM[M].北京:人民郵電出版社,2006.14.李冰,孫建平,譚悅,張啟勤.基于嵌入式Linux與S3C2410的網(wǎng)絡(luò)視頻監(jiān)控[J].河北:華北電力大學(xué)學(xué)報(bào),2006,2(4):15-30.15.董玲,朱宏,楊忠孝.基于ARM的嵌入式Linux應(yīng)用程序開發(fā)研究[J].電子測試,2008,05(06):40-60.16.Yongqiang Zhang, Bing Zhang.Design of Embedded Audio and Video Compression System[J].Workshop on Intelligent Information Technology Application,2007,12(8):76-90.17.Xing Zhang, Li-Ming Song.Implementation of Video Data Transmission Between ARM and DSP Through Embedded Linux[C].The 2008 International Conference on Embedded Software and Systems Symposia,2008,292-295.18.張躍進(jìn),謝昕.嵌入式網(wǎng)絡(luò)數(shù)字視頻監(jiān)控系統(tǒng)的設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,12(9):70-100.19.Yi Wu, Jiangyong Cai, Xiao Lin, Lianfeng Shen.The Design and Realization of the Wireless Video Monitoring System Based on Embedded Linux and CDMA1X[C].The 2008 International Conference on Embedded Software and Systems Symposia, 2008, 179-184.20.王先春,郭杰榮,胡惟文,樊希平.基于ARM_Linux的嵌入式Web服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2007,14(7):90-95.34
第二篇:嵌入式遠(yuǎn)程視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)(基于S3C2410)
嵌入式遠(yuǎn)程視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)(基于S3C2410)
發(fā) 布 時(shí) 間 : 2008-11-19 來 源 : 中電網(wǎng) 作 者 : 張永強(qiáng),趙永勇,李崇德 瀏 覽 :
984
多媒體通信技術(shù)的發(fā)展為信息的獲取和傳輸提供了豐富的手段,視頻采集是其中不可缺少的重要組成部分,該系統(tǒng)基于S3C2410的ARM9芯片和嵌入式Linux操作系統(tǒng),采用USB攝像頭捕捉視頻,經(jīng)MPEG-4算法壓縮編碼,系統(tǒng)直接與網(wǎng)絡(luò)相連,用戶使用標(biāo)準(zhǔn)的網(wǎng)絡(luò)瀏覽器和流媒體播放程序即可查看遠(yuǎn)程視頻影像。硬件系統(tǒng)
系統(tǒng)硬件平臺(tái)選用基于ARM9架構(gòu)嵌入式芯片S3C2410,穩(wěn)定工作在202MHz主頻,板載64MB SDRAM 64MB FLASH,主板資源包括:主USB口、從USB口、10M/100M以太網(wǎng)口,觸摸屏、彩色LCD、鍵盤、8個(gè)用戶自定義LED數(shù)碼管,A/D,RTC電路,2個(gè)串口、1個(gè)JTAG通用接口,音頻模塊,支持MPEG4,MP3編解碼,3個(gè)168PIN的擴(kuò)展插座,32位的數(shù)據(jù)總線,保留充分?jǐn)U展空間。
其中標(biāo)配模塊包括:IC卡+PS2模塊、IDE硬盤+CF卡模塊、PCMCIA+SD/MMC模塊。另外可選配模塊有:GPS模塊,GPRS模塊,F(xiàn)PGA模塊,CAN+AD+DA模塊、紅外模塊、藍(lán)牙模塊、攝像頭模塊。軟件系統(tǒng)
2.1 內(nèi)核配置與USB攝像頭驅(qū)動(dòng)
假定已經(jīng)搭建好嵌入式Linux的開發(fā)環(huán)境,下面第一步工作就是USB攝像頭的安裝與驅(qū)動(dòng)。首先檢查Linux Kernel中是否已經(jīng)添加了USB模塊的支持,并且加入Video4Linux支持。
Multimedia devices→Video For Linux
Video For Linux→[*]V4L information in proc filesystem
在主菜單的USB Support下還有各種攝像頭的驅(qū)動(dòng),選中將要使用的攝像頭芯片類型。
<>USB IBM(Xirlink)C-it Camera support<*>USB OV511 Camera support<>USB Philips Cameras <>USB SE401 Camera support<>USB STV680(Pencam)Camera support<>USB 3com HomeConnect(akavicam)support 在USB攝像頭選購時(shí),優(yōu)先考慮Linux內(nèi)核公開支持的攝像頭芯片,不然要額外編寫相應(yīng)的USB攝像頭驅(qū)動(dòng)程序,然后進(jìn)行編譯、安裝。在此選用網(wǎng)眼公司的V3000產(chǎn)品,他采用了OV511的芯片。
確定USB攝像頭被正常驅(qū)動(dòng)后,下一步就是使用Video4Linux提供的API函數(shù)集來編寫視頻采集程序。
2.2 基于V4L設(shè)計(jì)的視頻采集模塊
在Linux下,所有外設(shè)都被看成是一種特殊的文件,稱為設(shè)備文件。系統(tǒng)調(diào)用是內(nèi)核和應(yīng)用程序之間的接口,而設(shè)備驅(qū)動(dòng)程序則是內(nèi)核和外設(shè)之間的接口。他完成設(shè)備的初始化和釋放、對設(shè)備文件的各種操作和中斷處理等功能,為應(yīng)用程序屏蔽了外設(shè)硬件的細(xì)節(jié),使得應(yīng)用程序可以像普通文件一樣對外設(shè)進(jìn)行操作。
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下與Video4Linux相關(guān)設(shè)備及用途如表1所示。
這里主要針對設(shè)備文件/dev/video進(jìn)行視頻捕捉方面的程序設(shè)計(jì)。
Linux下視頻采集流程如圖2所示。
其中用到的主要函數(shù)有:
Camera_open():用來開啟視頻設(shè)備文件,使用前需要首先聲明一個(gè)video_device類型的設(shè)備文件。
Camera_get_capability():通過調(diào)用ioctl()函數(shù)取得設(shè)備文件的相關(guān)信息,并存放到video_capability結(jié)構(gòu)里。
Camera_get_picture():通過調(diào)用ioctl()函數(shù)取得圖像的相關(guān)信息,并且存放到video_picture結(jié)構(gòu)里。
Camera_close():用來關(guān)閉設(shè)備文件。Camera_grab_image():用來抓取圖像,采用mmap方式,直接將設(shè)備文件/dev/video0映射到內(nèi)存,加速文件I/O操作,還可以使多個(gè)線程共享數(shù)據(jù)。
剩下的還有設(shè)備初始化、參數(shù)設(shè)備等相關(guān)函數(shù),不再詳述。
2.3 視頻壓縮編碼模塊
獲取圖像數(shù)據(jù)后,可以直接輸出到FrameBuffer進(jìn)行顯示,由于本系統(tǒng)要將采集到的視頻影響通過網(wǎng)絡(luò)傳輸出去,所以在傳輸之前要對原始的圖像數(shù)據(jù)進(jìn)行壓縮編碼,在此選用MPEG-4視頻編解碼方案。和其他標(biāo)準(zhǔn)相比,MPEG-4壓縮比更高,節(jié)省存儲(chǔ)空間,圖像質(zhì)量更好,特別適合在低帶寬條件下傳輸視頻,并能保持圖像的質(zhì)量。
MPEG-4中基于對象的視頻編碼過程可以分為3步進(jìn)行:
(1)從原始視頻流中分割視頻對象。
(2)對視頻對象進(jìn)行編碼,對不同視頻對象的運(yùn)動(dòng)信息、形狀信息、紋理信息分配不同的碼字。對輸入的任意形狀的VOP序列,用基于塊的混合編碼技術(shù)編碼,處理順序是先IVOP后PVOP,BVOP。在對VOP的形狀信息編碼后,取得任意形狀VOP的采樣,每個(gè)VOP劃分為不相交的宏塊,每個(gè)宏塊含有4個(gè)8×8象素塊進(jìn)行運(yùn)動(dòng)補(bǔ)償以及紋理編碼,已編碼的VOP幀保存在幀存中,在當(dāng)前VOP幀和已編碼VOP幀之間的計(jì)算運(yùn)動(dòng)矢量;對將編碼的塊和宏塊,計(jì)算他們的運(yùn)動(dòng)補(bǔ)償預(yù)測誤差;運(yùn)動(dòng)補(bǔ)償預(yù)測后的IVOP及誤差用8×8塊DCT變換,并進(jìn)行DCT系數(shù)的量化,然后是游程編碼和熵編碼。
(3)對各個(gè)視頻對象的碼流進(jìn)行復(fù)合,每個(gè)視頻對象的形狀、運(yùn)動(dòng)紋理信息復(fù)合成VOL比特流,各視頻對象視頻流復(fù)合成統(tǒng)一的碼流輸出。對視頻流進(jìn)行壓縮編碼以后,接下來就要實(shí)現(xiàn)網(wǎng)絡(luò)傳輸部分的功能。
2.4 JRTPLIB網(wǎng)絡(luò)傳輸模塊
流媒體指的是在網(wǎng)絡(luò)中使用流技術(shù)傳輸?shù)倪B續(xù)時(shí)基媒體,RTP是目前解決流媒體實(shí)時(shí)傳輸問題的好辦法,JRTPLIB是一個(gè)面向?qū)ο蟮腞TP庫,他完全遵循RFC1889設(shè)計(jì),下面講述如何在Linux平臺(tái)上運(yùn)用RTP協(xié)議進(jìn)行實(shí)時(shí)流媒體編程。
2.4.1 初始化 在使用JRTPLIB進(jìn)行實(shí)時(shí)流媒體數(shù)據(jù)傳輸之前,首先應(yīng)該生成RTPSession類的一個(gè)實(shí)例來表示此次RTP會(huì)話,然后調(diào)用Create()方法來對其進(jìn)行初始化操作。RTPSession類的Create()方法只有一個(gè)參數(shù),用來指明此次RTP會(huì)話所采用的端口號。
2.4.2 數(shù)據(jù)發(fā)送
當(dāng)RTP會(huì)話成功建立起來之后,接下來就可以開始進(jìn)行流媒體數(shù)據(jù)的實(shí)時(shí)傳輸了。首先需要設(shè)置好數(shù)據(jù)發(fā)送的目標(biāo)地址,RTP協(xié)議允許同一會(huì)話存在多個(gè)目標(biāo)地址,這可以通過調(diào)用RTPSession類的AddDestination()、DeleteDestination()和ClearDestinations()方法來完成。目標(biāo)地址全部指定之后,接著就可以調(diào)用RTPSession類的SendPacket()方法,向所有的目標(biāo)地址發(fā)送流媒體數(shù)據(jù)。
2.4.3 數(shù)據(jù)接收
對于流媒體數(shù)據(jù)的接收端,首先需要調(diào)用PollData()方法來接收發(fā)送過來的RTP或者RTCP數(shù)據(jù)報(bào)。由于同一個(gè)RTP會(huì)話中允許有多個(gè)參與者(源),因此既可以通過調(diào)用GotoFirstSource()和GotoNextSource()方法來遍歷所有的源,也可以通過調(diào)用GotoFisstSourceWithDat()和GotoNextSourceWithData()方法來遍歷那些攜帶有數(shù)據(jù)的源。在從RTP會(huì)話中檢測出有效的數(shù)據(jù)源之后,接下去就可以調(diào)用RTPSession類的GetNextPacket()方法從中抽取RTP數(shù)據(jù)報(bào),當(dāng)接收到的RTP數(shù)據(jù)報(bào)處理完之后,要及時(shí)釋放。
JRTPLIB為RTP數(shù)據(jù)報(bào)定義了3種接收模塊,通過調(diào)用RTPSession類的SetReceiveMode()方法可以設(shè)置下列這些接收模式:
RECEIVEMODE_ALL:缺省的接收模式,所有到達(dá)的RTP數(shù)據(jù)報(bào)都將被接受;RECEIVEMODE_IGNORESOME:除了某些特定的發(fā)送者之外,所有到達(dá)的RTP數(shù)據(jù)報(bào)都將被接受,而被拒絕的發(fā)送者列表可以通過調(diào)用AddToIgnoreList(),DeleteFromIgnoreList()和ClearIgnoreList()方法來進(jìn)行設(shè)置;RECEIVEMODE_ACCEPTSOME:除了某些特定的發(fā)送者之外,所有到達(dá)的RTP數(shù)據(jù)報(bào)都將被拒絕,而被接受的發(fā)送者列表可以通過調(diào)用AddToAcceptList(),DeleteFromAcceptList和ClearAcceptList()方法來進(jìn)行設(shè)置。
2.4.4 控制信息 JRTPLIB是一個(gè)高度封裝后的RTP庫,只要PollData()或者SendPacket()方法被成功調(diào)用,JRTPLIB就能夠自動(dòng)對達(dá)到的RTCP數(shù)據(jù)報(bào)進(jìn)行處理,并且還會(huì)需在要的時(shí)候發(fā)送RTCP數(shù)據(jù)報(bào),從而能夠確保整個(gè)RTP會(huì)話過程的正確性。
在本系統(tǒng)中,使用RTPSession JRTPLIB類庫提供的方法來實(shí)現(xiàn)底層的RTP/RTCP操作,并且把他封裝在CrtpTransmitter類中,該類從Media Sink類繼承而來,接收到相應(yīng)的媒體幀數(shù)據(jù),使用RTPSession類庫的操作把數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上。結(jié)語
本系統(tǒng)基于S3C2410平臺(tái)和Linux操作系統(tǒng),利用Video4Linux設(shè)計(jì)采集程序,使用MPEG-4壓縮編碼算法,通過實(shí)時(shí)流媒體傳輸技術(shù)實(shí)現(xiàn)了網(wǎng)絡(luò)傳輸,整個(gè)系統(tǒng)具有穩(wěn)定可靠、安裝簡便、成本低廉等特點(diǎn),可擴(kuò)展應(yīng)用在工業(yè)控制、視頻會(huì)議系統(tǒng)、可視電話、遠(yuǎn)程監(jiān)控系統(tǒng)等諸多領(lǐng)域。
第三篇:嵌入式視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_韓相軍
嵌入式視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
首都師范大學(xué)% 韓相軍關(guān)永王萬森王雪立
Han,Xiangjun Guan,Yong Wang,Wansen Wang,Xueli 摘要!較為理想的嵌入式視頻采集系統(tǒng)是基于!“# 的視頻采集系統(tǒng) & 本文重點(diǎn)闡述了嵌入式視頻采集系統(tǒng)的硬 ’
軟件設(shè)計(jì)
環(huán)節(jié)以及開發(fā)中的一些關(guān)鍵技術(shù)問題(首先以
$%”&’()%*+’
構(gòu)建視頻采集的硬件系統(tǒng) & 詳細(xì)介紹了 $,#-.-(’“//0.’.以
及所設(shè)計(jì)的視頻采集系統(tǒng)原理 & 該系統(tǒng)在 12’3&((控制下能實(shí)時(shí)將視頻像進(jìn)行采集 ’
編碼和傳輸)最后提出嵌入式系統(tǒng)的開
發(fā)流程并分析嵌入式系統(tǒng)開發(fā)中的一些問題 * 關(guān)鍵詞!視頻采集)嵌入式系統(tǒng))”#$%&’(#)*& 中圖分類號 +“,%-./* 文獻(xiàn)標(biāo)識碼!0 01234563!45678 69:65565;<56= 27>?@A6 3B3?69 <3 ?C6;<56= 27>?@A6 3B3?69 :7365 =D!”EF ?C6 >7>6A
+.’’FG’HI’J&’’)K’.G&G’’&)G’% 引言
視頻采集系統(tǒng)是數(shù)字圖像獲取的最基本手段 & 是
進(jìn)行數(shù)字圖像處理 + 多媒體和網(wǎng)絡(luò)傳輸?shù)那疤?& 它可
為各種圖像處理算法提供待處理的原始數(shù)字圖像和 算法驗(yàn)證平臺(tái) & 隨著人們對視頻圖像需求的激增和各 種圖像和視頻新的壓縮標(biāo)準(zhǔn)相繼提出 & 如
QP’*&’QP
’*+’REST’’REST+ 和
UEST’(((等 & 對高性能視頻
采集系統(tǒng)的研究將成為一個(gè)熱點(diǎn) * 按系統(tǒng)的處理器不 同嵌入式視頻采集系統(tǒng)大致可分為三類 VW.X 基于專用
視頻圖像芯片的視頻采集系統(tǒng))W’X 基于 EY 的視頻采 集系統(tǒng))W&X 基于)”E 的視頻采集系統(tǒng) * 基于專用視頻圖像芯片的視頻采集系統(tǒng)其核心 處理單元為專用圖像芯片 & 該圖像芯片決定系統(tǒng)的功 能 & 其應(yīng)用主要針對某一類產(chǎn)品 $ 如數(shù)碼攝像機(jī) %& 所
以具有一定的局限性 * 而基于 EY 機(jī)的視頻采集系統(tǒng)
最為普遍的就是基于視頻采集卡獲取數(shù)字化視頻信 息 & 通過運(yùn)行相應(yīng)的 EY 程序?qū)崿F(xiàn)視頻的采集 ’ 顯示與 存儲(chǔ) & 但是目前基于 EY 的算法程序通常處理時(shí)間較 長 & 很難實(shí)現(xiàn)實(shí)時(shí)的圖像處理應(yīng)用 * 相比基于專用視頻圖像芯片和基于 EY 的視頻采 集系統(tǒng)而言 & 嵌入式視頻采集系統(tǒng)可完成視頻的實(shí)時(shí) 采集 ’
傳輸以及各種視頻壓縮算法和圖像處理算法的 實(shí)現(xiàn) & 根據(jù)不同的應(yīng)用 & 可以編制不同的圖像處理程 序 & 所以具有更大的靈活性 & 并且設(shè)計(jì)與實(shí)現(xiàn)簡單 & 硬
件設(shè)計(jì)一般采用基于)“E 的視頻采集系統(tǒng) F 即 ,YY)Z 視頻信號處理芯片 ZYE[)]E^/SE_)Z)”E-的模式 實(shí)現(xiàn) * 其中 & 視頻信號處理芯片進(jìn)行信號的 /)轉(zhuǎn)換 & YE_)或 SE_)或 ]E^/ 用于視頻采樣控制 &)“E 對采
集的數(shù)據(jù)進(jìn)行處理 * 嵌入式視頻圖像采集系統(tǒng)主要包 括硬件設(shè)計(jì) ’
軟件設(shè)計(jì)和操作系統(tǒng) & 個(gè)部分 *.嵌
入式視頻采集系統(tǒng)的硬件設(shè)計(jì).P.視頻采集系統(tǒng)的基本構(gòu)成 基于)”E 的視頻采集系統(tǒng)要求對視頻信號具備 采集 ’
實(shí)時(shí)顯示 & 對圖像的處理和分析功能 * 因此 & 一
個(gè)視頻采集系統(tǒng)通常可由如下五部分構(gòu)成 V 視頻圖像 的采集 ’
視頻圖像的顯示輸出 ’
各種同步邏輯控制 ’ 視
頻圖像的分析和處理 ’
視頻數(shù)據(jù)的存儲(chǔ) * 因此 & 對于視
頻采集系統(tǒng)的基本構(gòu)成可用圖.所示框圖描述 * 圖.視頻采集系統(tǒng)的基本框圖
韓相軍 # 碩士研究生
北京市自然科學(xué)基金資助項(xiàng)目 $*’)&’’-%)北京市教委
科技發(fā)展計(jì)劃面上項(xiàng)目 $7E&’’).’’&F’.%%)北京市高 等學(xué)校 &’’H
教育教學(xué)改革立項(xiàng)項(xiàng)目 $&’’H’IH% 嵌入式系統(tǒng)應(yīng)用 中文核心期刊!微計(jì)算機(jī)信息 “(嵌入式與 SOC)2006 年第 22 卷第 1-2 期 360元 / 年郵局訂閱號 # 82-946?。 ? 格式輸出 $ 數(shù)據(jù)輸出格式是通過 $%& 總線編程來 選擇的 $’()*+,-的內(nèi)部寄存器初始化也通過 $.& 串
行接口來完成 % 對于不同的輸入制式 & 不同的采集要
求和不同的處理要求 $ 其幀緩存要求是不相同的 $ 如 對于)/012 制
$’314 5’67-+ 視頻輸入 $ 采樣后按 89.9.格式輸出 $ 一幀數(shù)據(jù)為
:.-!*:7!.“-6;<=>?@A$ 若
緩存三幀圖像 $ 則需要 <=>?@A 空間的采集幀緩存 $ 若 按 89+9+ 格式輸出 $ 則只需.=>?@A 的幀緩存 % 系統(tǒng)可選 擇
;=!<.1>B@ 的 C24/= 在系統(tǒng)中即作為采集幀緩存 和處理后的數(shù)據(jù)幀緩存 $ 也可作下載程序的存儲(chǔ)器使 用 % 系統(tǒng)提供串行接口 $ 可與外部設(shè)備進(jìn)行通信和傳 輸圖像數(shù)據(jù) % 其中
DBEBFG DH.I<--J)K/ 實(shí)現(xiàn)以下四 點(diǎn)功能 # L+M 完成系統(tǒng)中視頻采集和輸出部分的同步信號 和消隱信號的控制 $ 其中主要包括 ’(),+,-和
C//:+%+ 的行同步信號 & 場同步信號 & 消隱信號 ’ L%N 將部分邏輯單元設(shè)計(jì)為 J$JO 作數(shù)據(jù)緩存 $ 完 成外接 J$JO 的同步讀寫控制 $ 承擔(dān) ’#),+,-與 2C)的數(shù)據(jù)傳送工作 ’ P ’=C<.-2=78.與計(jì) 算機(jī)的數(shù)據(jù)通信工作以及從計(jì)算機(jī)加載各種圖像處 理算法 ’ L8N 對 ’#)*+*-輸出的數(shù)字圖像進(jìn)行預(yù)處理 $ 其中 主要包括圖像數(shù)據(jù)的色度空間轉(zhuǎn)換如!3# 到 4K5 的 轉(zhuǎn)換 $ 數(shù)據(jù)格式轉(zhuǎn)換如將 89.9.轉(zhuǎn)換為 89.9-’ L*N 作數(shù)據(jù)總線接口 $ 實(shí)現(xiàn)數(shù)據(jù)的驅(qū)動(dòng)傳輸?shù)裙δ?% ’=C<.-2=78.在系統(tǒng)中是各類算法實(shí)現(xiàn)的核心 器件 $ 根據(jù)不同的應(yīng)用場合 $ 可以編制不同的算法處 理程序 $ 使得該系統(tǒng)具有了很強(qiáng)的靈活性與通用性 % 值得強(qiáng)調(diào)的一點(diǎn)是為了便于操作系統(tǒng)中的其它外設(shè) $ 在該系統(tǒng)中 $’=C<.-2=78.的外部存儲(chǔ)器接口控制 寄存器必須配置為優(yōu)先使用外部存儲(chǔ)器模式 %!嵌 入式視頻圖像采集系統(tǒng)的軟件 設(shè)計(jì) 一個(gè)完整的嵌入式系統(tǒng)由圖 < 所示的 8 部分來 組成 % 圖 < 嵌入式系統(tǒng)組成 圖 < 中的底層是硬件系統(tǒng) $ 核心是嵌入式處理器(嵌入芯片)$ 通常這樣構(gòu)成的系統(tǒng)又被稱為是 CO& LC?I@AQ RF &SBTN 系統(tǒng) % 在硬件系統(tǒng)的上面是 5C)L 板級 支持包 N$ 包括各種必要的對底層硬件系統(tǒng)的屏蔽 $ 引 導(dǎo)上層操作系統(tǒng)在硬件系統(tǒng)上的正確運(yùn)行 % 操作系統(tǒng) 正確運(yùn)行之后還需要開發(fā)各種設(shè)備驅(qū)動(dòng)程序 $ 目的是 給用戶的應(yīng)用程序開發(fā)提供對底層設(shè)備的屏蔽 $ 提供 一個(gè)統(tǒng)一的用戶開發(fā)接口 L/)$N% 5C)是指系統(tǒng)內(nèi)核在特定的硬件系統(tǒng)上面運(yùn)行所 需要的初始化代碼和各種設(shè)備驅(qū)動(dòng)程序 % 它主要包 括 # 系統(tǒng)初始化 $ 初始化 &)3 寄存器和測試 &)3 的型 號版本等 $ 它和 5RR@ERUVAW 中的初始化部分共同完成 所有的系統(tǒng)準(zhǔn)備工作 $ 使得系統(tǒng)處于預(yù)期的穩(wěn)定工作 狀態(tài) ’ 內(nèi)存管理 $ 在沒有 ==”L 內(nèi)存管理單元 N 的系統(tǒng) 里面主要是數(shù)據(jù) HUHSA 和程序 HUHSA 的管理 $ 在具有 ==“ 單元的系統(tǒng)中還要包括 ==” 的各種表的管理 $ 它主要用來實(shí)現(xiàn)內(nèi)存的映射 ’ 中斷控制器管理 $ 對于 一個(gè) 4’OC 來說 $ 中斷是不可缺少的部分 % 嵌入式操作系統(tǒng)相關(guān)技術(shù)已經(jīng)成熟 $ 由于 0BFXG 具有源碼開放 & 開發(fā)工具豐富 & 技術(shù)支持廣泛等特點(diǎn) $ 視頻圖像采集系統(tǒng)選用嵌入式 0BFXG 操作系統(tǒng) LYQ# >AVVAV 0BFXG OTAWU@BRF C?I@AQN% 0BFXG 中的中斷管理 包括中斷號的申請和釋放 & 中斷屏蔽和中斷服務(wù) & 中 斷向量分配等 $ 時(shí)鐘和設(shè)備驅(qū)動(dòng)程序 % 驅(qū)動(dòng)程序是利用操作系統(tǒng)提供的接口 $ 完成對底 層硬件的操作 % 驅(qū)動(dòng)程序的開發(fā) $ 是在操作系統(tǒng)提供 的接口基礎(chǔ)上編寫對底層硬件的操作和控制程序 $ 然 后加入到操作系統(tǒng)的內(nèi)核 % 用戶對某一個(gè)設(shè)備的訪 問 $ 首先是將用戶的各種操作傳遞給操作系統(tǒng) $ 然后 由操作系統(tǒng)調(diào)用設(shè)備的驅(qū)動(dòng)程序 $ 完成對硬件的各種 數(shù)據(jù)傳輸 $ 所以驅(qū)動(dòng)程序必須要告訴操作系統(tǒng)該硬件 的各種操作程序的入口地址 % 特別對于 0BFXG 下的驅(qū) 動(dòng)程序開發(fā) $ 經(jīng)過調(diào)試通過的驅(qū)動(dòng)程序可以編譯為一 個(gè)模塊動(dòng)態(tài)地裝載入操作系統(tǒng)內(nèi)核或者從操作系統(tǒng) 內(nèi)核中刪除 Z 因此驅(qū)動(dòng)程序在 0BFXG 中是可以作為內(nèi) 核的一部分來編寫 % 對于用戶程序開發(fā) $ 與通用)& 上面開發(fā)應(yīng)用程 序類似 % 但是在嵌入式應(yīng)用中 $ 應(yīng)用程序一般是作為 文件系統(tǒng)的一部分加入到操作系統(tǒng)的內(nèi)核 $ 然后重新 編譯內(nèi)核 $ 最后生成一個(gè)可以執(zhí)行的二進(jìn)制壓縮映像 文件加載到系統(tǒng)的存儲(chǔ)空間 % 加載的加入了用戶應(yīng)用 程序的操作系統(tǒng)一般還必須固化 $ 燒到系統(tǒng)的 JEUIS 中 % 在系統(tǒng)運(yùn)行時(shí) $ 根據(jù)操作系統(tǒng)的 $*$’ 函數(shù)轉(zhuǎn)到用 戶程序執(zhí)行 % “結(jié) 論 基于 2C)的視頻采集系統(tǒng) $ 由于可以靈活的修改 其圖像處理算法 $ 它的應(yīng)用主要面向用戶的特定需求 和對實(shí)時(shí)性有較高要求的場合 % 隨著技術(shù)的 L 見 +8;頁 N BSP 嵌入式系統(tǒng)應(yīng)用!現(xiàn)場總線技術(shù)應(yīng)用 200 例.;”!“# 基于 $%& 的視頻采集系統(tǒng) 圖 # 給出了基于 ’(%)#*$(+,# 與 ’-&.!./ 構(gòu) 成的視頻采集系統(tǒng) ”’(%)#/$(+,# 可以直接和視頻 編解碼器接口 “ 該系統(tǒng)可同時(shí)完成四路視頻圖像的實(shí) 時(shí)采集 # 傳輸以及各種視頻壓縮算法和圖像處理算法 的實(shí)現(xiàn) ” 根據(jù)不同的應(yīng)用 “ 可以編制不同的圖像處理 程序 $ ’(%)#/$(+,# 有自己的圖像處理庫函數(shù) ” 可以 實(shí)現(xiàn)各類圖像處理算法 $ 因此 “ 該系統(tǒng)具有更大的靈 活性與通用性 $ 圖 # 基于 ’-&.!./ 與 $%& 的視頻采集系統(tǒng)!”#“!’(%)#/$(+,# 簡介 ’(%)#/$(+,# 是 ’0 推出的一款面向數(shù)字多媒體 應(yīng)用的 $%&” 它在 ’0 的 1+,2 $%& 內(nèi)核基礎(chǔ)上進(jìn)一步 集成了完備的視頻 3 音頻輸入 3 輸出接口 % 以太網(wǎng)接口 # &104++ 總線等片上外設(shè) “ 不僅能使用戶很方便地對音 頻 5 視頻等各種復(fù)雜的運(yùn)算進(jìn)行高速處理 ” 還能為方 便 # 無縫地接口視頻 3 音頻編解碼器件和以太網(wǎng) 3&10 總 線等數(shù)據(jù)傳輸接口 & 因此 “ 它非常適用于-60&% 數(shù)字視 頻服務(wù)器 % 多通道數(shù)字視頻錄像機(jī) 7$-89% 多通道數(shù)字 視頻監(jiān)控等應(yīng)用 & $(+,# 的程序 3 數(shù)據(jù)空間以字節(jié)為單位進(jìn)行統(tǒng)一 編址 ” 整個(gè)尋址空間為 ,:8& 其片上存儲(chǔ)器 % 片上外 設(shè) % 及外部存儲(chǔ)器接口 7;(0<9 均映射到此 ,:8 的空間 中 & $(+,# 通過外部存貯器接口 7;(0<9 訪問片外存儲(chǔ) 器 7<=>?@%%$AB(%CBA’%B’B9“ 如圖 # 所示 ”$(+,# 共有三個(gè)視頻口 “ 分別為-&/%-&!和 -&-&/ 與-&!則與 (D8%&%(DB%& 復(fù)用引腳的 ” 其功能選擇由 $(+,# 上的外設(shè)配置寄存器 7&;A1<:9 進(jìn)行配置的 & $(+,# 支持多種外部接口!&10 接口 %E&0 接口和以太 網(wǎng)(B1 接口 “ 這些接口信號復(fù)用相同的引腳 ” 它們的 功能選擇和配置是在上電復(fù)位時(shí)通過檢測 $(+,# 上 的特殊引腳 7&10F;G%(B1F;G%E$.%&10F;;B09 的狀 態(tài)來實(shí)現(xiàn)的 &!H#“# 視頻 B3$ 采樣電路!’-&.!./ 在圖 # 系統(tǒng)中 ”’-&.!./ 是由 ’0 公司推出的一款 高性能視頻解碼器 “ 可將 G’%1%&BI 視頻信號轉(zhuǎn)換成 數(shù)字色差信號 7JC-,K#K#9” 支持兩個(gè)復(fù)合視頻或一個(gè) % 端子輸入 & 輸出格式為 0’C 4A 8’L+.+“ 并支持 (>DM6NO?O6P ’(復(fù)制保護(hù)以及高級的-80 功能 & 不僅如 此 ”’-&.!./ 還具備了封裝小 7)# 腳的 ’Q<&9% 功耗小 的特點(diǎn) 7R!./ST9& 因此 “ 它非常適用于便攜 % 批量大 % 高質(zhì)量和高性能的視頻產(chǎn)品 & ’-&.!./ 可接受 # 路復(fù) 合視頻信號 71-8%9 輸入和!路超級視頻信號 7%U-OVW6 即 %XYWMU-OVW6”J319 輸入 & 該芯片包含一個(gè)擴(kuò)展端口 ’ZU 端口(用于數(shù)字視頻 ’ 雙向半雙工(“ 它可直接連接 倒(&;: 或視頻電話進(jìn)行編解碼 $ ’-&.!./ 的圖像端 口 ’0U 端口(支持 [ 位或!+ 位的輸出數(shù)據(jù)并帶輔助參 考數(shù)據(jù)可直接與-:B 控制器接口 $ ’-&.!./ 提供 0 # 1 總線接口 ” 其最高傳輸速率為 ,//]O^?_?“ 通過它可以 完成芯片的初始化以及設(shè)置修改等操作 $ ’-&.!./ 作 為 0 # 1 總線的從設(shè)備 ” 最多可配置為 # 個(gè)不同的從設(shè) 備地址 “ 一條 0 # 1 總線只能同時(shí)訪問 # 個(gè) ’-&.!./ 配 置口 ” 所以 $(+,# 可以連接 , 個(gè) ’-&.!./“ 進(jìn)行 , 路 視頻輸入 $!H#H)視頻 $_B 電路!%BB‘!#!圖 # 系統(tǒng)中視頻 $_B 由視頻編碼器 %BB‘!#!完 成 $ %BB‘!#!支持 &BI 與 G’%1 格式的視頻編碼 ” 其 輸入支持 8’H+.+ 格式的數(shù)字視頻 $ %BB‘!#!有!路 復(fù)合視頻 71-8%9 輸出和!路超級視頻 7%U-OVW6“J_19 輸 出 ” 其系統(tǒng)像素時(shí)鐘頻率為!)H.(Ea“ 它可以直接接收(&;: 解碼數(shù)據(jù)和采用 ,K#K# 格式每行 ‘#/ 有效像素 的 110A 兼容 JC-數(shù)據(jù) ” 其內(nèi)部包含同步 _ 時(shí)鐘產(chǎn)生 器和數(shù)模轉(zhuǎn)換器兩部分電路 $ %BB‘!#! 同樣需要通過 0 # 1 總線進(jìn)行初始化和設(shè)置修改等操作 $ 從圖 # 中可看出 “-&/ 既要做視頻輸入口 ” 也要支 持視頻輸出口 “ 即-&/ 可以工作在 1>Y^XMW 與 $O?Y=>b 兩種作模式 $ 但這兩種工作模式不能同時(shí)使用作模式 不能同時(shí)使用 $ 當(dāng)-&/ 作為 [U 位的 8’H+.+ 視頻采集 口時(shí) ” 僅需視頻數(shù)據(jù)流串行時(shí)鐘和采集使能控制信 號 “ 串行數(shù)據(jù)流串行時(shí)鐘由 ’-&.!./ 的 %1Ic” 采集使 能控制信號則由 ’-&.!./ 的 0G’A;Q_:&1I_-8Ic 引 腳配置為通用輸出引腳來控制 “ 此時(shí) %BB‘!#!E 不起 作用 $ 當(dāng)-&/ 作為 [U 位的 8’H+.+ 顯示口時(shí) ”%BB‘!#!需要 E%JG17 行同步信號 9%-%JG17 場同步信號 9%II1 7#‘(Ea 的行鎖存號 9 控制 $!H#H, 系統(tǒng)原理 圖 # 系統(tǒng)其主要功能是完成視頻圖像的采集 % 處 理 % 存儲(chǔ)和傳輸 $ 系統(tǒng)的視頻輸入可以是 G’%1%&BI 和 %;1B(制式的任何一種 “ 或者采用 % 端子輸入 $ ’-&.!./ 完成視頻信號的 B_$ 轉(zhuǎn)換 ” 為后續(xù)處理提供 數(shù)字視頻數(shù)據(jù) “ 同時(shí)它還分離出行 % 場同步信號并輸 出系統(tǒng)時(shí)鐘供視頻 $_B 芯片和 <0 EMAC/MDIO TVP5150 EMIF64 HPI16/HPI32 TMS320DM642 (600MHz 4800MIPS) EDMA 64 Channels L1P Cache 16KB L1D Cache 16KB L2 Cache 256KB Parallel executive Units 32 bit Timers 66MHZ PCI32 20/10b VP0 20/10b VP1 20/10b VP2A TVP5150 TVP5150 TVP5150 20/10b VP2B Xilinx XC2S300 FPGA SAA7121 嵌入式系統(tǒng)應(yīng)用)變頻器與軟啟動(dòng)器應(yīng)用 200 例 * #‘中文核心期刊!微計(jì)算機(jī)信息 ”(嵌入式與 SOC)2006 年第 22 卷第 1-2 期 360元 / 年郵局訂閱號 # 82-946!!模糊量 $ 可歸納一系列控制規(guī)則 $ 例如規(guī)則!“ #$ %&!’(!)* +,-.&/!’ +!0* 1234 5!’ 6!7 %!8)909%%9:* : 為規(guī)則數(shù) $+!)&+;0&% 及 6!為語言變量 $ 則由第;條規(guī)則構(gòu)成的模糊關(guān)系為 # 6!* >.+!0 > 6!* 而對于一定 &? 和 &/?$ 相應(yīng)的輸出為 # 5!8@&?>.+!= >6!*A > @&/?>.+!B > 6!*A 則 #585!.!8)$0$%$:* 圖 C 模糊控制框圖 根據(jù)控制經(jīng)驗(yàn) $ 將其中將語言變量分成七級 # 正 大.D6*$ 正中.DE*$ 正小.DFG$ 零.H*$ 負(fù)小.,F*$ 負(fù)中.,E*$ 負(fù)大.,6*’ 在實(shí)際控制中 $ 由于被控對象只能接受一個(gè) 確定的控制信號 $ 而模糊推理是一個(gè)模糊集合 $ 因此 $ 必須建立精確量和模糊量之間的轉(zhuǎn)換關(guān)系 9 即從輸出 的模糊集合中 $ 判決出一個(gè)精確量(在此采用固定量 化因子 & 比例因子及隸屬度最大原則 $ 進(jìn)行離散推理 $ 求出各相應(yīng)的控制表 $ 并將數(shù)據(jù)存入-FD 內(nèi)存 $ 以便 在線使用 $ 實(shí)施實(shí)時(shí)控制(圖 I 1J 中斷采樣子程序 軟件采用定時(shí)器 1J 中斷方式 9 中斷服務(wù)子程序如 圖 I 所示(系統(tǒng)每隔一個(gè)時(shí)間段進(jìn)行一次中斷 9 啟動(dòng)!K ” 轉(zhuǎn)換 9 同時(shí)完成數(shù)據(jù)采集 & 數(shù)字 #$“ 控制 & 控制量輸 出 & 溫度顯示及數(shù)據(jù)保存等功能(定時(shí)器 1)中斷 $ 為-FD 處理器和計(jì)算機(jī)通訊 $ 發(fā)送數(shù)據(jù) $ 便于計(jì)算機(jī)繪制 溫度跟蹤曲線 $ 鍵盤中斷 $ 完成鍵盤掃描和獲取鍵值(此外 9 為了減小系統(tǒng)在平衡位置的振蕩 9 在軟件上采取 了數(shù)據(jù)濾波 & 設(shè)定死區(qū)等措施(!結(jié) 語 基于-FD0LJM 模糊 N 數(shù)字 D;O 差熱天平采用計(jì)算 機(jī)控制技術(shù) $ 能夠?qū)崿F(xiàn)溫度發(fā)控制 $ 并在液晶屏和計(jì) 算機(jī)上實(shí)時(shí)顯示溫度及溫度跟蹤曲線(實(shí)驗(yàn)中對控制 算法進(jìn)行多次實(shí)驗(yàn)和調(diào)整 9 取得了很好的控制效果 $ 達(dá) 到了預(yù)期的設(shè)計(jì)目的(參考文獻(xiàn) @)A 安穎 9 劉麗娜 P 基于-FD 的高速信號采集與處理系統(tǒng)的設(shè)計(jì))Q*% 微計(jì) 算機(jī)信息 $0JJC9)RCMNCS @0A 孫增圻 $ 等 P 智能控制理論與技術(shù) @EAP 北京 # 清華大學(xué)出版社 $)SSMP @TA 于海生 $ 等 P 微型計(jì)算機(jī)控制技術(shù) @EAP 北京 # 清華大學(xué)出版社 $)SSSP @LA 張念淮 $ 等 P 5F6 總線接口開發(fā)指南 @EAP 北京 # 國防工業(yè)出版社 $0JJ)作者簡介 # 李智強(qiáng) $ 男 $)SMI&$ 河南工業(yè)大學(xué)電氣工程 學(xué)院 $ 碩士(籍貫 # 山東 + 郭廣靈 $ 女 $)SM)&$ 河南工業(yè) 大學(xué)電氣工程學(xué)院 $ 高級實(shí)驗(yàn)師(,!”###$ 河南鄭州河南工業(yè)大學(xué)電氣工程學(xué)院韓相軍 關(guān)永王萬森王雪立 %<166’7’ 12 F(21-G)/+1(H(7+(’’-+(78 <)I+/)6 J1-!G)6 *(+,’-.+/08K’+L+(78D###E$= &)(8M+)(7L;(@;)(8 N1(7 O)(78O)(.’(O)(78M;’6+ U 投稿日期 R0JJCPIP)IG U 修稿日期 R0JJCPIP0VG e α dt d ec E EC e c α U u D/A y D/A u α T0 A/D ADC FIFO 《 #’(技術(shù)應(yīng)用)** 例》 DSP 開發(fā)與應(yīng)用)LV 基于ARM的數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì) 班級:通信071 姓名: 指導(dǎo)教師: 摘 要 隨著嵌入式技術(shù)的迅速發(fā)展,嵌入式終端在家居和工業(yè)等領(lǐng)域發(fā)揮著越來越重要的作用。本設(shè)計(jì)提出了一種以嵌入式為基礎(chǔ)的溫度采集系統(tǒng)的設(shè)計(jì)方案,使得基于嵌入式系統(tǒng)做溫度采集終端有較好的人機(jī)交互界面和系統(tǒng)高穩(wěn)定性等特點(diǎn)。 本文介紹了整個(gè)硬件開發(fā)環(huán)境,bootloader的啟動(dòng)流程,Linux系統(tǒng)的架構(gòu),Linux內(nèi)核的架構(gòu)和根文件系統(tǒng)等相關(guān)知識。同時(shí),本設(shè)計(jì)在軟件方面主要編寫了DS18B20的底層驅(qū)動(dòng)程序,進(jìn)行了Linux內(nèi)核的配置編譯,設(shè)計(jì)了QT頂層應(yīng)用程序;在硬件方面主要設(shè)計(jì)了DS18B20的硬件電路,搭建了嵌入式交叉開發(fā)環(huán)境。通過綜合調(diào)試最終實(shí)現(xiàn)了基于ARM9的嵌入式溫度采集系統(tǒng)的設(shè)計(jì)。 嵌入式數(shù)據(jù)采集系統(tǒng)具備了發(fā)展?jié)摿Υ?,功耗低,穩(wěn)定性高,可視化界面好,便于攜帶和功能可擴(kuò)展的特性。 關(guān)鍵詞:嵌入式系統(tǒng);Linux內(nèi)核;溫度采集 Abstract With the rapid development of embedded technology, the embedded terminal is playing an increasingly important role in the home and industry.The paper proposes a temperature collection system which is based on embedded system, and using the embedded terminal to do data collection will have characteristics of better man-machine interface and high stability.This article describes the environment of hardware development, the boot process of bootloader, the architecture of Linux system, Linux kernel-related architecture, root file system architecture and other related knowledge.At the same time, this design mainly completed the programming of DS18B20's bottom-level driver, the configuration and compilation of the Linux kernel and the design of QT top-level application program in software.In the respect of hardware, the work includes of designing of the DS18B20's circuit and building the cross-tool development environment.Through synthesized debugging this project the design of the temperature collection system finally is realized, which is based on ARM9 embedded system.The data collection terminal based on embedded system has the high potential for development, low power consumption, high stability, good visual interface, easy to carry and functions which can be expanded, and so on.Key Words: Embedded System;Linux Kernel;Temperature Collection System 一、選題背景和意義 目前我國溫室大棚技術(shù)已經(jīng)在全國范圍內(nèi)被廣泛應(yīng)用,這一技術(shù)的誕生解決了北方人冬天沒蔬菜的難題。溫室大棚技術(shù)其關(guān)鍵技術(shù)在于對溫室的溫度進(jìn)行嚴(yán)格控制,只有嚴(yán)格的溫度控制才能保證棚內(nèi)植物正常生長,而如何實(shí)現(xiàn)對溫度的實(shí)時(shí)控制,顯而易見溫度采集作為大棚溫控是一個(gè)不可忽略的環(huán)節(jié),然而傳統(tǒng)的溫度采集系統(tǒng)一般穩(wěn)定性不高,而且沒有一個(gè)良好的人機(jī)交互界面,但是如果使用PC機(jī)作為溫度采集系統(tǒng)就會(huì)大大提高生產(chǎn)成本,而且安裝放置也很不方便?;谶@一背景,本設(shè)計(jì)旨在通過設(shè)計(jì)一個(gè)基于ARM的嵌入式溫度采集系統(tǒng)在成本高和穩(wěn)定性差之間尋求一個(gè)平衡點(diǎn)。 基于ARM的嵌入式系統(tǒng)有諸多優(yōu)點(diǎn)是傳統(tǒng)電子系統(tǒng)無法比擬的,利用嵌入式開發(fā)技術(shù)本設(shè)計(jì)可以設(shè)計(jì)出具有良好的人機(jī)交互界面的實(shí)時(shí)系統(tǒng),同時(shí)嵌入式系統(tǒng)最大的優(yōu)點(diǎn)就是軟硬件可裁剪,依據(jù)自己系統(tǒng)的需要可以進(jìn)行靈活的軟硬件設(shè)計(jì)開發(fā),而且基于ARM的嵌入式系統(tǒng)開發(fā)成本低,而且系統(tǒng)穩(wěn)定性高,功耗低,體積小,并且能夠應(yīng)用于多種應(yīng)用場合[1]。這些優(yōu)點(diǎn)就大大擴(kuò)大了基于ARM的嵌入式系統(tǒng)的應(yīng)用范圍。 通過設(shè)計(jì)嵌入式溫度采集一方面可以解決一些實(shí)際問題,但更為重要的是通過本設(shè)計(jì)是對自己大學(xué)四年學(xué)習(xí)的一個(gè)檢驗(yàn),由于大學(xué)期間沒有學(xué)習(xí)有關(guān)嵌入式的相關(guān)知識,通過自學(xué)嵌入式開發(fā)的相關(guān)知識,讓自己對嵌入式有一個(gè)深入的理解,為以后的學(xué)習(xí)工作奠定基礎(chǔ)。 二、mini2440開發(fā)板的介紹 1.處理器S3C2440 Mini2440采用了S3C2440作為處理器[2]。S3C2440采用了ARM920T的內(nèi)核,0.13μm的CMOS標(biāo)準(zhǔn)宏單元和存儲(chǔ)器單元。其功耗低,體積小且靜態(tài)設(shè)計(jì)特別適合于對成本和敏感性有特殊要求的實(shí)際應(yīng)用。其總線采用了新的總線架構(gòu)AMBA(Advanced Micro Controller Bus Architecture)。S3C2440其特點(diǎn)是CPU是一個(gè)16/32位ARM920T的RISC處理器,ARM920T具備MMU,AMBA,BUS以及Harvard高速緩沖體系結(jié)構(gòu)。這一結(jié)構(gòu)具有獨(dú)立的16KB指令Cache和16KB數(shù)據(jù)Cache每個(gè)都是由具有8字長的行組成。通過一套完整的通用系統(tǒng)外設(shè),S3C2440無需配置額外的組也同時(shí)減少整體系統(tǒng)成本。S3C2440集成了大量的片上功能,所以以S3C2440為核心處理器的mini2440開發(fā)板有豐富的接口資源可供開發(fā)者編程使用。 2.交叉開發(fā)環(huán)境 嵌入式系統(tǒng)的開發(fā)一般采用“宿主機(jī)-目標(biāo)機(jī)”交叉開發(fā)方式[3]。首先,利用宿主上豐富的資源以及良好的開發(fā)環(huán)境來進(jìn)行開發(fā)和仿真目標(biāo)機(jī)上的軟件,再通過H-JTAG口,UTAR口或者是以太網(wǎng)接口將生成的代碼下載到目標(biāo)機(jī)上進(jìn)行運(yùn)行。 本設(shè)計(jì)宿主機(jī)主要是使用裝有RedHat5企業(yè)版Linux操作系統(tǒng)的PC機(jī),而目標(biāo)機(jī)就是mini2440開發(fā)板。組成架構(gòu)如圖2.1所示。宿主機(jī)PC機(jī)串口、以太網(wǎng)接口、USB接口目標(biāo)機(jī)Mini2440開發(fā)板 圖2.1 嵌入式開發(fā)交叉環(huán)境構(gòu)架 三、系統(tǒng)組成及DS18B20的驅(qū)動(dòng)設(shè)計(jì) 1.系統(tǒng)硬件框圖 本設(shè)計(jì)硬件系統(tǒng)方面比較簡單,系統(tǒng)部分組成:一是系統(tǒng)控制部分,二是溫度采集部分。其中系統(tǒng)控制部分又包括以下幾個(gè)部分:處理器、復(fù)位模塊、顯示模塊、外部接口模塊等四大部分組成。而溫度采集本分主要由DS18B20電路組成。具體組成如圖3.1所示。 顯示模塊其他接口CPU及存儲(chǔ)器I/O接口測溫模塊復(fù)位模塊 圖3.1 測溫系統(tǒng)硬件框圖 2.DS18B20驅(qū)動(dòng)設(shè)計(jì) 硬件驅(qū)動(dòng)大體可以分為以下幾類:網(wǎng)絡(luò)接口驅(qū)動(dòng),字符設(shè)備驅(qū)動(dòng),塊設(shè)備驅(qū)動(dòng)[5]。字符設(shè)備是指按字節(jié)來訪問的設(shè)備,字符驅(qū)動(dòng)就負(fù)責(zé)驅(qū)動(dòng)字符設(shè)備,這樣的驅(qū)動(dòng)通常實(shí)現(xiàn)read、write、open、和close的調(diào)用[4]。 Linux用戶一般是通過操作設(shè)備文件來訪問和操作各種設(shè)備的,所以用戶想要使用DS18B20進(jìn)行溫度采集時(shí),只需要對設(shè)備文件ds18b20進(jìn)行打開、控制、讀、寫、關(guān)閉等一系列操作就可以控制DS18B20進(jìn)行溫度采集。 在字符設(shè)備中存在一種特殊的字符設(shè)備---混雜設(shè)備,這類設(shè)備的主設(shè)備號都是10,次設(shè)備號通過函數(shù)調(diào)用可已進(jìn)行動(dòng)態(tài)分配。本設(shè)計(jì)DS18B20的驅(qū)動(dòng)就被劃歸為字符設(shè)備中的混雜設(shè)備。在驅(qū)動(dòng)文件中只需要對DS18B20的時(shí)需進(jìn)行讀、寫、復(fù)位時(shí)序描寫。 四、bootloader相關(guān)知識 1.Bootloader背景知識 簡單地說,bootloader就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過這段小程序,本設(shè)計(jì)可以初始化硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的運(yùn)行環(huán)境。在嵌入式系統(tǒng)中,通常并沒有像BIOS那樣的固件程序,因此整個(gè)系統(tǒng)的加載啟動(dòng)任務(wù)就完全由bootloader來完成。比如在一個(gè)基于ARM9的嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時(shí)通常都從地址0x00000000處開始執(zhí)行,而在這個(gè)地址處安排的通常就是系統(tǒng)的bootloader程序。 bootloaderLinux kernelRoot file system 圖4.1 嵌入式系統(tǒng)軟件層次結(jié)構(gòu) 2.單片機(jī)主控模塊 對于開發(fā)板mini2440有多種bootloader,例如 u-boot,supervivi,v-boot等等。他們之間的區(qū)別就是不同的bootloader可以引導(dǎo)不同內(nèi)核。像supervivi能啟動(dòng)zImage,u-boot能啟動(dòng)uImage,而zImage和uImage的不同之處就在于在編譯時(shí)生成內(nèi)核的文件頭不同。本設(shè)計(jì)采用的是supervivi作為bootloader來引導(dǎo)Linux內(nèi)核。 Supervivi和許多bootloader一樣它的啟動(dòng)也包括兩個(gè)部分:stage1和stage2。Stage1主要實(shí)現(xiàn)的是硬件的初始化同時(shí)為stage2準(zhǔn)備內(nèi)存空間,并將stage2復(fù)制到內(nèi)存中并設(shè)置堆棧,然后跳轉(zhuǎn)到stage2。.五、Linux內(nèi)核 1.Linux內(nèi)核簡介 Linux內(nèi)核的主要模塊(或組件)分以下幾個(gè)部分:存儲(chǔ)管理、CPU和進(jìn)程管理、虛擬文件系統(tǒng)、設(shè)備管理和驅(qū)動(dòng)、網(wǎng)絡(luò)通信,以及系統(tǒng)的初始化(引導(dǎo))、系統(tǒng)調(diào)用等。具體如圖5.1所示: 系統(tǒng)調(diào)用接口(System Call Interface)進(jìn)程管理Process Management內(nèi)存管理Memory Management結(jié)構(gòu)Arch虛擬文件系統(tǒng)Vritual File System網(wǎng)絡(luò)協(xié)議棧Network Stack設(shè)備驅(qū)動(dòng)Device Drivers 圖5.1 Linux內(nèi)核架構(gòu) 2.配置編譯生成zImage[5] 使用已經(jīng)移植好的Linux-2.6.29內(nèi)核進(jìn)行zImage的生成,在此過程中通過內(nèi)核編譯的方式把DS18B20的驅(qū)動(dòng)加載到內(nèi)核當(dāng)中,而不是使用內(nèi)核模塊的方式加載驅(qū)動(dòng)程序,然后通過內(nèi)核配置,編譯最后生成zImage。添加DS18B20驅(qū)動(dòng)界面如下圖: 圖5.2 添加設(shè)備DS18B20 六、QT測溫應(yīng)用程序 1.QT應(yīng)用程序流程圖 根據(jù)畢設(shè)要求,要設(shè)計(jì)一個(gè)直觀的溫度采集界面,能夠?qū)崟r(shí)顯示為溫度值,所以QT界面上能夠同時(shí)顯示時(shí)間和溫度,使得操作者能夠清楚地看到溫度值和當(dāng)前時(shí)間。應(yīng)用程序具體流程如圖6.1所示: 開始圖形界面屬性初始化1秒定時(shí)器開始定時(shí)判斷能否打開設(shè)備DS18B20YY寫入命令讀取溫度獲取當(dāng)前系統(tǒng)時(shí)間顯示溫度顯示時(shí)間NN1秒定時(shí)是否結(jié)束結(jié)束 圖6.1 應(yīng)用程序流程圖 2.QT應(yīng)程序的設(shè)計(jì) QT應(yīng)用程序主要是通過QT designer進(jìn)行設(shè)計(jì)的,根據(jù)畢設(shè)要求,要設(shè)計(jì)一個(gè)直觀的溫度采集界面,能夠?qū)崟r(shí)顯示為溫度值,所以QT界面上能夠同時(shí)顯示時(shí)間和溫度,使得操作者能夠清楚地看到溫度值和當(dāng)前時(shí)間。具體界面如下圖: [6] 圖6.2 利用QT designer設(shè)計(jì)界面 通過在x86平臺(tái)下通過配置編譯最后看到在x86平臺(tái)下QT應(yīng)用程序的界面: 圖6.3 x86平臺(tái)下QT程序的運(yùn)行結(jié)果 七、root_qtopia件系統(tǒng)和綜合調(diào)試 雖然root_qtopia這個(gè)文件系統(tǒng)的GUI是基于Qtopia的,但其初始化啟動(dòng)過程卻是由大部分由busybox完成,Qtopia(qpe)只是在啟動(dòng)的最后階段被開啟[7]。 在進(jìn)行了上面步驟的前提下本設(shè)計(jì)得到了zImage 和root_qtopia.img文件,基于此基本上完成了設(shè)計(jì)然后進(jìn)行綜合調(diào)試[8],具體步驟如下: (1)安裝bootloader:連接好超級終端并作如下設(shè)置、dnw、電源線,并把開關(guān)撥向Nor Flash一端。在超級終端可以看到如下界面: 圖7.1 串口超級終端設(shè)置 圖7.2 用H-JTAG和H-JFlasher燒寫vivi 圖7.3 supervivi啟動(dòng)界面 (2)分別通過選擇“x”、“v”、“k”、“y”分別把supervivi下載到Nand Flash中然后把開關(guān)撥向Nand Flash一側(cè),給開發(fā)上電,進(jìn)入dev目錄查看設(shè)備中是否有DS18B20。 圖7.4 查看DS18B20設(shè)備是否存在 (3)綜合調(diào)試結(jié)果: 圖7.5 綜合調(diào)試結(jié)果圖 參 考 文 獻(xiàn) [1] 孫戈,盧建軍,高理.基于S3C2440的嵌入式Linux開發(fā)實(shí)例.西安:西安電子科技大學(xué)出版社,2010.[2] 三星公司.S3C2440 User's Manual.http://.[7] 百度文庫.root_qtopia文件系統(tǒng)啟動(dòng)流程http://wenku.baidu.com/view/251bdb27a5e9856a56126021.html.[8] 友善之臂.mini2440開發(fā)板用戶手冊.http://www.arm9home.net/read.php?tid-5682.html 視頻交通流信息采集系統(tǒng)解決方案 概述 視頻交通流信息采集系統(tǒng)主要包括視頻圖像采集設(shè)備、視頻傳輸網(wǎng)絡(luò)、交通流視頻檢測器等。視頻檢測器采用虛擬線圈技術(shù),利用邊緣信息作為車輛的檢測特征,實(shí)時(shí)自動(dòng)提取和更新背景邊緣,受環(huán)境光線變化和陰影的影響較??;同時(shí)采用動(dòng)態(tài)窗的方式來進(jìn)行車輛計(jì)數(shù),解決了采用以往固定窗方式進(jìn)行車輛計(jì)數(shù)時(shí)由于車輛變道而導(dǎo)致的錯(cuò)誤、重復(fù)計(jì)數(shù)問題。視頻檢測器能對視頻圖像采集設(shè)備或交通電視監(jiān)視系統(tǒng)的視頻信號自動(dòng)進(jìn)行檢測,主要采集道路的微觀交通信息如流量、速度、占有率、車輛間距、排隊(duì)長度等,適用于近景監(jiān)控模式。系統(tǒng)功能及特點(diǎn)介紹 2.1 數(shù)據(jù)接口設(shè)計(jì) 視頻交通流信息采集系統(tǒng)可以通過調(diào)用本項(xiàng)目提供的交通流數(shù)據(jù)統(tǒng)一接入接口,或由本項(xiàng)目提供數(shù)據(jù)格式標(biāo)準(zhǔn)化及上傳程序,將采集到的交通流數(shù)據(jù)共享給本項(xiàng)目相關(guān)系統(tǒng),以實(shí)現(xiàn)視頻交通流數(shù)據(jù)的采集功能。 數(shù)據(jù)格式標(biāo)準(zhǔn)化及上傳程序數(shù)據(jù)推送數(shù)據(jù)共享接口視頻采集系統(tǒng)數(shù)據(jù)交通信息統(tǒng)一接入接口 圖1 數(shù)據(jù)接口設(shè)計(jì) 2.2 系統(tǒng)功能 交通流信息視頻檢測系統(tǒng)的主要功能如下:(1)車輛檢測 系統(tǒng)能夠?qū)斎氲囊曨l流圖像進(jìn)行車型、車牌等特征檢測。(2)交通流數(shù)據(jù)采集功能 系統(tǒng)可以采集交通流數(shù)據(jù)包括交通流量、平均車速、車道占有率、車型、平均車頭間距、車輛排隊(duì)長度、車輛密度、交通流狀態(tài)等,交通流數(shù)據(jù)采集時(shí)間間隔在1~60分鐘任意可調(diào)。 圖 2 視頻交通流檢測模塊 (3)視頻圖像跟蹤功能 系統(tǒng)能對單路監(jiān)控前端設(shè)備在不同預(yù)置位采集的視頻圖像進(jìn)行不同區(qū)域不同事件的自動(dòng)檢測。一旦檢測到特定的交通事件,事件檢測器應(yīng)具有該交通事件的視頻圖像目標(biāo)自動(dòng)跟蹤、記錄、分析功能。 當(dāng)輸入的視頻圖像不為設(shè)定的預(yù)置位的視頻圖像,系統(tǒng)應(yīng)能自動(dòng)不進(jìn)行事件檢測。一旦監(jiān)控前端設(shè)備恢復(fù)至設(shè)定的預(yù)置位,系統(tǒng)應(yīng)能自動(dòng)進(jìn)行事件檢測。 (4)事件圖像抓拍、錄像功能 系統(tǒng)可以根據(jù)用戶的設(shè)置,完成相應(yīng)的錄像和圖片抓拍功能。 事件錄像可以按攝像機(jī)、按事件類型、按時(shí)間歸檔存儲(chǔ)在系統(tǒng)的預(yù)錄像子系統(tǒng)中,由系統(tǒng)服務(wù)器進(jìn)行統(tǒng)一的管理調(diào)用。 系統(tǒng)循環(huán)進(jìn)行錄像,當(dāng)發(fā)生交通異常事件時(shí),系統(tǒng)能夠提供事發(fā)之前和之后的3分鐘間的錄像(可設(shè)置)。 系統(tǒng)可通過多種組合查詢條件對視頻交通流檢測所采集的數(shù)據(jù)進(jìn)行統(tǒng)計(jì),包括時(shí)間-流量統(tǒng)計(jì)、時(shí)間-平均車速統(tǒng)計(jì)、時(shí)間-占有率統(tǒng)計(jì)、速度-流量統(tǒng)計(jì)等;統(tǒng)計(jì)結(jié)果可導(dǎo)出為Execl報(bào)表。 圖3數(shù)據(jù)查詢統(tǒng)計(jì) 圖4數(shù)據(jù)統(tǒng)計(jì)結(jié)果 (5)其他功能 ? 系統(tǒng)能自動(dòng)檢測視頻場景變動(dòng),判別檢測數(shù)據(jù)是否有效;并能自動(dòng)恢復(fù)到設(shè)定的位置; ? 視頻檢測器能夠保存采集到的交通數(shù)據(jù)15天以上,在網(wǎng)絡(luò)發(fā)生故障時(shí)能夠?qū)⒔煌〝?shù)據(jù)自動(dòng)存儲(chǔ)在視頻檢測器內(nèi),網(wǎng)絡(luò)恢復(fù)后可以查詢歷史交通數(shù)據(jù),保證數(shù)據(jù)不會(huì)丟失; ? 支持查詢同時(shí)支持自動(dòng)生成各類圖形化報(bào)表,使得數(shù)據(jù)管理更加方便直觀。 2.3 系統(tǒng)特點(diǎn) (1)車輛檢測算法先進(jìn)可靠 采用先進(jìn)的穩(wěn)定邊緣特征車輛檢測算法,結(jié)合區(qū)域特征處理,魯棒性高,受環(huán)境光照和天氣變化影響較小,特別是針對城市交通流做了很多優(yōu)化處理,在緩慢和擁堵等飽和交通流情況下仍能保持較高檢測精度,而且不受行人和自行車等混合交通流的干擾。 (2)應(yīng)用模式靈活多樣 具有多種應(yīng)用模式及相應(yīng)工程解決方案,可滿足用戶各種不同視頻資源條件下的交通流采集需求。可接入標(biāo)清/高清、模擬/數(shù)字、單路/多路視頻信號進(jìn)行檢測,并可通過有線/無線通訊方式將檢測數(shù)據(jù)傳到監(jiān)控中心,實(shí)現(xiàn)前端/后臺(tái)的視頻交通流信息采集。此外,后臺(tái)中心采集方式特有刀片式服務(wù)器版本,可同時(shí)并行處理多路視頻,極大提高用戶機(jī)房空間利用率,投資性價(jià)比高。 (3)具有自適應(yīng)場景功能 特有自適應(yīng)場景技術(shù),即可以自動(dòng)檢測各種原因造成的攝像頭偏移,判定場景變化,自動(dòng)調(diào)整檢測區(qū)域位置,自動(dòng)控制云臺(tái)和攝像頭復(fù)位,保證檢測結(jié)果的正確和有效。 (4)支持視頻輪巡檢測 支持對任意多路視頻以輪巡方式進(jìn)行檢測,視頻輪巡方案可由用戶靈活設(shè)置,可大大提高視頻資源利用率,性價(jià)比高。 (5)自帶數(shù)據(jù)統(tǒng)計(jì)分析功能 提供數(shù)據(jù)統(tǒng)計(jì)分析功能,可根據(jù)用戶需要實(shí)現(xiàn)單點(diǎn)/多點(diǎn)、早晚高峰/任意時(shí)間段、小時(shí)/天/任意統(tǒng)計(jì)間隔、截面/分車道、單個(gè)參數(shù)/多個(gè)參數(shù)等的統(tǒng)計(jì)和對比分析、生成統(tǒng)計(jì)報(bào)表,并可用二維或三維柱狀圖和曲線圖的方式進(jìn)行結(jié)果展示,直觀明了。應(yīng)用案例 基于智能視頻交通流檢測技術(shù),方緯公司自主研發(fā)了視頻交通流檢測軟件,并已在廣東省公安廳交通管理局、佛山市交通局、香港運(yùn)輸署等地進(jìn)行了應(yīng)用。 (1)廣州市交委公交專用道視頻交通流檢測(一、二、三期)? 應(yīng)用地點(diǎn):廣州市交委 ? 項(xiàng)目名稱:公交專用道視頻交通流檢測(一、二、三期)? 應(yīng)用規(guī)模:200路視頻 ? 應(yīng)用場景:市區(qū)主干道,部分場景如下圖所示: 圖5廣州市城市主干路交通流檢測場景 ? 應(yīng)用情況: 該案例為后臺(tái)檢測應(yīng)用,由廣州市交委數(shù)據(jù)中心機(jī)房的檢測服務(wù)器通過網(wǎng)絡(luò)從前端網(wǎng)絡(luò)攝像機(jī)或硬盤錄像機(jī)直接獲取視頻流進(jìn)行交通流檢測。一期項(xiàng)目采用10臺(tái)工控機(jī)檢測80路視頻,二期和三期項(xiàng)目采用3臺(tái)刀片式服務(wù)器檢測120路視頻,極大地節(jié)省了機(jī)房空間。由于應(yīng)用場景為城市道路,因此交通流情況比較復(fù)雜,如早晚高峰會(huì)出現(xiàn)緩慢或擁堵、車輛變線行駛頻繁、行人和自行車干擾等,但即便在如此復(fù)雜的交通流情況下,本產(chǎn)品仍能保持較高的檢測精度:所有視頻的車流量檢測準(zhǔn)確率均大于91%。 (2)泰國布吉機(jī)場高速公路智能化管理系統(tǒng)項(xiàng)目一期 ? 應(yīng)用地點(diǎn):泰國機(jī)場高速 ? 項(xiàng)目名稱:泰國布吉機(jī)場高速公路智能化管理系統(tǒng)項(xiàng)目一期 ? 應(yīng)用規(guī)模:60路視頻 ? 應(yīng)用場景:高速公路,部分應(yīng)用場景如下圖所示: 圖6泰國高速路交通流檢測場景 ? 應(yīng)用情況 該案例為后臺(tái)檢測應(yīng)用,由泰國交通部機(jī)房的檢測服務(wù)器通過網(wǎng)絡(luò)從前端網(wǎng)絡(luò)攝像機(jī)(??低暜a(chǎn)品)直接獲取視頻流進(jìn)行交通流檢測。由于當(dāng)?shù)刂惶峁〢DSL網(wǎng)絡(luò),帶寬較小,因此本產(chǎn)品有針對性地調(diào)整了檢測視頻分辨率,每路視頻只需0.5M帶寬,很好地解決了帶寬不足的問題。此外,由于應(yīng)用場景為高速公路,車速都比較快,但本產(chǎn)品仍能保持較高的檢測精度:車流量檢測準(zhǔn)確率均大于95%,車速檢測精度大于90%。第四篇:基于ARM的數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)--優(yōu)秀畢設(shè)申請材料
第五篇:視頻交通流采集系統(tǒng)解決方案