TFTP協議在嵌入式系統中的實現

2021-05-28 01:55:48 字數 4571 閱讀 4905

隨著internet和pc時代的到來,嵌入式系統成為當前it產業的焦點之一。在這種形勢下,家用電器等嵌入式裝置的internet網路化就成了目前網路發展的乙個重要方向和必然結果。

本文基於arm核處理器的多嵌入式應用綜合開發平台,對嵌入式裝置聯網的tcp/ip協議進行了討論研究。

1.引言

嵌入式系統是繼it網路技術之後,又乙個新的技術發展方向。由於嵌入式系統具有體積小、效能強、功耗低、可靠性高以及面向行業應用的突出特徵,目前己經廣泛地應用於軍事國防、消費電子、網路通訊、工業控制等各個領域。隨著計算機技術與通訊技術的發展,嵌入式系統的研究與開發也有著越來越重要的實際意義。而arm是業界領先的32位嵌入式risc處理器技術提供商,占領了大約75%的市場。它可為乙個完整系統的開發提供全面的技術支援,技術具有效能高、成本低和能耗省的特點。arm的微處理器核心正迅速地成為可攜式通訊裝置、手持計算、多**數字消費和嵌入式解決方案市場中msc批量生產的標準。

2.tftp協議介紹

a.tftp與各種協議關係

tftp(trivial file transfer protocol,簡單檔案傳輸協議)是tcp/ip協議族中的乙個用來在客戶機與伺服器之間進行簡單檔案傳輸的協議,提供不複雜、開銷不大的檔案傳輸服務。tftp承載在udp上,提供不可靠的資料流傳輸服務,不提供訪問授權與認證機制,使用超時重傳方式來保證資料的到達。與ftp相比,tftp協議要簡單得多。現在最普遍使用的是第二版tftp(tftp version 2,rfc1350)使用udp 的67埠。

圖1 tftp協議包頭次序

因為tftp使用udp,而udp又使用ip,ip可以還使用其它本地通訊方法(一般為乙太網)。因此乙個tftp包中會有以下幾段:本地媒介頭,ip頭,資料報頭,tftp頭,剩下的就是tftp資料了,具體見圖(1)。tftp在ip頭中不指定任何資料,但是它使用udp中的源和目標埠以及包長度域。由tftp使用的包標記(tid)在這裡被用做埠,因此tid必須介於0到65,535之間。tftp頭中包括兩位元組的操作碼,這個碼指出了包的型別下面我們看看大體上的tftp包格式。

b. tftp包介紹

tftp支援五種型別的包,分別如下:

1 .read request (rrq)

2 .write request (wrq)

3 .data (data)

4 .acknowledgment (ack)

5 .error (error)

圖(2)顯示了tftp各種包在ip包中的位置:

圖2 tftp協議資料報格式

3.硬體實現

系統使用了rtl8019as 10m isa網絡卡晶元接入乙太網。rtl8019as是一款價效比很高的網絡卡晶元:ne2000相容,軟體移植性好;介面簡單不用轉換晶元如pci-isa橋;**便宜、頻寬充裕、較長一段時間內不會停產。8019有3種配置模式:跳線方式、即插即用p&p方式、序列flash配置方式。序列模式不與ne2000相容,p&p模式用在pc機中,這裡用不上。只剩下跳線配置模式可用。系統的mcu選擇的三星公司的s3c44b0x晶元,s3c44b0x是基於arm7tdmi核的處理器,沒有mmu,可以源**級跟蹤除錯。44b0與rtl8019的電路設計相對來說比較簡單,只需要連線資料線、位址選通、中斷等訊號線。簡略電路圖如圖(3):            

圖3 rtl8019與s3c440x的介面電路

4.軟體設計

a.rtl8019驅動程式

rtl8019驅動程式主要包括3個函式 :

i..rtl8019 初始化函式。要對網絡卡的工作引數進行設定.以使網絡卡開始工作。

其主要工作包括:復位網路晶元,設定mac位址,設定組播位址,設定dma傳輸引數等等。

ii.收包函式:從網路中接收資料到緩衝區。

iii.發包函式:從緩衝區向網路中傳送資料。

b.協議棧的實現

tftp的實現其實就是根據各種協議,對資料打包(當傳送資料時)和解包(當接收資料時)。主函式主要部分如下

… eth_init();//其主要是清空arp緩衝區.其中呼叫了乙個功能函式[2]

arp_init();//清零

mac_init();//設定mac位址

ip_init(ip); //主要功能:設定ip位址

udp_init(); //初始化udp協議

while (1) net_handle();//處理函式

前5個函式主要是初始化工作接下來的int net_handle(void)就要開始進入網路傳輸了,這裡就是協議棧的核心了:

… skb = alloc_skb(eth_frame_len);//選擇乙個 skb

