<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > TFTP協(xié)議在嵌入式系統中的實(shí)現

TFTP協(xié)議在嵌入式系統中的實(shí)現

作者: 時(shí)間:2011-07-13 來(lái)源:網(wǎng)絡(luò ) 收藏

3.硬件實(shí)現
  

系統使用了RTL8019AS 10M ISA網(wǎng)卡芯片接入以太網(wǎng)。RTL8019AS是一款性?xún)r(jià)比很高的網(wǎng)卡芯片:NE2000兼容,軟件移植性好;接口簡(jiǎn)單不用轉換芯片如PCI-ISA橋;價(jià)格便宜、帶寬充裕、較長(cháng)一段時(shí)間內不會(huì )停產(chǎn)。8019有3種配置模式:跳線(xiàn)方式、即插即用PP方式、串行Flash配置方式。串行模式不與NE2000兼容,PP模式用在PC機中,這里用不上。只剩下跳線(xiàn)配置模式可用。系統的MCU選擇的三星公司的S3C44B0X芯片,S3C44B0x是基于A(yíng)RM7TDMI核的處理器,沒(méi)有MMU,可以源代碼級跟蹤調試。44B0與RTL8019的電路設計相對來(lái)說(shuō)比較簡(jiǎn)單,只需要連接數據線(xiàn)、地址選通、中斷等信號線(xiàn)。簡(jiǎn)略電路圖如圖(3):            

圖3 RTL8019與S3C440X的接口電路

4.軟件設計

a.RTL8019驅動(dòng)程序
  RTL8019驅動(dòng)程序主要包括3個(gè)函數 :
  i..RTL8019 初始化函數。要對網(wǎng)卡的工作參數進(jìn)行設置.以使網(wǎng)卡開(kāi)始工作。
  其主要工作包括:復位網(wǎng)絡(luò )芯片,設置MAC地址,設置組播地址,設置DMA傳輸參數等等。
  ii.收包函數:從網(wǎng)絡(luò )中接收數據到緩沖區。
  iii.發(fā)包函數:從緩沖區向網(wǎng)絡(luò )中發(fā)送數據。
b.協(xié)議棧的實(shí)現
  TFTP的實(shí)現其實(shí)就是根據各種協(xié)議,對數據打包(當發(fā)送數據時(shí))和解包(當接收數據時(shí))。主函數主要部分如下

eth_init();//其主要是清空ARP緩沖區.其中調用了一個(gè)功能函數[2]
arp_init();//清零
Mac_init();//設置MAC地址
ip_init(ip); //主要功能:設置ip地址
udp_init(); //初始化UDP協(xié)議
while (1) net_handle();//處理函數
  

前5個(gè)函數主要是初始化工作接下來(lái)的int net_handle(void)就要開(kāi)始進(jìn)入網(wǎng)絡(luò )傳輸了,這里就是協(xié)議棧的核心了:

skb = alloc_skb(ETH_FRAME_LEN);//選擇一個(gè) 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); //是則進(jìn)行ARP包應答
else if(ntohs(eth_hdr->h_proto) == ETH_P_IP) //是否為IP包
ip_rcv_packet(skb);//是則進(jìn)行IP包處理
  

如果從MAC層收到一個(gè)以太網(wǎng)幀,先把收到的以太網(wǎng)幀轉變?yōu)橄鄳膸Y構再去掉其以太網(wǎng)偵頭部, 其中skb_pop(skb, ETH_HLEN)把數據指針往后移動(dòng)ETH_HLEN個(gè)字節,而且真正的數據長(cháng)度也做相應的變化..然后根據幀中的協(xié)議字段判斷其上層為什么協(xié)議.這里幀格式采用的是RFC894,如果其上層為arp協(xié)議,將去掉以太網(wǎng)頭部的數據交由ARP處理,同樣如果其上層協(xié)議為IP,也做類(lèi)似的處理. arp_rcv_packet(skb)只處理的ARP請求消息,如果發(fā)現其為ARP請求,則發(fā)送ARP應答. 接下來(lái)就是把這個(gè)ARP應答包發(fā)出去,發(fā)送了ARP應答后把剛才請求的者的MAC地址和其IP保存在本機中,其實(shí)現采用了簡(jiǎn)單循環(huán)區,利用數組.首先檢查緩沖區中有無(wú)此項,如果有則直接用該項的索引,如果沒(méi)有則重新分配索引, 把傳進(jìn)來(lái)的MAC 和IP 賦給新分配的索引 i,。
  

