摘 要: 在某項目開發過程中,為了滿足數據采集系統中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<0)
{
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((crc0x8000)!=0)
{
crc*=2;
crc^=0x1021;
}
else
{
crc*=2;
}
if((*ptri)!=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.