《嵌入式系统应用设计》实验报告(共5页).doc
精选优质文档-倾情为你奉上嵌入式应用系统设计报告 PC Linux视频监控系统设计一、 课程设计的目的课程设计是嵌入式系统应用设计课程教学必不可缺的一个重要环节,可加深学生对该课程所学内容的进一步的理解与巩固,是将计算机课程与实际问题相联接的关键步骤。通过课程设计,能够提高学生分析问题、解决问题,从而运用所学知识解决实际问题的能力,因而必须给予足够的重视。二、设计目标PC Linux视频监控系统通过虚拟机redhat9将摄像头采集的视频信号进行压缩,同时进行入侵检测,再通过网络数据传送web服务器,客户端通过浏览器监控。三、相关背景知识随着计算机网络技术、视频压缩技术以及嵌入式技术在近些年来的迅速发展,网络视频监控系统进入快速发展期,市场上出现了很多网络视频监控产品,以满足人们对安全的各种要求。采用嵌入式Web技术的网络,目前正成为网络系统的一个重要发展方向。用户通过浏览器或其他专门的客户端软件,就可远程访问监控摄像机,实现对现场的。在中采用,将功能模块和PC机客户端监控功能模块相分离,采用TCP协议对视频数据进行网络传输。,对目前Linux下USB的两种接口标准Video for-Linux和Video for Linux Two分别进行了研究,分别实现了基于这两种标准的驱动下的图像采集,并在最终的系统中采用了基于Video for Linux标准的驱动程序,完成了图像采集功能。通过在嵌入式视频采集上建立嵌入式Web服务器,使用户通过Web页面查看图像视频。四、 课程设计环境操作系统:Vmware 虚拟机下Linux五、流程六、结果从浏览器中可看到视频,一下是截图:七、重点/疑难问题及解决方法PC端采用VMware+redhat9,由于本人安装VMware-Tool后设置不了共享文件夹,采用samba服务器,通过samba服务器实现文件夹共享,搭建samba服务器时遇到window平台打开不了共享文件夹问题,后来发现是配置文件有问题。解决办法是修改smb.conf文件。编译内核时遇到有内核版本号,但是2.4.36版本启动不了。解决方法是修改/etc/lilo.conf启动项。编译内核失败,不能进入系统,提示如下: audit(.326:0):initialized kernel panic not syncing: VFS:Unable to mount root fs on unknown-block(0,0) 或是:VFS:Cannot open root device "hdxy" or unknow-block(0,0) Please append a correct "root=" boot option kernel panic-not syncing: VFS:Unable to mount root fs on unknow-block(0,0) 这种故障现象, 解决方法:把08.05.11、<*> RAM disk support 09.27.07、<*> Compressed ROM file system support (cramfs) 这两项都要选上!八、遗留问题及思考架设thttpd服务器,按照资料架设,服务器不能成功启动,解决方法还在研究中。成功安装VMware-Tool,但是不能跟window共享文件夹,为什么redhat9就不能设置共享文件夹?九、代码分析 if (server_handle = socket (AF_INET, SOCK_STREAM, 0) = -1) exit_fatal ("Error opening socket Abort !"); if (setsockopt (server_handle, SOL_SOCKET, SO_REUSEADDR, &O_on, sizeof (int) = -1) exit_fatal ("Setting reused address fail Abort !"); initaddr (&servadr,NULL, port); if (bind (server_handle, (struct sockaddr *) &servadr, sizeof (struct sockaddr) = -1) exit_fatal ("error bind socket");这部分代码主要是用于创建一个socket,设置服务地址,绑定端口。 if (listen (server_handle, MAXCONNECT) = -1) exit_fatal ("Damned errors when listen Abort !"); return server_handle;这部分代码主要是服务器用于监听客户端。while (videoIn.signalquit) sin_size = sizeof(struct sockaddr_in);if (new_sock = accept(serv_sock, (struct sockaddr *)&their_addr, &sin_size) = -1)continue;syslog(LOG_ERR,"Got connection from %sn",inet_ntoa(their_addr.sin_addr);printf("Got connection from %sn",inet_ntoa(their_addr.sin_addr);pthread_create(&server_th, NULL, (void *)service, &new_sock); 这部分代码主要用于处理连接。Timer* tmr_mstimeout( ) register Timer* min = timers0; for ( h = 1; h < HASH_SIZE; +h ) /timers在插入或删除元素时自然是要用心维护好顺序的,这里不打出来 if ( timersh < min ) min = timersh; return min;不管用什么数据结构来组织,既然Timer是一个计时器,那么就总是需要从一堆Timer里面找出离某个时间最近的那个Timer的. 在thttp的实现中,因为与客户端的连接有很多,也就是accept()返回的connfd数量有很多,根据这个最近的Timer,就可以从这一堆connfd中select出已经ready(可读可写或异常)的那个connfd,然后对此connfd操作(写或读).好吧,既然关键点出来了,那么将链表排序也就是可以理解了的: 要找出最小的那个Timer,只要从times数组里面找出头元素最小的那个链表的下标,然后在此下标对应的链表中顺序比较找出最小的那个就可以了,这么一来,就省去了所有元素都比较一遍的麻烦.转化成代码是以上专心-专注-专业