<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于Linux和S3C2410的嵌入式圖象傳輸系統設計

基于Linux和S3C2410的嵌入式圖象傳輸系統設計

——
作者:楊暉 胡永健 林志泉 時(shí)間:2007-06-25 來(lái)源:微計算機信息 收藏
1 引言

  如何更好的獲得監控現場(chǎng)的圖象數據一直是棘手的一個(gè)問(wèn)題,傳統的方法是采用CCD攝象機獲取現場(chǎng)的視頻信息,這種方法易于實(shí)現,但成本較高。隨著(zhù)ARM系列處理器應用的越來(lái)越廣和基于linux的嵌入式技術(shù)的迅速發(fā)展,利用linux自身帶有的TCP/IP協(xié)議來(lái)實(shí)現遠程監控、圖象傳輸已成為可能。本文提出的正是一種這樣的方法,利用市場(chǎng)上很常見(jiàn)的中星微系列的USB攝象頭來(lái)得到現場(chǎng)的圖象數據,利用linux內核中的Video4Linux編程接口函數采集圖象,并把得到的圖象通過(guò)Internet傳輸到上位機PC上,在PC上實(shí)現圖象的保存和顯示。

  2 硬件系統設計原理

  系統的硬件功能框圖如圖1所示,CPU采用的是三星公司的S3C2410。該處理器內部集成了A R M 公司A R M 9 2 0 T 處理器核的3 2 位微控制器,并帶有獨立的16KB的指令Cache 和16KB的數據Cache、L C D 控制器、R A M 控制器、NAND 閃存控制器、3路UART、4路DMA 、4路帶PWM 的Timer、并行I/O口、8路10位ADC、觸摸屏接口、I2C接口、I2S接口、2

 
個(gè)U S B 接口控制器、2路SPI,主頻最高可達203MHZ。在此基礎上,平臺還進(jìn)行了相應的配置和擴展,配置了4MB16位的Flash和8MB32位的SDRAM,通過(guò)以太網(wǎng)控制芯片DM9000E擴展了一個(gè)網(wǎng)口。引出了一個(gè)UART接口,通過(guò)RS232可以和宿主機做串口通訊。并引出了一個(gè)HOST USB接口,通過(guò)在USB接口上外接一個(gè)帶USB的攝象頭將采集到的圖象數據放入輸入緩沖區中。對緩沖區的數據進(jìn)行處理,最后通過(guò)網(wǎng)口發(fā)送到Internet上,在PC上保存和接收。

S3C2410系統平臺的硬件功能框圖

圖 1  S3C2410系統平臺的硬件功能框圖

  3 軟件系統設計

  本文的軟件系統設計采用C/S(客戶(hù)機/服務(wù)器)模式,以S3C2410平臺作為服務(wù)器,以PC作為客戶(hù)端。服務(wù)器的主要任務(wù)是把得到的圖象數據發(fā)送到Internet上去,客戶(hù)端的任務(wù)主要是從Internet上接收得到的數據,并把數據以保存成文件。下面分別討論兩者的具體實(shí)現。

  3.1 服務(wù)器端軟件系統設計

  3.1.1 建立宿主機開(kāi)發(fā)環(huán)境

  本文以PC為宿主機,并帶有RedHat9.0系統,開(kāi)發(fā)環(huán)境就建立在這個(gè)平臺上,其主要包括:交叉編譯器的的選擇和安裝、NFS和TFTP服務(wù)器的配置等。

  對于嵌入式系統的開(kāi)發(fā),由于沒(méi)有足夠的資源在目標板上運行開(kāi)發(fā)工具和調試工具,所以通常采用交叉編譯調試的方式。開(kāi)發(fā)時(shí)使用宿主機上的交叉編譯、匯編及連接工具形成可執行的二進(jìn)制代碼。然后把可執行文件下載到目標機上運行。本文采用的交叉編譯器為arm-linux-gcc,具體安裝不再贅述。為了方便調試和下載燒寫(xiě),可讓宿主機支持NFS和TFTP服務(wù)器。需要特別說(shuō)明的是為了支持TFTP服務(wù)器需要在安裝RedHat9.0時(shí)須選擇完全安裝,如果沒(méi)有選擇完全安裝,需要將第三張光盤(pán)里面的tftp-server-0.32-4.i386.rpm和tftp-0.32-4.i386.rpm安裝到宿主機下。

  3.1.2 攝象頭驅動(dòng)程序的實(shí)現

  系統采用的是最普通的USB攝像頭,主芯片為中星微ZC0301P。這種攝象頭的一個(gè)特點(diǎn)是可以實(shí)現硬件JPEG編碼。其驅動(dòng)程序的編寫(xiě)重點(diǎn)包括下面的內容:提供基本的I/O 操作接口函數open、read、write、close的實(shí)現、對中斷的處理實(shí)現、內存映射功能以及對I/O 通道的控制接口函數ioctl的實(shí)現等,并把它們定義在struct file_operations中。這樣當應用程序對設備文件進(jìn)行諸如open、close、read、write等系統調用操作時(shí),Linux內核將通過(guò)file_operations結構訪(fǎng)問(wèn)驅動(dòng)程序提供的函數。

  當然,現在網(wǎng)上已經(jīng)有了這種攝象頭的通用驅動(dòng),可以從相關(guān)網(wǎng)站 下載usb-2.4.31.patch.gz,然后將這個(gè)補丁打到內核對應的位置即可。但是對有些內核版本的linux系統,在打補丁時(shí),會(huì )產(chǎn)生Config.in.rej和Makefile.rej。這時(shí)只需要將這兩個(gè)文件中修改失敗的部分手動(dòng)添加到對應的Config.in和Makefile中去就可以了。

