版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《专业实训》课程设计论文-33-基于ARM9视频监控系统的设计摘要:本文首先综合论述什么是ARM9监控系统,接着阐述实现ARM9监控系统的原理及实现ARM9监控系统所需的硬件及软件。其次,列出实现的具体步骤和部分截图。最后附录部分重要源代码。关键词:VMware虚拟机Linux操作系统交叉编译TQ2440开发板第一章ARM监控系统简述1.1什么是ARM监控系统ARM9监控系统是一种典型的嵌入式系统。嵌入式操作系统(EmbeddedOperatingSystem,简称:EOS)是指用于嵌入式系统的操作系统。嵌入式操作系统是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。嵌入式操作系统负责嵌入式系统的全部软、硬件资源的分配、任务调度,控制、协调并发活动。它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。目前在嵌入式领域广泛使用的操作系统有:嵌入式Linux、WindowsEmbedded、VxWorks等,以及应用在智能手机和平板电脑的Android、iOS等。在嵌入式领域中广泛应用的是ARM系列的处理器,ARM公司引发了嵌人式领域的一场革命,在低功耗、低成本的嵌入式应用领域确立了其市场领导地位,是目前32位市场中使用最广泛的微处理器。以ARM为架构的嵌入式技术具有非常广阔的前景。在ARM微处理器平台上移植嵌入式Linux操作系统,完成视频采集任务,并以服务器方式将图像发送到网络,从而实现远程监控。系统以ARM9微处理器AT91RM9200为主处理器,采用普通USB摄像头作为图像采集设备,构建了一种可靠性好、价格低廉和使用方便的网络视频监控系统。视频监控系统由实时控制系统、监视系统和管理信息系统三部分组成。仅发展了短短二十几年时间,从19世代80年代的第一代模拟监控到第二代基于“PC+多媒体卡”的数字式视频监控系统再到第三代完全基于IP的网络视频监控系统,就发生了翻天覆地变化。本系统基于ARM9处理器和嵌入式Linux操作系统,利用USB接口摄像头实现数字图像采集任务。1.2ARM监控系统实现原理如图1-1为ARM监控系统整体设计原理框图NANDFLASHNANDFLASHSDRAM 以太网USB摄像头以太网USB摄像头DA9161E接口USB控制器MCU单元S3C2440A MCU单元 S3C2440A RS232RS232串口PC机PC机图1-1ARM监控系统整体设计原理框图视频监控系统是安全防范系统的组成部分,它是一种防范能力较强的综合系统。视频监控以其直观、方便、信息内容丰富而广泛应用于许多场合。嵌入式视频监控系统是以应用为中心、软硬件可裁减的、适应应用系统对功能、可靠性、成本、体积等综合性严格要求的专用计算机系统,亦即为监控系统量体裁衣的专用计算机系统。嵌入式视频监控系统主要由嵌入式处理器、相关支撑硬件、嵌入式操作系统及应用软件系统等组成,它是集软硬件于一体的可独立工作的“器件”。在视频监控上的嵌入式应用将是视频监控领域的一个重要发展方向。该系统的处理器采用的是三星公司的ARM9芯片S3C2440,它采用ARM920T内核的32位处理器。主频为400MHz,最高可频率可达到533MHz,通过在目标机上运行Linux操作系统,搭建嵌入式视频服务器,接收摄像头采集的视频数据,进行数据压缩和编码,再由DM9000E以太网控制器发送至远程客户端,实现视频数据的网络传输。1.3ARM监控系统所需的硬件及软件1.3.1硬件配置1.串行接口:一个五线异步串行口、一个UART扩展接口2.SamsungS3C2440A(CPU处理器)3.在板64MSDRAM4.一个USBHost接口5.一个USBSlaveB型接口6.JTAG接口7.USB摄像头接口8.IIC接口9.DA1961E以太网接口10.USB摄像头1.3.2软件配置1.VWware虚拟机软件2.linux操作系统2.交叉编译(cross-compilation)环境3.linux设备驱动程序4.bootloader(引导加载程序)第二章ARM监控系统实现步骤及部分截图2.1在PC机Windows操作系统下安装VWware虚拟机虚拟机是指通过软件模拟的具有完整硬件系统功能,并且能运行在一个完全隔离的环境中完整的计算机系统。通过虚拟机软件,可以在一台物理计算机上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机,可以在虚拟机中安装操作系统、应用程序、也可以通过虚拟机访问网络资源等等。对于用户而言,它只是运行在个人PC上的一个应用程序,而对于在虚拟机中运行的应用程序而言,它就是一台真正的计算机。安装宿主机上的操作系统可以有两种方式。第一种方式是直接在“裸机”上安装FedoraCore10,安装完成后计算机上只有FedoraCore10操作系统。这种方式下FedoraCore10直接操控计算机的硬件,系统的任何反应都是FedoraCore10的直接反应。但是,对于习惯Windows的用户而言,这种方式操作起来会有些困难,毕竟FedoraCore10与Windows是两种完全不同的操作系统。第二钟方式是现在计算机上安装Windows操作系统,再在Windows下安装虚拟计算机软件,如VWware等,然后在虚拟机下安装FedoraCore10。这种方式安装完成后,FedoraCore10只隶属于Windows下的一个软件,启动虚拟机之前的所有操作与Windows下的其他操作都是一样的。鉴于Windows的盛行,本文选择后一种方式。具体步骤:新建虚拟机→自定义→workstation6→linux:otherlinux2.6.XKernel→命名该虚拟机并选择安装位置→处理器数量:1→内存大小推荐512M→使用桥接网络→I/O适配器的选择→创建两个新的虚拟磁盘→选择磁盘类型:IDE→设定磁盘大小:8G/5G→设定磁盘文件的名字→完成。此事就完成了VMware[12]的安装。本文以2.6版本的linux为平台安装fedora10操作系统,安装完成后如图2-2所示:图2-1安装虚拟机图2-2虚拟机安装完成后的界面2.2安装及配置操作系统FedoraCore10完成虚拟机安装后,选择Linux平台开发工具包中的文本文档readme并选择如图2-3中的两行粘贴到Redhat9的下载列表中。启动虚拟机,如图2-4。向虚拟机中倒入Linux。如图2-5选择适当linux版本作为目标平台,如图2-6选择适当虚拟机内存,设置网络为桥接。在虚拟机设置完成后会进行linux自动安装,但要终止安装进行其他设置。在新建一磁盘用于存放数据如图2-7,之后启动虚拟机进行FedoraCore10的安装。添加所有系统自带软件,添加完成后会出现如图2-8所示界面。图2-3选择位置图2-4启动虚拟机界面1.将所需要的工具instsrv.exe和srvany.exe放在一个文件夹内,在这我放在d:\tools中吧。2.需要了解vmware.exe的安装路径,以本机为例:D:\VMwareWorkstation\vmware.exe要启动的虚拟机配置文件路径,我的2003虚拟机的配置文件windows2003.vmx的路径是D:\vmare\windows2003\windowsserver2003.vmx3.新建服务假设服务名为vm_autostart,所以我的命令行是:instsrvVM_AutoStartD:\tools\srvany.exe4.注册服务在注册表中,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vm_autostart新建项:"Parameters"在"Parameters"项里面,新建字符串"Application",字符串的值:"D:\VMwareWorkstation\vmware.exe"-x"D:\vmare\windows2003\windowsserver2003.vmx"图2-5选择linux:otherlinux2.6版本本系统选择linux:otherlinux2.6版本,如图2-5,点击下拉菜单,找到linux:otherlinux2.6版本,选择该版本。图2-6设置虚拟内存图2-6用于设置虚拟机管理的磁盘大小。为了给虚拟机留出足够的磁盘空间,我们设定磁盘大小为20G,设置情况如图2-6.注意:内存:为虚拟机设置的内存大小不要小于实际的物理内存大小。图2-7磁盘分区图2-8操作系统安装完成重新登陆后修改系统文件,如图2-8图2-8修改系统文件之后重新登录进行虚拟机的工具安装,如图2-9,以完成FedoraCore10与Windows之间的信息传递图2-9虚拟机的工具安装按如图2-9进行FedoraCore10网络功能的测试,测试完成后出现如图2-10界面,即完成FedoraCore10的安装。图2-9网络功能的测试图2-10FedoraCore10安装完成2.3建立交叉编译环境交叉编译是指在某个主机平台上(比如PC上)生成可在其他平台上(比如ARM上)运行的可执行代码而要进行交叉编译,就必须要在宿主机平台上安装对应的交叉编译工具链(crosscompilationtoolchain),然后用安装好的交叉编译工具链编译源代码,最终生成可在目标机上运行的可执行程序。本系统是在LinuxPC上,使用arm-linux-gcc编译器,编译出针对Linux内核的ARM平台上的可执行文件。下面是建立交叉编译环境的步骤:在LinuxPC上,打开终端,使用命令#tarxvfjEABI_4.3.3_EmbedSky_.tar.bz2将下载好的交叉编译工具解压,然后使用#gedit/etc/profile打开并修改profile文件,添加如图2-11的第21句,使用#source/etc/profile使交叉编译器生效:图2-11建立交叉编译环境2.4移植引导加载程序bootloader(引导加载程序)是系统加电后运行的第一段代码。嵌入式系统中的bootloader相当于PC机中的BIOS。通过这段小程序,我们可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。大多数bootloader都包含两种不同的操作模式,一种是启动加载(bootloading)模式,在这种模式下,bootloader从目标机上的某个固态存储器设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是boot-loader的正常工作模式,另一种是下载(downloading)模式。在这种模式下,目标机上的bootloader将通过串口或网络等通信手段从开发主机(host)上下载内核映像和根文件系统映像等到RAM中。然后可以再被bootloader写到目标机上的固态存储介质上。#tarxvfj/mnt/hgfs/Linux/u-boot-1.1.6.tar.bz2-C/解压u-boot源码,在U-Boot的顶层目录的Makefile文件中定义了所有开发板的配置选项,首先应该为开发板添加新的配置选项,参照TQ2440的配置,加入如下语句:tq2440_config: unconfig@$(MKCONFIG) $(@:_config=)armarm920ttq2440NULLs3c24x0开发板配置选项中各项的含义如下:arm:表示CPU的架构是ARM体系结构。arm920t:表示CPU的内核类型,对应cpu、arm920t子目录。NULL:这位用于表示开发商者或经销商。S3c24x0:片上系统定义。使用#maketq2440_config配置u-boot。配置好后使用makeCROSS_COMPILE=arm-linux-命令编译得到u-boot.bin的镜像文件,将其烧写到开发板。2.5移植linux内核嵌入式操作系统Linux用C语言写成,技术上说Linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统Linux内核移植:执行#tarxvfj/mnt/hgfs/Linux/Linux-.tar.bz2-C/解压下载好的内核文件,其中/mnt/hgfs/Linux是虚拟机与PC的共享文件。解压后进入到内核源码,修改Makefile文件添加对ARM的支持,具体如下:ARCH=armCROSS_COMPILE=arm-linux-CC=arm-linux-gcc使用#makemenuconfig命令进入配置单添加对EABI的支持,修改后保存为.config文件,修改完成后执行#makezImage编译内核源码,编译完成后,在内核源码的arch/arm/boot/目录下会生成镜像文件zImage,将这个文件烧写到开发板。Linux内核移植完成后将出现如图2-12所示界面。图2-11Linux内核移植2.6配置驱动程序TQ2440开发板支持市面上常见的中芯微芯片的USB摄像头,当接入USB摄像头后。终端会显示出如图2-12信息,同时在“/dev”目录下会出现设备名“/dev/v4l/video0”但应该注意:操作系统Linux使用虚拟文件系统作为统一的操作接口来处理文件和设备。与普通的目录和文件一样,每个设备也使用一个VF-Sinode来描述。对设备的操作也是通过对文件操作的file-operation结构体来调用驱动程序的设备服务子程序。所以,在进行Linux内核配置时应修改相应设备管理目录下的摄像头文件,使其处于可见状态。图2-12接入USB摄像头后出现的界面摄像头属于视频设备,在Linux内核中,VideoforLinux(简称V4L)是关于视频设备的驱动标准[18]。这个标准为应用程序定义了一系列的接口函数,内核、驱动和应用程序都是依靠这个标准来进行交流。摄像头的I/O控制是依靠V4L提供的read、open、ioctl[19]等应用程序接口实现。在编译器部分,将Linux下的摄像头驱动程序中Makefile文件中相关行修改为CC=/opt/host/armv41/bin/armv41.unknown.gcc.1inux,修改Con-fig.in文件,这样在配置内核的时候才可以看见驱动程序的名称。同时对下列与处理器相关的部分进行修改,即可实现对S3C2440A的USB驱动的移植。在PC的终端执行#makemenuconfig命令添加对ZC301P摄像头的支持:<*>ZC3XXUSBCameraDriver<*>USBZC301PImagesProcessionandControlChipsupport修改后使用#makezImage重新编译内核镜像,将内核镜像移植到开发板。实现视频采集后,还需要把采集到的图像数据压缩后经由网络传送出去,所以还要在此基础上建立基于socket的网络服务器,用来完成客户端与服务器二者之间的数据通信。该系统中视频数据的网络传输是基于TCP协议来实现,前端嵌入式机作为视频服务器负责视频采集并建立好TCP服务器,等待客户端的连接;客户端做好一系列初始化工作后,主动连接服务器,得到应答后建立连接接收压缩视频数据并实时显示,同时可以根据用户的要求进行实时或定时保存图像或者视频文件。最后,在虚拟机中打开用户终端,输入设备驱动程序后将会启动摄像头采集视频信息,即完成视频监控,如图2-13所示。图2-13监控系统采集到的视频信息第三章设计总结通过历时两周的《生产实习》这门课程的学习,给我最大的感受就是要在老师的指导下学会学习。刚开始我觉得ARM对于我们这一组来说纯粹是零基础,以前都没有学习过。但是在我们不断到图书馆查找相关知识和网上学习后,我们逐渐学会了嵌入式操作系统和TQ2440A的使用,并可以完成视频监控。本文将嵌入式系统技术应用到网络视频监控系统中,设计了一款基于Linux和S3C2440A的低成本的网络视频采集传输系统,主要完成了arm开发板外围电路的设计;Bootloader的启动分析以及在开发板上的移植;嵌入式Linux在arm9平台上的剪裁和移植;USB摄像头在Linux下的驱动配置;基于V4L的视频采集程序的设计。服务器程序和客户端程序的设计;实现了数据的网络传输;对视频数据进行编解码,并进行连续播放;对系统在实验环境下进行整体测试。Internet的发展为嵌入式系统的发展提供了一个良好的机会,也提出了许多严峻的挑战。网络能力将会成为未来嵌入式系统的必需。各种嵌入式的网络应用软件将会广泛使用。嵌入式系统的发展又为嵌入式操作系统的发展提供动力[10]。基于Internet的视频图像传输系统现在在各个领域正发挥着重要的作用,并有来越多的厂商投身于这个领域,随着视频压缩技术的发展、网络传输能力的不断增强,网络视频的优越性会逐步体现,相信嵌入式网络视频服务器的应用会更为广泛。参考文献[1]何鹏举,陈明,段磊强,等.基于嵌入式Web服务器的远程视频监控系统[J].测控技术,2004[2]何梅.JavaApplet编程实例[M].北京:清华大学出版社,2003.[3]耿祥义.Java基础教程[M].北京:清华大学出版社,2004.[4]刘六彬.嵌入式视频监控系统中Linux应用的研究[J].科技广场,2005,2(2):4-7.LIULiu-bin.TheresearchofuClinuxapplicationinembedded-video-system[J].ScienceMosaic,2005,2(2):4-7.[5]陈俊宏.EmbededLinux嵌入式系统原理与实务[M].北京:中国铁道出版社,2004[6]西刹子.安防天下:智能网络视频监控技术详解与实践[M].北京:清华大学出版社,2010-02[7]吴明晖.基于ARM的嵌入式系统开发与应用[M].北京:人民邮电出版社,2004[8]段群杰.零基础学ARM9嵌入式Linux系统开发[M].北京:机械工业出版社,2010-10[9]程昌南、方强.ARMLinux入门与实践[M].北京:航空航天大学出版社,2008-10[10]田荣华、杨健、唐振明.ARM接口编程[M].电子工业出版社,2012-06[11]达内IT培训集团.ARM嵌入式系统移植实战开发.[M].北京:航空航天大学出版社,[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单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S52单片机的通用数据采集系统基于单片机的多道脉冲幅度分析仪研究机器人旋转电弧传感角焊缝跟踪单片机控制系统基于单片机的控制系统在PLC虚拟教学实验中的应用研究基于单片机系统的网络通信研究与应用\
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 延安大学西安创新学院《大学计算机基础》2021-2022学年第一学期期末试卷
- 烟台理工学院《中国古代文学史》2023-2024学年第一学期期末试卷
- 许昌学院《移动游戏开发实验》2023-2024学年第一学期期末试卷
- 许昌学院《大学物理》2021-2022学年第一学期期末试卷
- 知识产权与创新教育计划
- 信阳师范大学《网站前台技术实验》2021-2022学年第一学期期末试卷
- 信阳师范大学《数据结构》2021-2022学年第一学期期末试卷
- 信阳师范大学《电动力学》2021-2022学年第一学期期末试卷
- 徐州工程学院《近代物理实验》2023-2024学年第一学期期末试卷
- 年度财务审计筹备计划
- 医院护理培训课件:《护理科研》
- 中石化《炼油工艺防腐蚀管理规定》实施细则(第二版)
- 江西玉山红岭矿区饰面用花岗岩详查
- 隔离基本知识
- 中兽医-诊法课件
- 中建钢-混凝土组合简支梁施工方案
- 小学校长年终工作总结汇报
- 2022年北京市公务员考试申论真题及参考答案
- 互动墙施工方案
- 国际经济与贸易-我国五金制品出口贸易现状、问题及对策
- ASME B16.5-16.47法兰尺寸对照表
评论
0/150
提交评论