一种VxWork下文件传输方法的研究与实现

时间:2022-10-09 04:19:06

一种VxWork下文件传输方法的研究与实现

摘 要: 在某项目开发过程中,为了满足数据采集系统中DSP应用程序在线FLASH更新的需求,首先借助Tornado开发环境自带的FTP服务器将应用程序下载到系统控制器内存,再封装成数据包分次传输,最后实现应用程序更新。该方案解决了某些应用场合下数据转存空间小于需要传输的文件时需分包多次传输的问题,整个软件开发过程都是在Tornado开发编译环境下进行的,能够完成对应用程序文件进行分包无差错传输。实际应用表明,按照该方案设计的软件程序可以很好地实现FLASH在线更新,具有分包传输、数据准确的特点,达到了设计要求。

关键词: VxWorks; FTP; 分包传输; 在线更新

中图分类号: TN919?34; TP311.1 文献标识码: A 文章编号: 1004?373X(2013)24?0050?05

Research and implementation of file transfer method under VxWork

WANG Hao1, JIA Liang1, LI Yong?tian2

(1. Electronic and Information Engineering Institute, Shenyang Aerospace University, Shenyang 110136, China;

2. Beijing Fangtian Changjiu Science and Technology Ltd, beijing 100084, China)

Abstract: In a project development process, in order to meet the needs of online Flash update of DSP application program in data acquisition system, first of all, the application program is downloaded to the system controller memory by means of the Tornado development environment built?in FTP server, then encapsulated into packets to transmit, and finally the application program update is realized. The program solves the problem that when data dump space is less than the size of data transfer file, and the subpackage transmission in several times is required. The entire software development process is performed in the Tornado development environment, which is able to complete the subpackage error?free transmission of application files. The practical application shows that the software program designed according to the scheme can achieve a good Flash online update, has the characteristics of subpackage transmission and data accuracy, and can meet the design requirements.

Keywords: VxWorks; FTP; subpackage transmission; online update

随着计算机技术、半导体技术以及软件技术的飞速发展,嵌入式微处理器的性能也得到不断提高,嵌入式操作系统的种类更是层出不穷,从而使得嵌入式系统在越来越多的领域得到更加广泛的应用。其中,美国Wind River System公司于1983年设计开发的一种嵌入式实时操作系统(RTOS)VxWorks凭借其可移植性强等优点得到了广泛的应用[1]。VxWorks提供的系统接口要比其他操作系统丰富,因此选择它来作为嵌入式采集系统的软件控制平台,可以大大提高开发的效率[2]。本文应用Motorola公司的MCP?750PowerPC嵌入式CPCI单板机作为系统控制器及北京方天长久科技有限公司的FTC?6010作为数据采集板组成数据采集系统。在开发过程中,考虑到了数据采集板有可能工作在不方便拆卸的场合,无法使用下载器对数据采集板上的DSP进行应用程序的更新,本文的研究重点就是实现对数据采集板上的DSP应用程序进行在线FLASH更新,从而摆脱下载器的束缚。基于以上考虑,规定了一份适合于本数据采集系统需要的分包文件传输协议,并在此基础上用C语言封装了一个基于VxWorks下的功能模块,此功能模块的设计成功的实现了DSP程序在线FLASH更新,满足了开发的需要。

1 数据采集系统分析介绍

1.1 系统总体结构及软硬件开发环境

数据采集系统基于CPCI总线实现,系统总体结构及软硬件开发环境如图1所示,上位机Tornado IDE(VxWorks集成开发环境)通过以太网络和MCP?750PowerPC嵌入式单板机相连,MCP?750作为CPCI总线控制器通过CPCI总线控制数据采集板(FTC?6010),同时通过串口输出信息到上位机,便于操作。

图1 系统总体结构及软硬件开发环境

1.2 DSP应用程序在线FLASH更新时数据流向

图2简要给出了DSP应用程序在线FLASH更新时数据的流向,上位机使用FTP通过网络 将应用程序的二进制文件下载到系统控制器的内存中,再从系统控制器的内存中通过CPCI总线将文件传送至数据采集板上DSP外接的FLASH中,最后实现FLASH的更新。在传送过程中,由于系统控制器与数据采集板上的DSP需要通过DPSRAM进行交互,而DPSRAM的存储空间有限,此时就需要将应用程序文件分包进行传输,传输协议的制定就显得至关重要了,需要保证数据传输正确,传输过程不丢包。

图2 DSP应用程序在线FLASH更新时数据流向

2 FTP文件传输

2.1 FTP介绍