3.1.3 linux內核配置

  對于已經(jīng)做過(guò)基本移植的linux在配置內核的時(shí)有以下幾個(gè)方面是值得注意的:

  1)        因為要用到內核中的Video4Linux編程接口函數,所以在配置內核時(shí)首先必須選中Video for Linux并且最好是直接編譯進(jìn)內核而不用編譯成模塊的形式再加載;

       2)        要選中USB Support、OHCI、UHCI。并在USB Support下的USB Multimedia devices  中選中對應的攝象頭,對本系統來(lái)說(shuō),選擇USB SPCA5XX Sunplus Vimicro Sonix Cameras,并把它配置成Module。

  3)        配置完內核后做make dep, make zImage, make module。則在對應的spca5xx目錄下會(huì )生成spc5xx..o,可以把spc5xx..o通過(guò)NFS mount到目標板上或者加到主文件系統ramdisk中的某個(gè)目錄下。然后在目標板上做 insmod spca5xx.o就會(huì )找到攝象頭。

  3.1.4 服務(wù)器端應用程序的編寫(xiě)

  完成驅動(dòng)程序和內核配置后就開(kāi)始應用程序的編寫(xiě)了,程序首先用交叉編譯器在宿主機上進(jìn)行編譯連接,生成的的可執行文件通過(guò)NFS mount到目標板上進(jìn)行調試。調試成功后再

 
固化到文件系統ramdisk中去。其實(shí)現主要有下面幾個(gè)步驟:

  1)        初始化設備基本信息

  2)        打開(kāi)設備文件,讀取設備基本信息和信號源基本信息,并設置video_mmap并為定義的幀結構分配緩沖區并初始化線(xiàn)程互斥量

  3)        創(chuàng )建圖象獲取的線(xiàn)程。該線(xiàn)程函數實(shí)現以?xún)却嬗吧涞姆绞阶x取設備中的數據,鎖定線(xiàn)程互斥量,接著(zhù)對幀結構的各個(gè)元素賦值。并解鎖互斥量。使該過(guò)程做一個(gè)死循環(huán)。

  4)        創(chuàng )建一個(gè)基于連接的socket,并綁定到一個(gè)端口上,開(kāi)始在該端口上偵聽(tīng)。

  5)        當有連接到來(lái)時(shí),創(chuàng )建一個(gè)圖象發(fā)送的線(xiàn)程。該線(xiàn)程函數實(shí)現:如果確定讀取了客戶(hù)端的數據,則把緩沖區內的一幀數據發(fā)送到網(wǎng)絡(luò )上。讓這個(gè)過(guò)程也為死循環(huán)。

  6)        控制兩個(gè)線(xiàn)程的同步

  7)        如果程序退出,則關(guān)閉套接字,釋放分配的資源。

  可以看出,程序的內容主要有三個(gè)部分:圖象采集部分,圖象的網(wǎng)絡(luò )發(fā)送部分和程序的多線(xiàn)程控制部分。下面分別介紹一下這三個(gè)部分主要涉及的內容。

  在圖象采集部分,定義了一個(gè)數據結構,它的主要成員變量有:

  l         Video_capability 包含基本的設備信息(設備名稱(chēng)、支持的最大最小分辨率、信號源信息)

  l         video_channel         關(guān)于各個(gè)信號源的屬性

  l         video_mbuf         利用mmap進(jìn)行映射的幀的信息

  l         video_buffer         最底層對buffer的描述

  l         video_mmap         用于mmap

  l         pthread_mutex_t      線(xiàn)程互斥量

