基于嵌入式Linux的嵌入式图象传输系统设计
成驱动程序和内核配置后就开始应用程序的编写了,程序首先用交叉编译器在宿主机上进行编译连接,生成的的可执行文件通过NFS mount到目标板上进行调试。调试成功后再固化到文件系统ramdisk中去。其实现主要有下面几个步骤:
1) 初始化设备基本信息
2) 打开设备文件,读取设备基本信息和信号源基本信息,并设置video_mmap并为定义的帧结构分配缓冲区并初始化线程互斥量
3) 创建图象获取的线程。该线程函数实现以内存影射的方式读取设备中的数据,锁定线程互斥量,接着对帧结构的各个元素赋值。并解锁互斥量。使该过程做一个死循环。
4) 创建一个基于连接的socket,并绑定到一个端口上,开始在该端口上侦听。
5) 当有连接到来时,创建一个图象发送的线程。该线程函数实现:如果确定读取了客户端的数据,则把缓冲区内的一帧数据发送到网络上。让这个过程也为死循环。
6) 控制两个线程的同步
7) 如果程序退出,则关闭套接字,释放分配的资源。
可以看出,程序的内容主要有三个部分:图象采集部分,图象的网络发送部分和程序的多线程控制部分。下面分别介绍一下这三个部分主要涉及的内容。
在图象采集部分,定义了一个数据结构,它的主要成员变量有:
Video_capability 包含基本的设备信息(设备名称、支持的最大最小分辨率、信号源信息)
video_channel 关于各个信号源的属性
video_mbuf 利用mmap进行映射的帧的信息
video_buffer 最底层对buffer的描述
video_mmap 用于mmap
pthread_mutex_t 线程互斥量
截取图象方法有两种:直接读取设备文件和内存影射的方法,本文采用后面一种。采用这种方法后,普通文件被映射到内存地址空间,进程可以象访问普通文件一样访问内存,这样做的一个好处是可以提高效率。做视频截取的两个主要函数是:
n ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) 若调用成功,开始一副图象的截取。是否截取完毕留给VIDIOCSYNC来判断。
n ioctl(vd->fd, VIDIOCSYNC, &frame)若调用成功,表明一帧截取已完成。可以开始做下一次截取
对于网络发送部分,主要是linux下的socket编程,调用的主要函数有:创建套接字函数socket、端口绑定函数bind、监听函数 listen、等到连接函数accept、数据接收函数read、数据发送函数write等。这些函数的具体定义和用法具体可以查阅相关资料 。需要说明的是为了能够正确发送一帧数据,要把定义的帧的结构体设置为单字节对齐,具体方法是在结构体的定义后面加上 _attribute_((packed))。
多线程编程部分用到的主要函数有:互斥量初始化函数pthread_mutex_init、互斥量锁定函数pthread_mutex_lock、互斥量解锁函数pthread_mutex_unlock、互斥量注销函数pthread_ mutex _destroy、线程创建函数pthread _ create、线程同步函数pthread_join。此外,程序中为了能更好的实现两个进程的同步,还需要用到信号量机制的一些内容。受篇幅所限,这些函数的具体定义和用法请参考相关资料 。
3.2 客户机端软件系统设计
客户端是建立在一台PC机上,用Visual C++ 6.0设计一个基于MFC的界面作为接收端。在接收端主要完成从网络缓冲区内读取数据,并保存成文件的形式,文件以接收到数据的时间为名。图2为图象采集时间间隔为1秒时程序执行的结果。图象大小为320 象素。需要说明的是:服务器端发送的数据采用了单字节对齐,对应的在客户端接收的时候也要采用单字节对齐。在WINDOWS下实现内存单字节对齐的方法是在定义的帧结构体前面加上#pragma pack (1),并在其定义之后加上#pragma pack ()。
![](../img/eep/emb/emb-46462bzyzonickem.jpg)
图2 客户端程序执行结果(1秒种采集一次图象)
4 结束语
本文提出了一套基于S3C2410平台和linux系统的嵌入式图象采集、传输系统的具体实现,并给出了实验结果。实验结果证明:系统很好的完成了图象采集和传输。得到的图象清晰。服务器可以稳定运行,不会发生断开或退出的现象。本系统可应用于工业现场的监控,也可以与其他系统如门禁系统相结合获得门开或关时现场的重要图象数据。
参考文献
[1] Alessandro Rubini著 LISOLEG译,linux设备驱动程序开发,中国电力出版社,2002
[2] 乔晓丹张鹏,一个基于Linux操作系统的嵌入式网关的实现,微计算机信息,2005年第21卷第7-2期
[3] 朱刚 等,Linux网络编程,科学出版社,2000.
[4] 于明俭 等,linux程序设计权威指南 机械工业出版社 2001.
[5] http://mxhaard.free.fr/embedded.html
- REDIce-Linux--灵活的实时Linux内核(11-12)
- linux文件系统基础(02-09)
- Linux标准趋向统一(11-12)
- linux基础技术(02-09)
- LINUX的目录树(02-09)
- 在Windows下启动Linux(02-09)