摘 要:为解决嵌入式uClinux构成的图像采集传输系统存在的 速度不匹配和资源共享问题,采用多进程算法和访问状态标志控制进程。实现了图像采集进 程和文件传输进程的核心算法,建立了多进程。使用访问状态标志控制进程同步,解决了资源的竞争和共享。应用结果达到了多进程速度的匹配和资源共享。
关键词:嵌入式;图像;多进程;应用
0引言
由嵌入式uClinux构成的图像采集与传输系统,需要完成图像采集和文件传输 两项任务。图像采集负责将采集的文件保存在本地SRAM中,文件传输负责将SRAM中的文件向远程传输。文件只能先采集到SDRAM后才能传输。图像采集的速度往往比较快,文件传输的速度较慢,势必造成图像的采集任务等待文件传输任务完毕后再进行下一幅图像采集,一方面使得整个系统循环过程延长,另一方面,由于存在图像采集与文件传输的速度不相匹配,从而造成图像采集的保存文件与文件传输访问的文件资源被争夺的现象。
为了解决该矛盾,将图像采集和文件传输任务分开独立执行,分别用采集进程和传输进程来 完成相应的任务。两个进程独立完成作业任务,并采用进程同步算法,从而避免了对文件资源的竞争。
1进程描述
在嵌入式uClinux应用系统中,采用SDRAM来保存图像文件,保存的格式为ext2的文件。因为容量大,所以图像采用JPEG压缩格式。
1.1采集进程
采集进程负责将图像信息收集起来,并保存在SDRAM中。设采集图像保存的文件名为bak.jpg,则采集核心算法如下:
FILE*fp;
fp=fopen(“bak.jpg”,“w+b”);
do
{……
if(缓冲区满)
{
读出缓冲区数据;
写入文件;
1.2文件传输进程
该进程负责将文件通过通信通道向远处传递。设待传输的图像文件名为picture.jpg,则文件传输部分算法如下:
2进程创建
由于uClinux没有MMU(Memory Manage Unit)管理存储器,在实现多个进程时需要实现数据保护。uClinux只支持vfork。实际上uClinux的多进程管理通过vfork来实现。uClinux系统fork调用完成后,要么子进程代替父进程执行直到子进程调用exit退出,要么调用exec执行一个新的进程,这个时候将产生可执行文件的加载,即使这个进程只是父进程的拷贝,这个过程也不能避免。当子进程执行exit或exec后,子进程使用wakeup把父进程唤醒,父进程继续往下执行。
用vfork实现的图像采集与文件传输多进程代码如下:
uClinux的这种多进程实现机制同它的内存管理紧密相关。uClinux针对nommu处理器开发,所以被迫使用一种flat方式的内存管理模式,启动新的应用程序时系统必须为应用程序分配存储空间,并立即把应用程序加载到内存。缺少了MMU的内存重映射机制,uClinux必须在可执行文件加载阶段对可执行文件reloc处理,使得程序执行时能够直接使用物理内存。
3进程同步控制算法
两个独立进程,为了达成同步,避免资源的共享冲突,需要采用访问状态标志。采集进程须等待文件传输完毕后才能够将下一幅图像送给传输进程。同样,传输进程必须等待图像文件建立完毕后才能够传输。由于采集进程的速度快,传输进程的速度慢,采集进程可以预先将图像文件准备好,一旦传输进程完成传输任务,采集进程就将下一幅图像输送给传输进程,从而提高效率。
在设计时可以采用判断图像文件夹的存在性作为标志。例如,采集进程将图像数据保存在文件bak.jpg中,然后采集进程判断picture.jpg文件是否存在,如果不存在,则采集进程将bak.jpg改名为picture.jpg(输送给了传输进程),接着采集进程进行下一幅图像的采集而不用等待传输完成,否则等待。由于改名的速度比采集的速度快得多,从而加快了整个速度。传输进程始终监视文件picture.jpg是否存在。如果文件夹picture.jpg存在,传输进程则 将文件picture.jpg传输,传输完成后,将文件picture.jpg删除,以便于采集进程不再等待。
采集进程中的该部分算法:
4结果
将运行uClinux的嵌入式开发板HHCF5272R1通过网络接口和网线接入共享带宽的10 Mbps局域网络HUB,将图像通过局域网再传给PC机服务器接收。采用多进程获取的图像部分如图1所示。
为了捕获图像到达的时间信息,服务器系统设置自动采集文件名称由日期和时间构成,如图像文件2003092117042677.jpg表示是在2003年09月21日17时04分26.77秒获得的JPG标准压缩图像。从图1可见相邻两张图像的传输时间间隔平均约1.44 s左右。 |