截取圖象方法有兩種:直接讀取設備文件和內存影射的方法,本文采用后面一種。采用這種方法后,普通文件被映射到內存地址空間,進(jìn)程可以象訪(fǎng)問(wèn)普通文件一樣訪(fǎng)問(wèn)內存,這樣做的一個(gè)好處是可以提高效率。做視頻截取的兩個(gè)主要函數是:

  n         ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap))   若調用成功,開(kāi)始一副圖象的截取。是否截取完畢留給VIDIOCSYNC來(lái)判斷。

  n         ioctl(vd->fd, VIDIOCSYNC, &frame)              若調用成功,表明一幀截取已完成??梢蚤_(kāi)始做下一次截取

  對于網(wǎng)絡(luò )發(fā)送部分,主要是linux下的socket編程,調用的主要函數有:創(chuàng )建套接字函數socket、端口綁定函數bind、監聽(tīng)

函數listen、等到連接函數accept、數據接收函數read、數據發(fā)送函數write等。這些函數的具體定義和用法具體可以查閱相關(guān)資料 。需要說(shuō)明的是為了能夠正確發(fā)送一幀數據,要把定義的幀的結構體設置為單字節對齊,具體方法是在結構體的定義后面加上_attribute_((packed))。

  多線(xiàn)程編程部分用到的主要函數有:互斥量初始化函數pthread_mutex_init、互斥量鎖定函數pthread_mutex_lock、互斥量解鎖函數pthread_mutex_unlock、互斥量注銷(xiāo)函數pthread_ mutex _destroy、線(xiàn)程創(chuàng )建函數pthread _ create、線(xiàn)程同步函數pthread_join。此外,程序中為了能更好的實(shí)現兩個(gè)進(jìn)程的同步,還需要用到信號量機制的一些內容。受篇幅所限,這些函數的具體定義和用法請參考相關(guān)資料 。

  3.2 客戶(hù)機端軟件系統設計

  客戶(hù)端是建立在一臺PC機上,用Visual C++ 6.0設計一個(gè)基于MFC的界面作為接收端。在接收端主要完成從網(wǎng)絡(luò )緩沖區內讀取數據,并保存成文件的形式,文件以接收到數據的時(shí)間為名。圖2為圖象采集時(shí)間間隔為1秒時(shí)程序執行的結果。圖象大小為320 象素。需要說(shuō)明的是:服務(wù)器端發(fā)送的數據采用了單字節對齊,對應的在客戶(hù)端接收的時(shí)候也要采用單字節對齊。在WINDOWS下實(shí)現內存單字節對齊的方法是在定義的幀結構體前面加上#pragma pack (1),并在其定義之后加上#pragma pack ()。

 

客戶(hù)端程序執行結果

 圖2 客戶(hù)端程序執行結果(1秒種采集一次圖象)

  4 結束語(yǔ)

  本文提出了一套基于S3C2410平臺和linux系統的嵌入式圖象采集、傳輸系統的具體實(shí)現,并給出了實(shí)驗結果。實(shí)驗結果證明:系統很好的完成了圖象采集和傳輸。得到的圖象清晰。服務(wù)器可以穩定運行,不會(huì )發(fā)生斷開(kāi)或退出的現象。本系統可應用于工業(yè)現場(chǎng)的監控,也可以與其他系統如門(mén)禁系統相結合獲得門(mén)開(kāi)或關(guān)時(shí)現場(chǎng)的重要圖象數據。

  參考文獻

  [1] Alessandro Rubini著(zhù) LISOLEG譯,linux設備驅動(dòng)程序開(kāi)發(fā),中國電力出版社,2002

  [2] 喬曉丹張鵬,一個(gè)基于Linux操作系統的嵌入式網(wǎng)關(guān)的實(shí)現,微計算機信息,2005年第21卷第7-2期

  [3] 朱剛 等,Linux網(wǎng)絡(luò )編程,科學(xué)出版社,2000.

  [4] 于明儉 等,linux程序設計權威指南 機械工業(yè)出版社 2001.

  [5] http://mxhaard.free.fr/embedded.html



關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>