文件传输协议(File Transfer Protocol,FTP)是TCP/IP 的一种具体应用,工作在OSI 模型的第7层, TCP 模型的第4层, 即应用层。FTP要求客户向服务器提供用户注册名和口令, 服务器拒绝非法用户的访问。但是链接一旦建立成功, 一个或多个文本或图像二进制文件都能被传送, FTP 不必担心可靠性和连接的管理, 因为FTP 依靠TCP 正确执行这些功能[3]。Tornado开发环境自带FTP服务器,常见用于系统成功引导后,下载VxWorks的运行时映象,需正确配置用户名,密码和路径[4]。

2.2 VxWorks下FTP程序的编写

可以直接使用VxWorks提供的几个API函数进行FTP程序的编写,实现从上位机将应用程序文件下载到系统控制器的内存中的目的,这里主要介绍三个:ftpXfer、ftpReplyGet和ftpCommand,几个函数的原型和主要用法如下[5]:

ftpXfer的作用是初始化通过FTP传输的文件。

STATUS ftpXfer

char * host,

/*ftp服务器的IP地址,点分十进制,格式类似于"10.0.0.1" */

char * user, /*访问ftp服务器的用户名 */

char * passwd, /*访问ftp服务器的密码 */

char * acct, /*一般不用,直接填写为空字符串就可以了*/

char * cmd, /*发送给FTP服务器的命令,例如读取命令为"RETR"*/

char * dirname, /*待访问文件所在的目录*/

char * filename, /*待访问文件的文件名*/

int * pCtrlSock, /*存储返回的文件描述符,也就是常说的fd*/

int * pDataSock /*存储返回的待访问文件的文件描述符*/

此例程按以下顺序发起通过FTP服务器传输文件:

(1)建立一个连接到指定的主机上的FTP服务器;

(2)在指定的主机上设置好用户名,密码和账号;

(3)发送文件传输类型命令;

(4)发送文件所在的目录以及文件名命令;

(5)将指定的转移命令和指定的文件名作为参数,建立一个数据连接。典型的传输命令为STOR %S:写入到一个远程文件;RETR%S:读取一个远程文件。

由此产生的控制和数据连接文件描述符分别通过pCtrlSock和pDataSock返回。

调用这个程序后,数据可以被读取或写入到远程服务器返回的文件描述符pDataSock中。当所有传入的数据被读取(读取数据套接字由EOF表示)和/或所有传出的数据已写入,应关闭数据套接字fd。

这时候应该调用函数ftpReplyGet(),用来接收控制套接字的最后的回复。

int ftpReplyGet

int ctrlSock, /*连接FTP control socket文件描述符fd*/

BOOL expecteof /* TRUE = EOF expected, FALSE = EOF is error */

若没有错误,应调用函数ftpCommand()关闭control socket。

int ftpCommand

int ctrlSock, /* 连接FTP control socket文件描述符fd */

char * fmt, /* 待传递的ftp命令 */

int arg1, /* ftp命令的参数*/

int arg2,

int arg3,

int arg4,

int arg5,

int arg6

如果FTP命令不涉及数据传输(例如文件删除或重命名),pDataSock应该是NULL,在这种情况下,不会建立数据连接。函数返回为OK或ERROR(有socket不能创建或不能进行连接)。

FTP文件传输的全部过程如图3所示。

图3 VxWorks下FTP文件传输过程

程序关键代码如下:

/* initiate a transfer via a remote FTP server to read a remote file */

if(ERROR==ftpXfer(UNIX_HOST,USER,PASSWD,"","RETR %s",W_DIR,FILE,&ctrlSock,

&dataSock))

{

perror("Error in initiating a transfer via a remote FTP server");

return ERROR;

}

/* read the remote file data to buffer */

while((NumBytes=read(dataSock,buff,sizeof(buff)))>0)

{

buff+=NumBytes;

}