if (eth_rcv(skb) != -1) {

eth_hdr = (struct ethhdr *)(skb->data);

skb_pull(skb, eth_hlen);

if (ntohs(eth_hdr->h_proto) == eth_p_arp)//是否為arp包

arp_rcv_packet(skb); //是則進行arp包應答

else if(ntohs(eth_hdr->h_proto) == eth_p_ip) //是否為ip包

ip_rcv_packet(skb);//是則進行ip包處理

如果從mac層收到乙個乙太網幀,先把收到的乙太網幀轉變為相應的幀結構再去掉其乙太網偵頭部, 其中skb_pop(skb, eth_hlen)把資料指標往後移動eth_hlen個位元組,而且真正的資料長度也做相應的變化..然後根據幀中的協議字段判斷其上層為什麼協議.這裡幀格式採用的是rfc894,如果其上層為arp協議,將去掉乙太網頭部的資料交由arp處理,同樣如果其上層協議為ip,也做類似的處理. arp_rcv_packet(skb)只處理的arp請求訊息,如果發現其為arp請求,則傳送arp應答. 接下來就是把這個arp應答包發出去,傳送了arp應答後把剛才請求的者的mac位址和其ip儲存在本機中,其實現採用了簡單迴圈區,利用陣列.首先檢查緩衝區中有無此項,如果有則直接用該項的索引,如果沒有則重新分配索引, 把傳進來的mac 和ip 賦給新分配的索引 i,。

如果mac層發現收到的包上層協議為ip,則執行[1]:

if(ntohs(eth_hdr->h_proto) == eth_p_ip)

ip_rcv_packet(skb);

首先檢查接受者是不是本機ip,通過檢查後,去掉ip頭部,再檢查其上層協議型別,如果為udp,則將包轉交給上層的udp協議處理其中udp_rcv_packet(skb)先去掉udp頭部,再檢查其對應的上層協議,這裡只實現了tftp協議,對應語句為skb_pop(skb, sizeof(struct udphdr));

if (ntohs(udp_hdr->dest) == tftp)

tftp_rcv_packet(skb);

其中tftp_rcv_packet(skb)根據tftp頭部中操作型別而採取不同的動作.對應**為:

switch (ntohs(tftp_hdr->th_opcode)) {

/* 只處理寫請求和data */

case wrq:

tftp_rcv_wrq(skb); break;

case data:

tftp_rcv_data(skb); break;

…} 其中tftp_rcv_wrq(skb)先得到請求者的ip和port,再傳送塊編號為0的ack包.然後為資料傳輸做些初始化工作,具體為設定接受緩衝區和接受資料長度 。:因為tftp是包裝在udp裡面的,所以首先欲留出udp頭部的空間,這裡要注意的是在udp層除了為自己留空間外其又會欲留出ip頭的空間,而在ip層除了為自己留空間外其又會欲留出mac頭的空間.如此便留出了整個協議棧所要求的頭部空間.呼叫關係為

udp_skb_reserve(skb)—ip_skb_reserve(skb)—eth_skb_reserve(skb);

然後該函式按照ack包的格式(在tftp_rcv_data(skb)首先判斷接受到的包的目的ip和port是不是本機的tftp協議,通過判斷後,再看接受到的包的確認序列號是不是和本機tftp要求的一致,即看是不是發生了丟包.如果沒有則當前接受到的包有效,存入緩衝區,並傳送確認序號對應**為:

if (client_block == ntohs(tftp_hdr->th_block)) {

/* 接受乙個資料分組 */

len = skb->len - sizeof(struct tftphdr);

memcpy(buf + data_len, tftp_hdr->th_data, len);

data_len += len;

tftp_send_ack(tftp_hdr, client_block);

client_block++;

… 如果當前接受到的資料小於512位元組,則說明傳送完畢,但是當發生丟包時,就要求對方重傳.採用的機制很簡單,就是要求重傳確認序號小的分組。

5.結束語

本文對s3c44b0x+rtl8019開發,實現了系統通過網路與pc機通訊,充分滿足嵌入式小系統網路通訊需要,改善了了一般嵌入式系統通過串列埠通訊速度慢、可靠性低的弊端。並且適當調整程式,可實現基於udp的其它上層協議。

嵌入式tftp的安裝配置

在redhat 9.0的第三張光碟中,有tftp server的安裝rpm包。1 安裝 mount t iso9660 dev hdc mnt cdrom 掛載光碟 rpm ivh tftp server 0.32 4.i386.rpm 安裝 umount mnt cdrom 解除安裝光碟 2 修改...

嵌入式系統中的FPGA

fpga 可以實現高速硬體電路,如各種時鐘,pwm,高速介面,dsp計算等硬體功能。這是cortex m 處理器軟體無法比擬的。要實現fpga 的邏輯設計,對於嵌入式系統工程師又是比較複雜和具有一定難度。而且要更改fpga內部的邏輯也不是十分靈活。本文 一種在嵌入式系統中,靈活,方便地動態配置fpg...

嵌入式系統移植之TFTP配置方法(自己學習總結)

tftp服務 1.檢查是否安裝tftp server dpkg s tftp hpa 如果未安裝則安裝tftp server apt get install tftpd hpa 2.修改檔案 vim etc default tftp hap,使用tftp服務 sudo vi etc default ...