Interlnk/Intersvr是高版本DOS提供的用于兩臺計算機之間進行文件拷貝的支持軟件,支持異步串口和并行口兩種連接方式。目前,采用x86核心板的許多嵌入式應(yīng)用均采用該軟件進行文件下載和上傳。例如某型號發(fā)動機電子控制器,采用了PC104結(jié)構(gòu)的x86核心板,發(fā)動機運行的記錄信息保存在核心板的電子盤上,需要采用Interlnk/Intersvr下載這些信息并對發(fā)動機的工作狀態(tài)進行分析。傳統(tǒng)的作法是在實驗室工控PC平臺上完成對電子控制器的參數(shù)設(shè)置,但此方法時效性差,為了提高檢測效率,實現(xiàn)發(fā)動機運行狀態(tài)的就地分析,亟需設(shè)計外場便攜式檢測設(shè)備。
【摘要】針對在基于AT91SAM9263和Linux的便攜式檢測設(shè)備與發(fā)動機電子控制器之間的文件傳輸?shù)膯栴},對電子控制使用的Interlnk/Intersvr軟件及其通信協(xié)議進行了分析研究。采用在實驗室搭建協(xié)議分析環(huán)境和源碼分析的方法,理清了Interlnk/Intersvr通信協(xié)議的報文格式、通信流程,并研究了DOS文件系統(tǒng)的結(jié)構(gòu)及訪問方法,最后在檢測設(shè)備軟件中的實現(xiàn)了文件傳輸功能。實驗結(jié)果表明,項目研究達到了預(yù)期的目標。
【關(guān)鍵詞】嵌入式系統(tǒng),驅(qū)動器映射,波特率協(xié)商,文件數(shù)據(jù)簇
1.引言
根據(jù)項目技術(shù)規(guī)范書的要求,便攜式檢測設(shè)備采用AT91SAM9263作為CPU,嵌入式Linux作為操作系統(tǒng),但由于電子控制器是定型產(chǎn)品,其運行軟件不允許修改,因此需要在便攜式檢測設(shè)備上設(shè)計實現(xiàn)Interlnk軟件。但由于Interlnk/Intersvr屬于Sewell公司早期開發(fā)產(chǎn)品,其通信協(xié)議并沒有對外公布,要在其他平臺上實現(xiàn)Interlnk功能必須首先分析其通信協(xié)議,才能在通信協(xié)議基礎(chǔ)上實現(xiàn)文件傳輸?shù)墓δ。本文在分析該協(xié)議報文格式和通信流程的基礎(chǔ)上,深入研究了其文件訪問機制,并在便攜式檢測設(shè)備上實現(xiàn)了該功能。
2.Interlnk/Intersvr協(xié)議分析
Interlnk/Intersvr采用企業(yè)內(nèi)部制定的通信協(xié)議,并沒有協(xié)議文本,必須對其通信協(xié)議進行分析,才能理清報文格式和通信流程。因此,本文實驗設(shè)計采用3臺計算機進行報文跟蹤,并分析每條報文功能,其中一臺運行Intersvr,一臺運行Interlnk,另一臺運行支持雙端口的協(xié)議分析和報文捕獲軟件X-Mon,計算機之間采用異步串口進行通信連接。實驗環(huán)境如圖1所示。實驗環(huán)境搭建好之后,采用先啟動Intersvr和X-Mon、再啟動Interlnk的方法,便可以在X-Mon的視窗中捕獲到Interlnk/Intersvr之間的通信報文。需要說明是,由于Interlnk/Intersvr使用了變波特率機制,最初的報文是亂碼,而之后的報文是其真實的通信報文。
由于Interlnk/Intersvr通信信息流量很大,分析起來比較困難。本文分析從網(wǎng)上下載MSDOS6.0源代碼來解決此問題,該代碼中有Interlnk/Intersvr的實現(xiàn)源碼,其中,Interlnk是采用MASM匯編語言實現(xiàn)的常駐內(nèi)存的塊設(shè)備驅(qū)動程序,Intersvr是匯編和C語言混合編程的應(yīng)用程序。通過閱讀源代碼,可以基本分析出其報文格式和通信流程,再借助圖1所示的協(xié)議分析環(huán)境,逐項對其功能流程進行驗證,從而弄清了Interlnk/Intersvr的工作機制和實現(xiàn)方法,為后期的軟件設(shè)計奠定了基礎(chǔ)。
2.1建立通信連接
在Interlnk啟動之前,必須先運行Inter-svr。Interlnk啟動時先以缺省的啟動波特率與Intersvr通信,最初的通信內(nèi)容是在二者之間交換一組同步字節(jié)串,同步字節(jié)串是Interlnk/Intersvr約定的固定字節(jié)碼,Interlnk側(cè)為0xAA,0x55,0x5A,Intersvr側(cè)為0x00,0xFF,0x11,Interlnk每發(fā)送一個字節(jié),Intersvr按順序響應(yīng)對應(yīng)的字節(jié),這樣就完成了同步字節(jié)串的交互。接下來需要測試服務(wù)器與客戶機之間是否存在正常的通信連接。如果存在正常的通信連接,Interlnk則向Intersvr發(fā)送服務(wù)器信息請求(server_info_r),獲取服務(wù)器標識碼,確定最大報文長度、校驗碼格式等通信參數(shù)。緊接著發(fā)送初始化請求(init_packet_r),獲取服務(wù)器版本信息和存儲設(shè)備的配置狀況和訪問屬性。值得注意的是,在每次報文通信之前,需要檢測當(dāng)前波特率是否為用戶指定或允許的最大通信速率,如果不是則啟動波特率協(xié)商機制,協(xié)商確定當(dāng)前條件下可以達到的最大波特率。上述建立通信連接的過程如圖2所示。
2.2報文格式
Interlnk/Intersvr之間的報文通信格式相對比較簡單,由幀長、幀體、CRC校驗碼三部分組成。該軟件總共定義了30條通信命令,包括服務(wù)器信息請求、初始化請求、構(gòu)建BIOS參數(shù)塊(BPB)請求、讀扇區(qū)請求、寫扇區(qū)請求、通用I/O控制請求等。但是,報文幀交互過程中,需要進行復(fù)雜的報文幀同步以防止幀丟失,指示幀長字節(jié)數(shù)以及后續(xù)幀控制等。由X-Mon捕獲的一組幀如圖3所示。
報文幀同步的方法是:在每個報文幀發(fā)送之前先發(fā)送同步字節(jié);不論是請求幀還是響應(yīng)幀,收到同步字節(jié)的一側(cè)立即回送該同步字節(jié);每發(fā)送一幀,則對幀序列號加1;如幀長小于256字節(jié),則幀長字節(jié)數(shù)標記置1,否則置0;如果還有后續(xù)信息需要發(fā)送,則對后續(xù)幀標記置1。每幀發(fā)送完之后,將后續(xù)將要收到的幀序列號發(fā)送給對方。
2.3建立驅(qū)動器映射
在通信連接建立之后,Interlnk則發(fā)送驅(qū)動器信息請求(drive_info_r)來獲取服務(wù)器所有驅(qū)動器信息,并建立驅(qū)動器映射。在驅(qū)動器映射建立之后,Interlnk側(cè)的計算機即可將服務(wù)器上的驅(qū)動器(如:硬盤)當(dāng)作本地盤使用。
2.4文件訪問操作
能夠?qū)Ψ⻊?wù)器文件進行訪問是項目研究開發(fā)的目標之一。根據(jù)項目技術(shù)規(guī)范書的要求,軟件需要實現(xiàn)電子控制器運行程序備份下載、數(shù)據(jù)信息文件上傳等功能,具體來說需要實現(xiàn)文件讀、寫、改名和刪除等操作。驅(qū)動器映射建立之后,Interlnk塊設(shè)備驅(qū)動程序獲取DOSShell對映射驅(qū)動器的操作,向Intersvr發(fā)送相應(yīng)的請求,完成所要求的操作。這里以信息文件下載為例介紹文件操作的執(zhí)行流程。由于Interlnk是DOS常駐內(nèi)存的塊設(shè)備驅(qū)動程序,它對服務(wù)器文件訪問與DOS一樣,都是建立在BIOS參數(shù)塊、文件目錄結(jié)構(gòu)和文件分配表基礎(chǔ)之上,因此,Interlnk首先向Intersvr發(fā)送構(gòu)建BPB參數(shù)塊命令(build_bpb_r),獲取服務(wù)器相應(yīng)驅(qū)動器的BPB參數(shù)塊;其次讀取服務(wù)器根目錄入口和文件分配表;然后從根目錄出發(fā)查找所訪問文件的入口參數(shù),包括文件名、長度、首簇號等,根據(jù)首簇號和文件分配表獲取文件所占用的簇鏈;最后順序讀取簇鏈所在的扇區(qū),將需要下載的信息文件讀取到Interlnk側(cè)的計算機。
為了實現(xiàn)對DOS文件系統(tǒng)的訪問操作,下一節(jié)對FAT16文件系統(tǒng)的結(jié)構(gòu)、訪問方法進行了進一步的分析與研究。
3.FAT16文件系統(tǒng)結(jié)構(gòu)
FAT16文件系統(tǒng)把硬盤的劃分為幾個區(qū),包括引導(dǎo)扇區(qū)、文件分配表和文件數(shù)據(jù)簇三個部分,具體結(jié)構(gòu)如圖4所示。其中,簇是文件存儲的最小單元。FAT16將磁盤分為固定大小的扇區(qū),多個扇區(qū)構(gòu)成一個固定大小的簇。
引導(dǎo)扇區(qū)的結(jié)構(gòu)如圖5所示。其中BIOS參數(shù)主要保存如下信息:a.每扇區(qū)字節(jié)數(shù);b.每簇扇區(qū)數(shù)(2的n次方,n=1..5);c.保留扇區(qū)數(shù);d.文件分配表個數(shù);e.根目錄入口數(shù);f.每個文件分配表占用扇區(qū)數(shù)等。這些參數(shù)是FAT16文件系統(tǒng)訪問重要的參數(shù),文件數(shù)據(jù)簇的開始扇區(qū)號、根目錄扇區(qū)數(shù)等都需要使用這些參數(shù)來推算。
文件分配表(FileAllocationTable,F(xiàn)AT)是Microsoft在FAT文件系統(tǒng)中用于磁盤數(shù)據(jù)(文件)索引和定位引進的一種鏈式結(jié)構(gòu)。為了保障文件系統(tǒng)的可靠性,DOS設(shè)計了兩個文件分配表,一個是主分配表,另外一個是備份表,主表損壞時采用備份表進行系統(tǒng)恢復(fù)。在FAT文件系統(tǒng)中,文件的存儲依照FAT表中的簇鏈式數(shù)據(jù)結(jié)構(gòu)來進行,如圖6所示。同時,F(xiàn)AT文件系統(tǒng)在組織數(shù)據(jù)時將目錄也抽象為文件,以簡化對數(shù)據(jù)的管理。
基于FAT16文件系統(tǒng)的結(jié)構(gòu),2.4節(jié)介紹的信息文件下載算法的類C語言描述如下:
voidcopy_file_to_client(char*fn,char*en)
{
i=0;
while(1)//在目錄表中找文件入口
{
if(strncmp(root[i].filename,fn,8))
{i++;continue;}
if(strncmp(root[i].extname,en,3))
{i++;continue;}
cluster=root[i].cluster_num;//首簇號
filelen=root[i].file_len;//文件長度
break;
}
//還沒有讀取的文件內(nèi)容的長度
remain_byte_number=filelen;
do
{//讀當(dāng)前簇的文件內(nèi)容
if(sread(pio,sectors_per_cluster,file_sector_num)
&STATUS_ERROR)return;
//還沒有讀取的文件內(nèi)容的長度
if(remain_byte_number>=bytes_per_cluster)
remain_byte_number-=bytes_per_cluster;
elseremain_byte_number=0;
//從簇鏈中獲取下一簇號
if(cluster!=-1)cluster=FAT[cluster];
if(cluster==-1)break;//EOF
}while(remain_byte_number>0);
}
4.結(jié)束語
針對在linux中通過Interlnk/Intersvr訪問DOS系統(tǒng)文件的問題,本文采用了gcc-arm-linux交叉編譯工具對項目軟件中文件傳輸模塊進行了設(shè)計實現(xiàn)。其中,檢測設(shè)備采用異步串口與Intersvr服務(wù)器進行物理連接,文件傳輸模塊采用了與Interlnk相同的方式與Intersvr進行同步、通信連接和波特率協(xié)商,并將用戶需要下載的文件信息在本地列表顯示,供用戶選擇下載。同時,檢測設(shè)備還支持將用戶存儲在移動光驅(qū)中的運行軟件下載到電子控制器。檢測設(shè)備與電子控制器之間文件相互傳輸?shù)脑囼灡砻鳎憾咧g的通信連接正常,文件傳輸正確可靠,達到了項目研究預(yù)期的目的。
參考文獻
[1]MarkKampe,AnIntroductiontoDOSFATVolumeandFileStructure[OL].http://seas.ucla.edu/,2011-10-9.
[2]MS-DOS6.0源代碼(MS-DOS6.0SourceCode.zip)[CP].http://ishare.iask.sina.com.cn,2011-6-4.
[3]陳代軍.FAT32和FAT16文件系統(tǒng)的差異[J].成都信息工程學(xué)院學(xué)報,2003(6).
[4]周書明.巧用INTERLNK和INTERSVR[J].電腦編程技巧與維護,1997(2).
[5]維基百科,F(xiàn)AT,http://zh.wikipedia.org/2012-3-19.
轉(zhuǎn)載請注明來自:http://www.jinnzone.com/dianzijishulw/30683.html
上一篇:電子通信論文范文參考