




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《專業(yè)實(shí)訓(xùn)》課程設(shè)計(jì)論文-33-基于ARM9視頻監(jiān)控系統(tǒng)的設(shè)計(jì)摘要:本文首先綜合論述什么是ARM9監(jiān)控系統(tǒng),接著闡述實(shí)現(xiàn)ARM9監(jiān)控系統(tǒng)的原理及實(shí)現(xiàn)ARM9監(jiān)控系統(tǒng)所需的硬件及軟件。其次,列出實(shí)現(xiàn)的具體步驟和部分截圖。最后附錄部分重要源代碼。關(guān)鍵詞:VMware虛擬機(jī)Linux操作系統(tǒng)交叉編譯TQ2440開發(fā)板第一章ARM監(jiān)控系統(tǒng)簡(jiǎn)述1.1什么是ARM監(jiān)控系統(tǒng)ARM9監(jiān)控系統(tǒng)是一種典型的嵌入式系統(tǒng)。嵌入式操作系統(tǒng)(EmbeddedOperatingSystem,簡(jiǎn)稱:EOS)是指用于嵌入式系統(tǒng)的操作系統(tǒng)。嵌入式操作系統(tǒng)是一種用途廣泛的系統(tǒng)軟件,通常包括與硬件相關(guān)的底層驅(qū)動(dòng)軟件、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動(dòng)接口、通信協(xié)議、圖形界面、標(biāo)準(zhǔn)化瀏覽器等。嵌入式操作系統(tǒng)負(fù)責(zé)嵌入式系統(tǒng)的全部軟、硬件資源的分配、任務(wù)調(diào)度,控制、協(xié)調(diào)并發(fā)活動(dòng)。它必須體現(xiàn)其所在系統(tǒng)的特征,能夠通過(guò)裝卸某些模塊來(lái)達(dá)到系統(tǒng)所要求的功能。目前在嵌入式領(lǐng)域廣泛使用的操作系統(tǒng)有:嵌入式Linux、WindowsEmbedded、VxWorks等,以及應(yīng)用在智能手機(jī)和平板電腦的Android、iOS等。在嵌入式領(lǐng)域中廣泛應(yīng)用的是ARM系列的處理器,ARM公司引發(fā)了嵌人式領(lǐng)域的一場(chǎng)革命,在低功耗、低成本的嵌入式應(yīng)用領(lǐng)域確立了其市場(chǎng)領(lǐng)導(dǎo)地位,是目前32位市場(chǎng)中使用最廣泛的微處理器。以ARM為架構(gòu)的嵌入式技術(shù)具有非常廣闊的前景。在ARM微處理器平臺(tái)上移植嵌入式Linux操作系統(tǒng),完成視頻采集任務(wù),并以服務(wù)器方式將圖像發(fā)送到網(wǎng)絡(luò),從而實(shí)現(xiàn)遠(yuǎn)程監(jiān)控。系統(tǒng)以ARM9微處理器AT91RM9200為主處理器,采用普通USB攝像頭作為圖像采集設(shè)備,構(gòu)建了一種可靠性好、價(jià)格低廉和使用方便的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)。視頻監(jiān)控系統(tǒng)由實(shí)時(shí)控制系統(tǒng)、監(jiān)視系統(tǒng)和管理信息系統(tǒng)三部分組成。僅發(fā)展了短短二十幾年時(shí)間,從19世代80年代的第一代模擬監(jiān)控到第二代基于“PC+多媒體卡”的數(shù)字式視頻監(jiān)控系統(tǒng)再到第三代完全基于IP的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng),就發(fā)生了翻天覆地變化。本系統(tǒng)基于ARM9處理器和嵌入式Linux操作系統(tǒng),利用USB接口攝像頭實(shí)現(xiàn)數(shù)字圖像采集任務(wù)。1.2ARM監(jiān)控系統(tǒng)實(shí)現(xiàn)原理如圖1-1為ARM監(jiān)控系統(tǒng)整體設(shè)計(jì)原理框圖NANDFLASHNANDFLASHSDRAM 以太網(wǎng)USB攝像頭以太網(wǎng)USB攝像頭DA9161E接口USB控制器MCU單元S3C2440A MCU單元 S3C2440A RS232RS232串口PC機(jī)PC機(jī)圖1-1ARM監(jiān)控系統(tǒng)整體設(shè)計(jì)原理框圖視頻監(jiān)控系統(tǒng)是安全防范系統(tǒng)的組成部分,它是一種防范能力較強(qiáng)的綜合系統(tǒng)。視頻監(jiān)控以其直觀、方便、信息內(nèi)容豐富而廣泛應(yīng)用于許多場(chǎng)合。嵌入式視頻監(jiān)控系統(tǒng)是以應(yīng)用為中心、軟硬件可裁減的、適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積等綜合性嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng),亦即為監(jiān)控系統(tǒng)量體裁衣的專用計(jì)算機(jī)系統(tǒng)。嵌入式視頻監(jiān)控系統(tǒng)主要由嵌入式處理器、相關(guān)支撐硬件、嵌入式操作系統(tǒng)及應(yīng)用軟件系統(tǒng)等組成,它是集軟硬件于一體的可獨(dú)立工作的“器件”。在視頻監(jiān)控上的嵌入式應(yīng)用將是視頻監(jiān)控領(lǐng)域的一個(gè)重要發(fā)展方向。該系統(tǒng)的處理器采用的是三星公司的ARM9芯片S3C2440,它采用ARM920T內(nèi)核的32位處理器。主頻為400MHz,最高可頻率可達(dá)到533MHz,通過(guò)在目標(biāo)機(jī)上運(yùn)行Linux操作系統(tǒng),搭建嵌入式視頻服務(wù)器,接收攝像頭采集的視頻數(shù)據(jù),進(jìn)行數(shù)據(jù)壓縮和編碼,再由DM9000E以太網(wǎng)控制器發(fā)送至遠(yuǎn)程客戶端,實(shí)現(xiàn)視頻數(shù)據(jù)的網(wǎng)絡(luò)傳輸。1.3ARM監(jiān)控系統(tǒng)所需的硬件及軟件1.3.1硬件配置1.串行接口:一個(gè)五線異步串行口、一個(gè)UART擴(kuò)展接口2.SamsungS3C2440A(CPU處理器)3.在板64MSDRAM4.一個(gè)USBHost接口5.一個(gè)USBSlaveB型接口6.JTAG接口7.USB攝像頭接口8.IIC接口9.DA1961E以太網(wǎng)接口10.USB攝像頭1.3.2軟件配置1.VWware虛擬機(jī)軟件2.linux操作系統(tǒng)2.交叉編譯(cross-compilation)環(huán)境3.linux設(shè)備驅(qū)動(dòng)程序4.bootloader(引導(dǎo)加載程序)第二章ARM監(jiān)控系統(tǒng)實(shí)現(xiàn)步驟及部分截圖2.1在PC機(jī)Windows操作系統(tǒng)下安裝VWware虛擬機(jī)虛擬機(jī)是指通過(guò)軟件模擬的具有完整硬件系統(tǒng)功能,并且能運(yùn)行在一個(gè)完全隔離的環(huán)境中完整的計(jì)算機(jī)系統(tǒng)。通過(guò)虛擬機(jī)軟件,可以在一臺(tái)物理計(jì)算機(jī)上模擬出一臺(tái)或多臺(tái)虛擬的計(jì)算機(jī),這些虛擬機(jī)完全就像真正的計(jì)算機(jī),可以在虛擬機(jī)中安裝操作系統(tǒng)、應(yīng)用程序、也可以通過(guò)虛擬機(jī)訪問(wèn)網(wǎng)絡(luò)資源等等。對(duì)于用戶而言,它只是運(yùn)行在個(gè)人PC上的一個(gè)應(yīng)用程序,而對(duì)于在虛擬機(jī)中運(yùn)行的應(yīng)用程序而言,它就是一臺(tái)真正的計(jì)算機(jī)。安裝宿主機(jī)上的操作系統(tǒng)可以有兩種方式。第一種方式是直接在“裸機(jī)”上安裝FedoraCore10,安裝完成后計(jì)算機(jī)上只有FedoraCore10操作系統(tǒng)。這種方式下FedoraCore10直接操控計(jì)算機(jī)的硬件,系統(tǒng)的任何反應(yīng)都是FedoraCore10的直接反應(yīng)。但是,對(duì)于習(xí)慣Windows的用戶而言,這種方式操作起來(lái)會(huì)有些困難,畢竟FedoraCore10與Windows是兩種完全不同的操作系統(tǒng)。第二鐘方式是現(xiàn)在計(jì)算機(jī)上安裝Windows操作系統(tǒng),再在Windows下安裝虛擬計(jì)算機(jī)軟件,如VWware等,然后在虛擬機(jī)下安裝FedoraCore10。這種方式安裝完成后,F(xiàn)edoraCore10只隸屬于Windows下的一個(gè)軟件,啟動(dòng)虛擬機(jī)之前的所有操作與Windows下的其他操作都是一樣的。鑒于Windows的盛行,本文選擇后一種方式。具體步驟:新建虛擬機(jī)→自定義→workstation6→linux:otherlinux2.6.XKernel→命名該虛擬機(jī)并選擇安裝位置→處理器數(shù)量:1→內(nèi)存大小推薦512M→使用橋接網(wǎng)絡(luò)→I/O適配器的選擇→創(chuàng)建兩個(gè)新的虛擬磁盤→選擇磁盤類型:IDE→設(shè)定磁盤大?。?G/5G→設(shè)定磁盤文件的名字→完成。此事就完成了VMware[12]的安裝。本文以2.6版本的linux為平臺(tái)安裝fedora10操作系統(tǒng),安裝完成后如圖2-2所示:圖2-1安裝虛擬機(jī)圖2-2虛擬機(jī)安裝完成后的界面2.2安裝及配置操作系統(tǒng)FedoraCore10完成虛擬機(jī)安裝后,選擇Linux平臺(tái)開發(fā)工具包中的文本文檔readme并選擇如圖2-3中的兩行粘貼到Redhat9的下載列表中。啟動(dòng)虛擬機(jī),如圖2-4。向虛擬機(jī)中倒入Linux。如圖2-5選擇適當(dāng)linux版本作為目標(biāo)平臺(tái),如圖2-6選擇適當(dāng)虛擬機(jī)內(nèi)存,設(shè)置網(wǎng)絡(luò)為橋接。在虛擬機(jī)設(shè)置完成后會(huì)進(jìn)行l(wèi)inux自動(dòng)安裝,但要終止安裝進(jìn)行其他設(shè)置。在新建一磁盤用于存放數(shù)據(jù)如圖2-7,之后啟動(dòng)虛擬機(jī)進(jìn)行FedoraCore10的安裝。添加所有系統(tǒng)自帶軟件,添加完成后會(huì)出現(xiàn)如圖2-8所示界面。圖2-3選擇位置圖2-4啟動(dòng)虛擬機(jī)界面1.將所需要的工具instsrv.exe和srvany.exe放在一個(gè)文件夾內(nèi),在這我放在d:\tools中吧。2.需要了解vmware.exe的安裝路徑,以本機(jī)為例:D:\VMwareWorkstation\vmware.exe要啟動(dòng)的虛擬機(jī)配置文件路徑,我的2003虛擬機(jī)的配置文件windows2003.vmx的路徑是D:\vmare\windows2003\windowsserver2003.vmx3.新建服務(wù)假設(shè)服務(wù)名為vm_autostart,所以我的命令行是:instsrvVM_AutoStartD:\tools\srvany.exe4.注冊(cè)服務(wù)在注冊(cè)表中,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vm_autostart新建項(xiàng):"Parameters"在"Parameters"項(xiàng)里面,新建字符串"Application",字符串的值:"D:\VMwareWorkstation\vmware.exe"-x"D:\vmare\windows2003\windowsserver2003.vmx"圖2-5選擇linux:otherlinux2.6版本本系統(tǒng)選擇linux:otherlinux2.6版本,如圖2-5,點(diǎn)擊下拉菜單,找到linux:otherlinux2.6版本,選擇該版本。圖2-6設(shè)置虛擬內(nèi)存圖2-6用于設(shè)置虛擬機(jī)管理的磁盤大小。為了給虛擬機(jī)留出足夠的磁盤空間,我們?cè)O(shè)定磁盤大小為20G,設(shè)置情況如圖2-6.注意:內(nèi)存:為虛擬機(jī)設(shè)置的內(nèi)存大小不要小于實(shí)際的物理內(nèi)存大小。圖2-7磁盤分區(qū)圖2-8操作系統(tǒng)安裝完成重新登陸后修改系統(tǒng)文件,如圖2-8圖2-8修改系統(tǒng)文件之后重新登錄進(jìn)行虛擬機(jī)的工具安裝,如圖2-9,以完成FedoraCore10與Windows之間的信息傳遞圖2-9虛擬機(jī)的工具安裝按如圖2-9進(jìn)行FedoraCore10網(wǎng)絡(luò)功能的測(cè)試,測(cè)試完成后出現(xiàn)如圖2-10界面,即完成FedoraCore10的安裝。圖2-9網(wǎng)絡(luò)功能的測(cè)試圖2-10FedoraCore10安裝完成2.3建立交叉編譯環(huán)境交叉編譯是指在某個(gè)主機(jī)平臺(tái)上(比如PC上)生成可在其他平臺(tái)上(比如ARM上)運(yùn)行的可執(zhí)行代碼而要進(jìn)行交叉編譯,就必須要在宿主機(jī)平臺(tái)上安裝對(duì)應(yīng)的交叉編譯工具鏈(crosscompilationtoolchain),然后用安裝好的交叉編譯工具鏈編譯源代碼,最終生成可在目標(biāo)機(jī)上運(yùn)行的可執(zhí)行程序。本系統(tǒng)是在LinuxPC上,使用arm-linux-gcc編譯器,編譯出針對(duì)Linux內(nèi)核的ARM平臺(tái)上的可執(zhí)行文件。下面是建立交叉編譯環(huán)境的步驟:在LinuxPC上,打開終端,使用命令#tarxvfjEABI_4.3.3_EmbedSky_.tar.bz2將下載好的交叉編譯工具解壓,然后使用#gedit/etc/profile打開并修改profile文件,添加如圖2-11的第21句,使用#source/etc/profile使交叉編譯器生效:圖2-11建立交叉編譯環(huán)境2.4移植引導(dǎo)加載程序bootloader(引導(dǎo)加載程序)是系統(tǒng)加電后運(yùn)行的第一段代碼。嵌入式系統(tǒng)中的bootloader相當(dāng)于PC機(jī)中的BIOS。通過(guò)這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。大多數(shù)bootloader都包含兩種不同的操作模式,一種是啟動(dòng)加載(bootloading)模式,在這種模式下,bootloader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)器設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個(gè)過(guò)程并沒有用戶的介入。這種模式是boot-loader的正常工作模式,另一種是下載(downloading)模式。在這種模式下,目標(biāo)機(jī)上的bootloader將通過(guò)串口或網(wǎng)絡(luò)等通信手段從開發(fā)主機(jī)(host)上下載內(nèi)核映像和根文件系統(tǒng)映像等到RAM中。然后可以再被bootloader寫到目標(biāo)機(jī)上的固態(tài)存儲(chǔ)介質(zhì)上。#tarxvfj/mnt/hgfs/Linux/u-boot-1.1.6.tar.bz2-C/解壓u-boot源碼,在U-Boot的頂層目錄的Makefile文件中定義了所有開發(fā)板的配置選項(xiàng),首先應(yīng)該為開發(fā)板添加新的配置選項(xiàng),參照TQ2440的配置,加入如下語(yǔ)句:tq2440_config: unconfig@$(MKCONFIG) $(@:_config=)armarm920ttq2440NULLs3c24x0開發(fā)板配置選項(xiàng)中各項(xiàng)的含義如下:arm:表示CPU的架構(gòu)是ARM體系結(jié)構(gòu)。arm920t:表示CPU的內(nèi)核類型,對(duì)應(yīng)cpu、arm920t子目錄。NULL:這位用于表示開發(fā)商者或經(jīng)銷商。S3c24x0:片上系統(tǒng)定義。使用#maketq2440_config配置u-boot。配置好后使用makeCROSS_COMPILE=arm-linux-命令編譯得到u-boot.bin的鏡像文件,將其燒寫到開發(fā)板。2.5移植linux內(nèi)核嵌入式操作系統(tǒng)Linux用C語(yǔ)言寫成,技術(shù)上說(shuō)Linux是一個(gè)內(nèi)核?!皟?nèi)核”指的是一個(gè)提供硬件抽象層、磁盤及文件系統(tǒng)控制、多任務(wù)等功能的系統(tǒng)軟件。一個(gè)內(nèi)核不是一套完整的操作系統(tǒng)。一套基于Linux內(nèi)核的完整操作系統(tǒng)叫作Linux操作系統(tǒng)Linux內(nèi)核移植:執(zhí)行#tarxvfj/mnt/hgfs/Linux/Linux-.tar.bz2-C/解壓下載好的內(nèi)核文件,其中/mnt/hgfs/Linux是虛擬機(jī)與PC的共享文件。解壓后進(jìn)入到內(nèi)核源碼,修改Makefile文件添加對(duì)ARM的支持,具體如下:ARCH=armCROSS_COMPILE=arm-linux-CC=arm-linux-gcc使用#makemenuconfig命令進(jìn)入配置單添加對(duì)EABI的支持,修改后保存為.config文件,修改完成后執(zhí)行#makezImage編譯內(nèi)核源碼,編譯完成后,在內(nèi)核源碼的arch/arm/boot/目錄下會(huì)生成鏡像文件zImage,將這個(gè)文件燒寫到開發(fā)板。Linux內(nèi)核移植完成后將出現(xiàn)如圖2-12所示界面。圖2-11Linux內(nèi)核移植2.6配置驅(qū)動(dòng)程序TQ2440開發(fā)板支持市面上常見的中芯微芯片的USB攝像頭,當(dāng)接入U(xiǎn)SB攝像頭后。終端會(huì)顯示出如圖2-12信息,同時(shí)在“/dev”目錄下會(huì)出現(xiàn)設(shè)備名“/dev/v4l/video0”但應(yīng)該注意:操作系統(tǒng)Linux使用虛擬文件系統(tǒng)作為統(tǒng)一的操作接口來(lái)處理文件和設(shè)備。與普通的目錄和文件一樣,每個(gè)設(shè)備也使用一個(gè)VF-Sinode來(lái)描述。對(duì)設(shè)備的操作也是通過(guò)對(duì)文件操作的file-operation結(jié)構(gòu)體來(lái)調(diào)用驅(qū)動(dòng)程序的設(shè)備服務(wù)子程序。所以,在進(jìn)行Linux內(nèi)核配置時(shí)應(yīng)修改相應(yīng)設(shè)備管理目錄下的攝像頭文件,使其處于可見狀態(tài)。圖2-12接入U(xiǎn)SB攝像頭后出現(xiàn)的界面攝像頭屬于視頻設(shè)備,在Linux內(nèi)核中,VideoforLinux(簡(jiǎn)稱V4L)是關(guān)于視頻設(shè)備的驅(qū)動(dòng)標(biāo)準(zhǔn)[18]。這個(gè)標(biāo)準(zhǔn)為應(yīng)用程序定義了一系列的接口函數(shù),內(nèi)核、驅(qū)動(dòng)和應(yīng)用程序都是依靠這個(gè)標(biāo)準(zhǔn)來(lái)進(jìn)行交流。攝像頭的I/O控制是依靠V4L提供的read、open、ioctl[19]等應(yīng)用程序接口實(shí)現(xiàn)。在編譯器部分,將Linux下的攝像頭驅(qū)動(dòng)程序中Makefile文件中相關(guān)行修改為CC=/opt/host/armv41/bin/armv41.unknown.gcc.1inux,修改Con-fig.in文件,這樣在配置內(nèi)核的時(shí)候才可以看見驅(qū)動(dòng)程序的名稱。同時(shí)對(duì)下列與處理器相關(guān)的部分進(jìn)行修改,即可實(shí)現(xiàn)對(duì)S3C2440A的USB驅(qū)動(dòng)的移植。在PC的終端執(zhí)行#makemenuconfig命令添加對(duì)ZC301P攝像頭的支持:<*>ZC3XXUSBCameraDriver<*>USBZC301PImagesProcessionandControlChipsupport修改后使用#makezImage重新編譯內(nèi)核鏡像,將內(nèi)核鏡像移植到開發(fā)板。實(shí)現(xiàn)視頻采集后,還需要把采集到的圖像數(shù)據(jù)壓縮后經(jīng)由網(wǎng)絡(luò)傳送出去,所以還要在此基礎(chǔ)上建立基于socket的網(wǎng)絡(luò)服務(wù)器,用來(lái)完成客戶端與服務(wù)器二者之間的數(shù)據(jù)通信。該系統(tǒng)中視頻數(shù)據(jù)的網(wǎng)絡(luò)傳輸是基于TCP協(xié)議來(lái)實(shí)現(xiàn),前端嵌入式機(jī)作為視頻服務(wù)器負(fù)責(zé)視頻采集并建立好TCP服務(wù)器,等待客戶端的連接;客戶端做好一系列初始化工作后,主動(dòng)連接服務(wù)器,得到應(yīng)答后建立連接接收壓縮視頻數(shù)據(jù)并實(shí)時(shí)顯示,同時(shí)可以根據(jù)用戶的要求進(jìn)行實(shí)時(shí)或定時(shí)保存圖像或者視頻文件。最后,在虛擬機(jī)中打開用戶終端,輸入設(shè)備驅(qū)動(dòng)程序后將會(huì)啟動(dòng)攝像頭采集視頻信息,即完成視頻監(jiān)控,如圖2-13所示。圖2-13監(jiān)控系統(tǒng)采集到的視頻信息第三章設(shè)計(jì)總結(jié)通過(guò)歷時(shí)兩周的《生產(chǎn)實(shí)習(xí)》這門課程的學(xué)習(xí),給我最大的感受就是要在老師的指導(dǎo)下學(xué)會(huì)學(xué)習(xí)。剛開始我覺得ARM對(duì)于我們這一組來(lái)說(shuō)純粹是零基礎(chǔ),以前都沒有學(xué)習(xí)過(guò)。但是在我們不斷到圖書館查找相關(guān)知識(shí)和網(wǎng)上學(xué)習(xí)后,我們逐漸學(xué)會(huì)了嵌入式操作系統(tǒng)和TQ2440A的使用,并可以完成視頻監(jiān)控。本文將嵌入式系統(tǒng)技術(shù)應(yīng)用到網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)中,設(shè)計(jì)了一款基于Linux和S3C2440A的低成本的網(wǎng)絡(luò)視頻采集傳輸系統(tǒng),主要完成了arm開發(fā)板外圍電路的設(shè)計(jì);Bootloader的啟動(dòng)分析以及在開發(fā)板上的移植;嵌入式Linux在arm9平臺(tái)上的剪裁和移植;USB攝像頭在Linux下的驅(qū)動(dòng)配置;基于V4L的視頻采集程序的設(shè)計(jì)。服務(wù)器程序和客戶端程序的設(shè)計(jì);實(shí)現(xiàn)了數(shù)據(jù)的網(wǎng)絡(luò)傳輸;對(duì)視頻數(shù)據(jù)進(jìn)行編解碼,并進(jìn)行連續(xù)播放;對(duì)系統(tǒng)在實(shí)驗(yàn)環(huán)境下進(jìn)行整體測(cè)試。Internet的發(fā)展為嵌入式系統(tǒng)的發(fā)展提供了一個(gè)良好的機(jī)會(huì),也提出了許多嚴(yán)峻的挑戰(zhàn)。網(wǎng)絡(luò)能力將會(huì)成為未來(lái)嵌入式系統(tǒng)的必需。各種嵌入式的網(wǎng)絡(luò)應(yīng)用軟件將會(huì)廣泛使用。嵌入式系統(tǒng)的發(fā)展又為嵌入式操作系統(tǒng)的發(fā)展提供動(dòng)力[10]?;贗nternet的視頻圖像傳輸系統(tǒng)現(xiàn)在在各個(gè)領(lǐng)域正發(fā)揮著重要的作用,并有來(lái)越多的廠商投身于這個(gè)領(lǐng)域,隨著視頻壓縮技術(shù)的發(fā)展、網(wǎng)絡(luò)傳輸能力的不斷增強(qiáng),網(wǎng)絡(luò)視頻的優(yōu)越性會(huì)逐步體現(xiàn),相信嵌入式網(wǎng)絡(luò)視頻服務(wù)器的應(yīng)用會(huì)更為廣泛。參考文獻(xiàn)[1]何鵬舉,陳明,段磊強(qiáng),等.基于嵌入式Web服務(wù)器的遠(yuǎn)程視頻監(jiān)控系統(tǒng)[J].測(cè)控技術(shù),2004[2]何梅.JavaApplet編程實(shí)例[M].北京:清華大學(xué)出版社,2003.[3]耿祥義.Java基礎(chǔ)教程[M].北京:清華大學(xué)出版社,2004.[4]劉六彬.嵌入式視頻監(jiān)控系統(tǒng)中Linux應(yīng)用的研究[J].科技廣場(chǎng),2005,2(2):4-7.LIULiu-bin.TheresearchofuClinuxapplicationinembedded-video-system[J].ScienceMosaic,2005,2(2):4-7.[5]陳俊宏.EmbededLinux嵌入式系統(tǒng)原理與實(shí)務(wù)[M].北京:中國(guó)鐵道出版社,2004[6]西剎子.安防天下:智能網(wǎng)絡(luò)視頻監(jiān)控技術(shù)詳解與實(shí)踐[M].北京:清華大學(xué)出版社,2010-02[7]吳明暉.基于ARM的嵌入式系統(tǒng)開發(fā)與應(yīng)用[M].北京:人民郵電出版社,2004[8]段群杰.零基礎(chǔ)學(xué)ARM9嵌入式Linux系統(tǒng)開發(fā)[M].北京:機(jī)械工業(yè)出版社,2010-10[9]程昌南、方強(qiáng).ARMLinux入門與實(shí)踐[M].北京:航空航天大學(xué)出版社,2008-10[10]田榮華、楊健、唐振明.ARM接口編程[M].電子工業(yè)出版社,2012-06[11]達(dá)內(nèi)IT培訓(xùn)集團(tuán).ARM嵌入式系統(tǒng)移植實(shí)戰(zhàn)開發(fā).[M].北京:航空航天大學(xué)出版社,[12]天嵌科技.基于linux的視頻采集[M].2006附錄程序源代碼:mjpg_streamer.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<linux/videodev.h>#include<sys/ioctl.h>#include<errno.h>#include<signal.h>#include<sys/socket.h>#include<arpa/inet.h>#include<sys/types.h>#include<sys/stat.h>#include<getopt.h>#include<pthread.h>#include<dlfcn.h>#include<fcntl.h>#include<syslog.h>#include"utils.h"#include"mjpg_streamer.h"/*globals*/staticglobalsglobal;/******************************************************************************Description.:DisplayahelpmessageInputValue.:argv[0]istheprogramnameandtheparameterprognameReturnValue:-******************************************************************************/voidhelp(char*progname){fprintf(stderr,"\n");fprintf(stderr,"Usage:%s\n"\"-i|--input\"<input-plugin.so>[parameters]\"\n"\"-o|--output\"<output-plugin.so>[parameters]\"\n"\"[-h|--help]:displaythishelp\n"\"[-v|--version]:displayversioninformation\n"\"[-b|--background]...:forktothebackground,daemonmode\n",progname);fprintf(stderr,"\n");fprintf(stderr,"Example#1:\n"\"ToopenanUVCwebcam\"/dev/video1\"andstreamitviaHTTP:\n"\"%s-i\"input_uvc.so-d/dev/video1\"-o\"output_http.so\"\n",progname);fprintf(stderr,"\n");fprintf(stderr,"Example#2:\n"\"ToopenanUVCwebcamandstreamviaHTTPport8090:\n"\"%s-i\"input_uvc.so\"-o\"output_http.so-p8090\"\n",progname);fprintf(stderr,"\n");fprintf(stderr,"Example#3:\n"\"Togethelpforacertaininputplugin:\n"\"%s-i\"input_uvc.so--help\"\n",progname);fprintf(stderr,"\n");fprintf(stderr,"Incasethemodules(=plugins)cannotbefound:\n"\"*Setthedefaultsearchpathforthemoduleswith:\n"\"exportLD_LIBRARY_PATH=/path/to/plugins,\n"\"*orputthepluginsintothe\"/lib/\"or\"/usr/lib\"folder,\n"\"*orinsteadofjustprovidingthepluginfilename,useacomplete\n"\"pathandfilename:\n"\"%s-i\"/path/to/modules/input_uvc.so\"\n",progname);fprintf(stderr,"\n");}/******************************************************************************Description.:pressingCTRL+Csendssignalstothisprocessinsteadofjustkillingitpluginscantidilyshutdownandfreeallocatedressources.Thefunctionprototypeisdefinedbythesystem,becauseitisacallbackfunction.InputValue.:sigtellsuswhichsignalwasreceivedReturnValue:-******************************************************************************/voidsignal_handler(intsig){inti;/*signal"stop"tothreads*/LOG("settingsignaltostop\n");global.stop=1;usleep(1000*1000);/*cleanupthreads*/LOG("forcecancelationofthreadsandcleanupressources\n");global.in.stop();for(i=0;i<global.outcnt;i++){global.out[i].stop(global.out[i].param.id);}usleep(1000*1000);/*closehandlesofinputplugins*/dlclose(&global.in.handle);for(i=0;i<global.outcnt;i++){/*skip=0;DBG("abouttodecrementusagecounterforhandleof%s,id#%02d,handle:%p\n",\global.out[i].plugin,global.out[i].param.id,global.out[i].handle);for(j=i+1;j<global.outcnt;j++){if(global.out[i].handle==global.out[j].handle){DBG("handlesarepointingtothesamedestination(%p==%p)\n",global.out[i].handle,global.out[j].handle);skip=1;}}if(skip){continue;}DBG("closinghandle%p\n",global.out[i].handle);*/dlclose(global.out[i].handle);}DBG("allpluginhandlesclosed\n");pthread_cond_destroy(&global.db_update);pthread_mutex_destroy(&global.db);LOG("done\n");closelog();exit(0);return;}/******************************************************************************Description.:InputValue.:ReturnValue:******************************************************************************/intcontrol(intcommand,char*details){switch(command){caseCONTROL_CMD_RECONFIGURE_INPUT:printf("willreloadinputplugin:%s\n",details);break;default:LOG("unknowncontrolcommandreceived\n");}return0;}/******************************************************************************Description.:InputValue.:ReturnValue:******************************************************************************/intmain(intargc,char*argv[]){char*input="input_uvc.so--resolution640x480--fps5--device/dev/video0";char*output[MAX_OUTPUT_PLUGINS];intdaemon=0,i;size_ttmp=0;output[0]="output_http.so--port8080";global.outcnt=0;global.control=control;/*parameterparsing*/while(1){intoption_index=0,c=0;staticstructoptionlong_options[]=\{{"h",no_argument,0,0},{"help",no_argument,0,0},{"i",required_argument,0,0},{"input",required_argument,0,0},{"o",required_argument,0,0},{"output",required_argument,0,0},{"v",no_argument,0,0},{"version",no_argument,0,0},{"b",no_argument,0,0},{"background",no_argument,0,0},{0,0,0,0}};c=getopt_long_only(argc,argv,"",long_options,&option_index);/*nomoreoptionstoparse*/if(c==-1)break;/*unrecognizedoption*/if(c=='?'){help(argv[0]);return0;}switch(option_index){/*h,help*/case0:case1:help(argv[0]);return0;break;/*i,input*/case2:case3:input=strdup(optarg);break;/*o,output*/case4:case5:output[global.outcnt++]=strdup(optarg);break;/*v,version*/case6:case7:printf("MJPGStreamerVersion:%s\n"\"CompilationDate:%s\n"\"CompilationTime:%s\n",SOURCE_VERSION,__DATE__,__TIME__);return0;break;/*b,background*/case8:case9:daemon=1;break;default:help(argv[0]);return0;}}openlog("MJPG-streamer",LOG_PID|LOG_CONS,LOG_USER);//openlog("MJPG-streamer",LOG_PID|LOG_CONS|LOG_PERROR,LOG_USER);syslog(LOG_INFO,"startingapplication");/*forktothebackground*/if(daemon){LOG("enablingdaemonmode");daemon_mode();}/*initialisetheglobalvariables*/global.stop=0;global.buf=NULL;global.size=0;global.in.plugin=NULL;/*thismutexandtheconditionalvariableareusedtosynchronizeaccesstotheglobalpicturebuffer*/if(pthread_mutex_init(&global.db,NULL)!=0){LOG("couldnotinitializemutexvariable\n");closelog();exit(EXIT_FAILURE);}if(pthread_cond_init(&global.db_update,NULL)!=0){LOG("couldnotinitializeconditionvariable\n");closelog();exit(EXIT_FAILURE);}/*ignoreSIGPIPE(sendbyOSiftransmittingtoclosedTCPsockets)*/signal(SIGPIPE,SIG_IGN);/*registersignalhandlerfor<CTRL>+Cinordertocleanup*/if(signal(SIGINT,signal_handler)==SIG_ERR){LOG("couldnotregistersignalhandler\n");closelog();exit(EXIT_FAILURE);}/**messageslikethefollowingwillonlybevisibleonyourterminal*ifnotrunningindaemonmode*/LOG("MJPGStreamerVersion.:%s\n",SOURCE_VERSION);/*checkifatleastoneoutputpluginwasselected*/if(global.outcnt==0){/*no?Thenusethedefaultplugininstead*/global.outcnt=1;}/*openinputplugin*/tmp=(size_t)(strchr(input,'')-input);global.in.plugin=(tmp>0)?strndup(input,tmp):strdup(input);global.in.handle=dlopen(global.in.plugin,RTLD_LAZY);if(!global.in.handle){LOG("ERROR:couldnotfindinputplugin\n");LOG("Perhapsyouwanttoadjustthesearchpathwith:\n");LOG("#exportLD_LIBRARY_PATH=/path/to/plugin/folder\n");LOG("dlopen:%s\n",dlerror());closelog();exit(EXIT_FAILURE);}global.in.init=dlsym(global.in.handle,"input_init");if(global.in.init==NULL){LOG("%s\n",dlerror());exit(EXIT_FAILURE);}global.in.stop=dlsym(global.in.handle,"input_stop");if(global.in.stop==NULL){LOG("%s\n",dlerror());exit(EXIT_FAILURE);}global.in.run=dlsym(global.in.handle,"input_run");if(global.in.run==NULL){LOG("%s\n",dlerror());exit(EXIT_FAILURE);}/*trytofindoptionalcommand*/global.in.cmd=dlsym(global.in.handle,"input_cmd");global.in.param.parameter_string=strchr(input,'');global.in.param.global=&global;if(global.in.init(&global.in.param)){LOG("input_init()returnvaluesignalstoexit");closelog();exit(0);}/*openoutputplugin*/for(i=0;i<global.outcnt;i++){tmp=(size_t)(strchr(output[i],'')-output[i]);global.out[i].plugin=(tmp>0)?strndup(output[i],tmp):strdup(output[i]);global.out[i].handle=dlopen(global.out[i].plugin,RTLD_LAZY);if(!global.out[i].handle){LOG("ERROR:couldnotfindoutputplugin%s\n",global.out[i].plugin);LOG("Perhapsyouwanttoadjustthesearchpathwith:\n");LOG("#exportLD_LIBRARY_PATH=/path/to/plugin/folder\n");LOG("dlopen:%s\n",dlerror());closelog();exit(EXIT_FAILURE);}global.out[i].init=dlsym(global.out[i].handle,"output_init");if(global.out[i].init==NULL){LOG("%s\n",dlerror());exit(EXIT_FAILURE);}global.out[i].stop=dlsym(global.out[i].handle,"output_stop");if(global.out[i].stop==NULL){LOG("%s\n",dlerror());exit(EXIT_FAILURE);}global.out[i].run=dlsym(global.out[i].handle,"output_run");if(global.out[i].run==NULL){LOG("%s\n",dlerror());exit(EXIT_FAILURE);}/*trytofindoptionalcommand*/global.out[i].cmd=dlsym(global.out[i].handle,"output_cmd");global.out[i].param.parameter_string=strchr(output[i],'');global.out[i].param.global=&global;global.out[i].param.id=i;if(global.out[i].init(&global.out[i].param)){LOG("output_init()returnvaluesignalstoexit");closelog();exit(0);}}/*starttoreadtheinput,pushpicturesintoglobalbuffer*/DBG("startinginputplugin\n");syslog(LOG_INFO,"startinginputplugin");if(global.in.run()){LOG("cannotruninputplugin\n");closelog();return1;}DBG("starting%doutputplugin(s)\n",global.outcnt);for(i=0;i<global.outcnt;i++){syslog(LOG_INFO,"startingoutputplugin:%s(ID:%02d)",global.out[i].plugin,global.out[i].param.id);global.out[i].run(global.out[i].param.id);}/*waitforsignals*/pause();return0;}基于C8051F單片機(jī)直流電動(dòng)機(jī)反饋控制系統(tǒng)的設(shè)計(jì)與研究基于單片機(jī)的嵌入式Web服務(wù)器的研究MOTOROLA單片機(jī)MC68HC(8)05PV8/A內(nèi)嵌EEPROM的工藝和制程方法及對(duì)良率的影響研究基于模糊控制的電阻釬焊單片機(jī)溫度控制系統(tǒng)的研制基于MCS-51系列單片機(jī)的通用控制模塊的研究基于單片機(jī)實(shí)現(xiàn)的供暖系統(tǒng)最佳啟停自校正(STR)調(diào)節(jié)器單片機(jī)控制的二級(jí)倒立擺系統(tǒng)的研究基于增強(qiáng)型51系列單片機(jī)的TCP/IP協(xié)議棧的實(shí)現(xiàn)基于單片機(jī)的蓄電池自動(dòng)監(jiān)測(cè)系統(tǒng)基于32位嵌入式單片機(jī)系統(tǒng)的圖像采集與處理技術(shù)的研究基于單片機(jī)的作物營(yíng)養(yǎng)診斷專家系統(tǒng)的研究基于單片機(jī)的交流伺服電機(jī)運(yùn)動(dòng)控制系統(tǒng)研究與開發(fā)基于單片機(jī)的泵管內(nèi)壁硬度測(cè)試儀的研制基于單片機(jī)的自動(dòng)找平控制系統(tǒng)研究基于C8051F040單片機(jī)的嵌入式系統(tǒng)開發(fā)基于單片機(jī)的液壓動(dòng)力系統(tǒng)狀態(tài)監(jiān)測(cè)儀開發(fā)模糊Smith智能控制方法的研究及其單片機(jī)實(shí)現(xiàn)一種基于單片機(jī)的軸快流CO〈,2〉激光器的手持控制面板的研制基于雙單片機(jī)沖床數(shù)控系統(tǒng)的研究基于CYGNAL單片機(jī)的在線間歇式濁度儀的研制基于單片機(jī)的噴油泵試驗(yàn)臺(tái)控制器的研制基于單片機(jī)的軟起動(dòng)器的研究和設(shè)計(jì)基于單片機(jī)控制的高速快走絲電火花線切割機(jī)床短循環(huán)走絲方式研究基于單片機(jī)的機(jī)電產(chǎn)品控制系統(tǒng)開發(fā)基于PIC單片機(jī)的智能手機(jī)充電器基于單片機(jī)的實(shí)時(shí)內(nèi)核設(shè)計(jì)及其應(yīng)用研究基于單片機(jī)的遠(yuǎn)程抄表系統(tǒng)的設(shè)計(jì)與研究基于單片機(jī)的煙氣二氧化硫濃度檢測(cè)儀的研制基于微型光譜儀的單片機(jī)系統(tǒng)單片機(jī)系統(tǒng)軟件構(gòu)件開發(fā)的技術(shù)研究基于單片機(jī)的液體點(diǎn)滴速度自動(dòng)檢測(cè)儀的研制基于單片機(jī)系統(tǒng)的多功能溫度測(cè)量?jī)x的研制基于PIC單片機(jī)的電能采集終端的設(shè)計(jì)和應(yīng)用基于單片機(jī)的光纖光柵解調(diào)儀的研制氣壓式線性摩擦焊機(jī)單片機(jī)控制系統(tǒng)的研制基于單片機(jī)的數(shù)字磁通門傳感器基于單片機(jī)的旋轉(zhuǎn)變壓器-數(shù)字轉(zhuǎn)換器的研究基于單片機(jī)的光纖Bragg光柵解調(diào)系統(tǒng)的研究單片機(jī)控制的便攜式多功能乳腺治療儀的研制基于C8051F020單片機(jī)的多生理信號(hào)檢測(cè)儀基于單片機(jī)的電機(jī)運(yùn)動(dòng)控制系統(tǒng)設(shè)計(jì)Pico專用單片機(jī)核的可測(cè)性設(shè)計(jì)研究基于MCS-51單片機(jī)的熱量計(jì)基于雙單片機(jī)的智能遙測(cè)微型氣象站MCS-51單片機(jī)構(gòu)建機(jī)器人的實(shí)踐研究基于單片機(jī)的輪軌力檢測(cè)基于單片機(jī)的GPS定位儀的研究與實(shí)現(xiàn)基于單片機(jī)的電液伺服控制系統(tǒng)用于單片機(jī)系統(tǒng)的MMC卡文件系統(tǒng)研制基于單片機(jī)的時(shí)控和計(jì)數(shù)系統(tǒng)性能優(yōu)化的研究基于單片機(jī)和CPLD的粗光柵位移測(cè)量系統(tǒng)研究單片機(jī)控制的后備式方波UPS提升高職學(xué)生單片機(jī)應(yīng)用能力的探究基于單片機(jī)控制的自動(dòng)低頻減載裝置研究基于單片機(jī)控制的水下焊接電源的研究基于單片機(jī)的多通道數(shù)據(jù)采集系統(tǒng)基于uPSD3234單片機(jī)的氚表面污染測(cè)量?jī)x的研制基于單片機(jī)的紅外測(cè)油儀的研究96系列單片機(jī)仿真器研究與設(shè)計(jì)基于單片機(jī)的單晶金剛石刀具刃磨設(shè)備的數(shù)控改造基于單片機(jī)的溫度智能控制系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)基于MSP430單片機(jī)的電梯門機(jī)控制器的研制基于單片機(jī)的氣體測(cè)漏儀的研究基于三菱M16C/6N系列單片機(jī)的CAN/USB協(xié)議轉(zhuǎn)換器基于單片機(jī)和DSP的變壓器油色譜在線監(jiān)測(cè)技術(shù)研究基于單片機(jī)的膛壁溫度報(bào)警系統(tǒng)設(shè)計(jì)基于AVR單片機(jī)的低壓無(wú)功補(bǔ)償控制器的設(shè)計(jì)基于單片機(jī)船舶電力推進(jìn)電機(jī)監(jiān)測(cè)系統(tǒng)基于單片機(jī)網(wǎng)絡(luò)的振動(dòng)信號(hào)的采集系統(tǒng)基于單片機(jī)的大容量數(shù)據(jù)存儲(chǔ)技術(shù)的應(yīng)用研究基于單片機(jī)的疊圖機(jī)研究與教學(xué)方法實(shí)踐基于單片機(jī)嵌入式Web服務(wù)器技術(shù)的研究及實(shí)現(xiàn)基于AT89S52單片機(jī)的通用數(shù)據(jù)采集系統(tǒng)基于單片機(jī)的多道脈沖幅度分析儀研究機(jī)器人旋轉(zhuǎn)電弧傳感角焊縫跟蹤單片機(jī)控制系統(tǒng)基于單片機(jī)的控制系統(tǒng)在PLC虛擬教學(xué)實(shí)驗(yàn)中的應(yīng)用研究基于單片機(jī)系統(tǒng)的網(wǎng)絡(luò)通信研究與應(yīng)用\
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)代理合同范本
- 石頭承包運(yùn)輸合同范本
- 銷售臥式機(jī)床合同范本
- 分期借款還款合同范本
- 擺攤食品進(jìn)貨合同范本
- 商場(chǎng)房租合同范本
- 施工合同范本
- 服裝外賣采購(gòu)合同范本
- 中小學(xué)-垃圾分類 2-課件
- 2025租房合同簡(jiǎn)單版范文
- 2023年南通市特殊教育崗位教師招聘考試筆試題庫(kù)及答案解析
- GB/T 3810.2-2016陶瓷磚試驗(yàn)方法第2部分:尺寸和表面質(zhì)量的檢驗(yàn)
- 脊柱CT診斷醫(yī)學(xué)課件
- GB/T 23861-2009婚姻介紹服務(wù)
- 電鑄成型1(上課8)
- GA 38-2021銀行安全防范要求
- 翻譯中的形合與意合課件
- 恐懼-回避理論模型
- 營(yíng)養(yǎng)醫(yī)師及營(yíng)養(yǎng)科工作解讀課件
- DB13T 5461-2021 連翹種子種苗質(zhì)量標(biāo)準(zhǔn)
- Q∕SY 04797-2020 燃油加油機(jī)應(yīng)用規(guī)范
評(píng)論
0/150
提交評(píng)論