如果MAC層發(fā)現收到的包上層協(xié)議為IP,則執行[1]:
if(ntohs(eth_hdr->h_proto) == ETH_P_IP)
ip_rcv_packet(skb);
  

首先檢查接受者是不是本機IP,通過(guò)檢查后,去掉IP頭部,再檢查其上層協(xié)議類(lèi)型,如果為UDP,則將包轉交給上層的UDP協(xié)議處理其中udp_rcv_packet(skb)先去掉UDP頭部,再檢查其對應的上層協(xié)議,這里只實(shí)現了,對應語(yǔ)句為skb_pop(skb, sizeof(struct udphdr));
if (ntohs(udp_hdr->dest) == TFTP)
tftp_rcv_packet(skb);

其中tftp_rcv_packet(skb)根據TFTP頭部中操作類(lèi)型而采取不同的動(dòng)作.對應代碼為:
switch (ntohs(tftp_hdr->th_opcode)) {
/* 只處理寫(xiě)請求和DATA */
case WRQ:
tftp_rcv_wrq(skb); break;
case DATA:
tftp_rcv_data(skb); break;
…}
  

其中tftp_rcv_wrq(skb)先得到請求者的IP和PORT,再發(fā)送塊編號為0的ACK包.然后為數據傳輸做些初始化工作,具體為設置接受緩沖區和接受數據長(cháng)度。:因為T(mén)FTP是包裝在UDP里面的,所以首先欲留出UDP頭部的空間,這里要注意的是在UDP層除了為自己留空間外其又會(huì )欲留出IP頭的空間,而在IP層除了為自己留空間外其又會(huì )欲留出MAC頭的空間.如此便留出了整個(gè)協(xié)議棧所要求的頭部空間.調用關(guān)系為
  udp_skb_reserve(skb)—ip_skb_reserve(skb)—eth_skb_reserve(skb);
  

然后該函數按照ACK包的格式(在TCP/IP祥解 I 協(xié)議>160)賦相應的值.最后將此包交由下層的UDP協(xié)議處理.那么此時(shí)UDP層是怎么處理的呢?udp_send(skb, client_ip, TFTP, client_port);和TFTP層處理有些類(lèi)似,先加入自己的頭部信息并賦相應的值.然后再交由下層處理, 在IP層其處理的思路也大致差不多,其中ip_send(skb, ip, UDP)定義在ip/_ip.c.其先查看ARP緩沖區中有無(wú)此項,如無(wú)則返回錯誤.對應代碼為,然后先加入自己的頭部信息并賦相應的值.然后再交由下層處理。
  

tftp_rcv_data(skb)首先判斷接受到的包的目的IP和PORT是不是本機的,通過(guò)判斷后,再看接受到的包的確認序列號是不是和本機TFTP要求的一致,即看是不是發(fā)生了丟包.如果沒(méi)有則當前接受到的包有效,存入緩沖區,并發(fā)送確認序號對應代碼為:
if (client_block == ntohs(tftp_hdr->th_block)) {
/* 接受一個(gè)數據分組 */
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字節,則說(shuō)明傳送完畢,但是當發(fā)生丟包時(shí),就要求對方重傳.采用的機制很簡(jiǎn)單,就是要求重傳確認序號小的分組。

5.結束語(yǔ)
  

本文對S3C44B0X+RTL8019開(kāi)發(fā),實(shí)現了系統通過(guò)網(wǎng)絡(luò )與PC機通信,充分滿(mǎn)足嵌入式小系統網(wǎng)絡(luò )通信需要,改善了了一般通過(guò)串口通信速度慢、可靠性低的弊端。并且適當調整程序,可實(shí)現基于UDP的其它上層協(xié)議。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: TFTP協(xié)議 嵌入式系統

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>