if(NumBytes

{

perror ("Error in reading"); /* read error */

return (ERROR);

}

close(dataSock);

/* Get an FTP command reply to see whether EOF is encountered */

if(ftpReplyGet(ctrlSock,TRUE)!=FTP_COMPLETE)

{

perror ("positive completion failed");

return (ERROR);

}

/* Send QUIT FTP command */

if(ftpCommand(ctrlSock,"QUIT",0,0,0,0,0,0)!=FTP_COMPLETE)

{

perror ("QUIT FTP command positive completion failed");

return (ERROR);

}

close (ctrlSock);

3 分包文件传输协议的制定与实现

3.1 分包文件传输协议制定

通过本文前两节的分析和应用,文件已经成功的从上位机下载到了系统控制器的内存当中,本节着重介绍如何从系统控制器的内存中将文件封装成数据包分次传送给DPSRAM,如何通知DSP将数据包取走,如何得到DSP的应答之后传送下一个数据包,如何判断数据包全部传送完成等,简而言之,就是分包文件传输协议的制定,图4用流程图的形式对整个过程进行了详细的描述。

下面以数据包包含的信息要素为例介绍分包文件传输协议,每个数据包包含以下信息要素,如图5所示。

系统控制器将数据包写入DPSRAM之后,会发起DPSRAM左端口中断,DSP检测到中断后从DPSRAM中取走数据包。

控制命令字的主要作用是告知DSP,此数据包数据空间中的数据是用于FLASH更新用的,需要将其写入FLASH中。

数据包长度的主要作用是告知DSP即将要读取的数据包中数据空间的长度,以便DSP将其写入到FLASH对应的空间中。

图4 分包文件传送过程

图5 数据包的信息要素

数据包序号的主要作用是告知DSP,此次传输的是第几个数据包,防止传输过程中丢包。

数据写入标记分为3种:根据数据包序号,如果传输的是第一个数据包,则表示数据包传输开始;如果传输的是中间的数据包,则表示数据包继续传输;如果接收到的是最后一个数据包,则表示数据包传输完成。

CRC校验和的主要作用是便于DSP比较数据传输之前的检验和与自己根据接收到的数据计算出来的校验和是否一致,借此判断数据传输过程中有无丢数现象发生。文件总的大小的主要作用是告知DSP需要擦除多大的FLASH空间用于存储更新后的文件。

3.2 分包文件传输协议实现

协议的实现主要用到了以下几个关键函数:

(1)数据包协议头的封装

UINT32 gfWriteLong(UINT32 x,UINT32 y)

{

*(UINT32*)x=y;

return y;

}

此函数用于封装数据包协议头,将数据包协议头信息写入相应的地址空间中。

(2)CRC校验和算法[6]

本文采用一种按位计算的方法计算校验和,和DSP计算出来的校验和相比较,防止数 据传输过程中出现差错,关键代码如下:

UINT32 gfCRCCheckSum(char *ptr,unsigned long len)

{

unsigned char i;unsigned long crc=0;

while(len??!=0)

{

for(i=0x80;i!=0;i/=2)

{

if((crc&0x8000)!=0)

{

crc*=2;

crc^=0x1021;

}

else

{

crc*=2;

}

if((*ptr&i)!=0)

{

crc^=0x1021;

}

}

ptr++;

}

return crc;

}

(3)应答机制

应答机制的作用是得到DSP接收完一个数据包之后反馈回来的信息(用数值表示),如为数据传输正确,则打印出提示提示语句后接着传送下一个数据包;如为校验和出错,则说明数据包传送过程中发生了丢数等现象,打印出语句后直接结束退出;如为FLASH更新完成,则说明所有数据包传送完成,且正确的写入到FLASH中了,打印出提示语句后直接结束退出;如为FLASH更新出错,则说明所有数据包传送完成,但没有正确的写入到FLASH中,打印出提示语句后直接结束退出。

关键代码如下:

STATUS gfDSPACKCMD(int handle,UINT32 ACKAddress)

{

UINT32 ACKCMD;

ACKCMD=*(*ACKAddress);

switch(ACKCMD)

{

case DSP_ACK_OK:

printf("\nData Packet Send Success and Data Right!\n\n");

break;

case ERROR_CHECKSUM:

printf("\nData packet CRC CheckSum ERROR!\n");

break;

case FLASH_UPDATE_OK:

printf("\n\nFlash Data Updates Over!!!\n");

break;

case ERROR_FLASH_DATA:

printf("\nFlash data write error!\n");

break;

default:

printf("\nAcknowledge command word error!\n");

break;

}

return OK;

}

4 实际应用

基于以上分析研究,编写了相应的程序,并在数据采集系统中进行了多次试验,试验结果如表1所示,从试验结果可以看出,本文所介绍的方法可以保证数据传输的准确性,满足了DSP程序在线FLASH更新的需求。

表1 FLASH更新测试结果

5 结 论

本文结合实际项目开发过程中遇到的实际问题,概述了一种 VxWorks下简单文件传输的原理和具体的软件实现方法。实际应用证明,按照此种方式编写的程序代码简单,实用,可以很好的进行文件数据分包传输。

参考文献

[1] 李署东,吴昊,杜祝.VxWorks下点对点简单文件传输的实现[J].中国水运,2011,11(1):84?87.

[2] 唐晓平.VxWorks在cPCI高速数据采集系统中的应用研究[D].长沙:国防科学技术大学,2008.

[3] 黄世权.FTP协议分析和安全研究[J].微计算机信息,2008,24(2?3):93?94.

[4] 冯先成,李寒,张铁男.基于MPC850 VxWorks系统的BSP设计[J].计算机与数字工程,2012,40(6):39?43.

[5] Wind River Systems, Inc. VxWorks reference manual 5.3.1 [S]. California: Wind River Systems, Inc, 1998.

[6] 孙连科.用C语言实现CRC计算[J].电脑知识与技术,2009,5(18):5601?5602.

上一篇:基于WebGIS的泉州医疗点空间信息服务系统设计 下一篇:一种基于社会网络技术的教育协作支持系统设计