APP下载

基于LM3S8962的TCP/IP协议栈的设计与实现∗

2020-05-15吕海燕张立民

计算机与数字工程 2020年2期
关键词:数据包报文以太网

刘 凯 吕海燕 张立民

(海军航空大学航空基础学院 烟台 264001)

1 引言

随着嵌入式系统和网络接入方法的日益发展,越来越多的嵌入式系统连接至网络,作为网络终端参与数据交互、信息处理[1~2]。基于 TCP/IP 的以太网是一种标准开放式的网络,由于其通用性强,组网容易,能够实现远距离数据传输,容易实现资源共享,受到了广泛的应用和支持[3~4]。因此,基于以太网的嵌入式系统逐渐成为了当前片上系统(Sys⁃tem on Chip,SoC)[5]的发展热点。但是,由于嵌入式系统中硬件资源有限,如果移植完整的TCP/IP协议栈,会大大增加系统运行载荷,导致系统运行缓慢且数据通信不畅。因此,需要依据嵌入式系统特点,有针对性地选择TCP/IP协议栈精简方案,从而实现网络稳定通信与系统高效运行的平衡。

2 TCP/IP协议栈设精简设计

2.1 LM3S8962简介

LM3S8962[6~7]微控制器是德州仪器(TI)公司提供的一款具有32位高性能运算能力的基于ARM®CortexTM-M3的控制器,其优势还在于能够方便地运用多种ARM的开发工具和片上系统(SoC)的底层IP应用方案。另外,该微控制器使用了兼容ARM Thumb®的Thumb2指令集来减少存储容量的需求,并以此达到降低成本的目的。最后,LM3S8962微控制器与Stellaris®系列的所有成员是代码兼容的,这为用户提供了灵活性,能够适应各种精确的需求。

LM3S8962微控制器的主要特性之一是具有10/100以太网控制器,它遵循IEEE 802.3-2002规范,遵循IEEE 1588-2002精确时间协议(PTP)。在100Mbps和10Mbps速率运作下支持全双工和半双工的操作方式,集成10/100Mbps收发器(PHY),自动的MDI/MDI-X交叉校验,可编程MAC地址[8~9]。

2.2 TCP/IP协议栈设计思路

针对LM3S8962已经具备10/100以太网控制器特点,需要在其硬件以太网控制器的基础上构建协议包系统,从而完成TCP或UDP数据包的处理,实现TCP/IP协议栈的通信。

1)以太网协议

以太网数据由以太网帧来传送[10]。以太网的冲突退避算法是由硬件自动执行的,在软件设计中可不用考虑。类型表示上层协议类型,本协议栈只处理这两种类型的以太网帧:IP包、ARP包。

2)地址解析协议(ARP)和反地址解析协议(RARP)

为了简化TCP/IP协议栈内容,本协议栈仅仅涉及了使用固定IP地址的方式实现以太网通信。因此,在本协议栈中无需实现RARP,仅仅需要对ARP包进行处理。ARP请求格式如图1所示。

图1 ARP请求应答格式

以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全1的特殊地址是广播地址。两个字节长的以太网帧类型表示后面数据的类型。如果以太网报文内容为ARP请求或应答,该字段的值为0×0806。对于一个ARP请求,除目的端硬件地址以外的所有其他字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后把它发送回去。

3)控制报文协议(ICMP)

针对嵌入式应用系统的特点,虽然ICMP可以提供很好的网络状态报告,但对于本系统中嵌入式软件而言,只需要实现一个“回显应答”(即Ping应答)的功能即可。

Ping是Internet上最常用的调试工具,它的目的是为了测试另一台主机是否可达[11~12]。该程序发送一份ICMP回显请求报文给目的IP设备,并等待返回ICMP回显应答。用该命令,可以方便地测试仪表与网络是否连通。为实现响应ping命令,本协议支持的ICMP类型如下:

type=8:ICMP Echor(回送)回答报文;

type=0:ICMP Echor请求。

4)网际协议(IP)

IP数据包的格式如图2所示。考虑到本系统网络数据较小,故在IP协议实现时没有支持有选项字段的IP包和分片操作。

图2 IP数据包格式

8位协议字段表示上层协议类型,在本项目中只要处理两种类型的IP包:ICMP包、UDP包。

5)用户数据报协议(UDP)

UDP分段的头部格式如图3所示。

图3 UDP分段的头部格式

在本协议栈中,设计了完整的UDP协议,并实现了与计算机的Socket通信。

从上面可以得出,经过了剪裁之后在本系统中应用的TCP/IP协议栈层次如图4所示。

图4 TCP/IP协议栈层次设计

3 精简TCP/IP协议栈实现

3.1 硬件层设计

该层主要为LM3S8962以太网底层硬件驱动,包含以太网中断响应函数EthernetIntHandler()、硬件初始化函数InitNic()、处理接收数据函数Rec⁃Packet()、以太网底层发送数据函数Send_Packet()。

LM3S8962自带的函数库包含了基本的以太网通信控制函数,故该协议是在其函数库基础上实现的。

1)InitNic()

要实现网络的驱动,必须对LM3S8962的各个寄存器进行初始化和配置。在对LM3S8962进行初始化之前需要进行硬件复位和软件复位;然后进行寄存器设置。LM3S8962网络初始化的顺序如图5所示。

图5 LM3S8962网络初始化流程

2)EthernetIntHandler()函数

该函数参数为void,主要是作为接收中断响应函数调用RecPacket()函数。由于该协议是在μC/OS-Ⅱ基础上设计的,在该函数最后进行了任务的调度。

3)RecPacket()函数

该函数的参数为void,该函数需调用LM3S8962的库函数EthernetPacketGetNonBlocking Get(),其具体功能是从以太网控制器获取数据包,返回接收数据包的长度。

4)Send_Packet()函数

在协议栈中设计了链表_pkst,其结构如图6所示。协议栈利用它作为数据读取和发送的数据结构。

图6 _pkst结构

Send_Packet()函数的输入参数为数据链初始指针,返回值为void。

3.2 链路层设计

数据链路层中包含地址解析函数PRO⁃CESS_ARP_REC(),网络的收发操作函数Send_IP_LLC()和 Rec_Ethernet_Packet(),还有一些辅助函数,如设置网络地址函数SetNetPort()等。

1)PROCESS_ARP_REC()函数

2)Send_IP_LLC()函数

该函数能够为IP数据包的目标IP查找MAC地址并将其发送出去。输入参数为发送结构指针和目标IP地址指针。

3)Rec_Ethernet_Packet()函数

该函数被RecPacket()函数调用,其功能是处理接收到的数据包,并将其数据指针传递到IP层。其输入参数为接收数据指针;输出参数为0表示发送失败,1表示发送成功。

3.3 网络层设计

网络层包括IP包的接收和发送控制,ICMP请求报文的接收和 ICMP应答报文的发送控制[13~14]。考虑到实际数据量较少,在IP数据包的处理上没有实现分片处理。

在IP协议中,创建了消息队列RecUdpQFlag和信号量SendFlag。消息队列的用处:如果有UDP数据包传递到IP协议层,则释放该消息队列,同时该消息队列保存了UDP数据包的存储地址;信号量则在Send_Ip_Frame()函数中使用。具体使用过程:首先判断该信号量是否当前可用,以判断该函数能否获得网络发送的权利,如果该时间可以进行网络数据发送,则在IP数据包发送完毕以后释放信号量。

1)IP_PROCESS()函数

该函数的输入参数为接收数据结构的指针;返回值表明处理结果,如果为1,则数据处理正确,如果为0表明处理失败。

2)Send_Ip_Frame()函数

该函数实现的是IP数据包的发送。输入参数由发送地址指针和目标IP地址组成,输出参数表明发送结果是否成功。

在ICMP协议中,系统实现了Ping命令的响应,即客户端能够判断接收服务端的ICMP Echo报文,同时向服务端回送一个ICMP Echo Reply报文完成Ping。

3)ICMP_PROCESS()函数

该函数的功能是对ICMP数据报进行处理。输入参数为ICMP数据报指针,输出参数表示处理结果。

3.4 运输层设计

鉴于LM3S8962内部以太网控制器稳定性高、通信链路延时低的优势,同时为了降低通信负载,在本TCP/IP协议栈中运输层仅仅使用UDP协议。为满足通信要求,在该层设计了两个结构udp_sub_socket和 udp_socket,其结构如图 7、8 所示,并且定义了全局Socket变量。

udp_socket UdpStatus;

图7 udp_sub_socket结构

图8 udp_socket结构

1)UDP_Process()函数

该函数的输入参数为接收UDP数据包指针,输出参数表明处理结果。

2)UDP_Send()函数

该函数实现了UDP数据包的发送,输入参数由数据指针、目的IP和网络端口组成。

3.5 应用层设计

对于网络数据的接收,该协议栈在系统中的具体使用步骤如下:

1)等待消息队列RecUdpQFlag。如果消息队列被释放了,根据函数IP_PROCESS()处理流程,表明存在UDP数据包。调用UDP_Process(),相应的代码如下所示:

UdpTemp = OSQPend (RecUdpQFlag, 0,&eer);

if(eer==OS_NO_ERR)

Udp_Process((Rec_Ptr*)UdpTemp);

2)等待UdpStatus中的信号量UdpSemRec,通过UDP_Process()保存后的数据指针得到UDP数据包中的数据。

3)如果要求发送网络数据,调用UDP_Send()函数即可。

4 TCP/IP协议栈测试

为了验证嵌入式TCP/IP协议栈工作性能,采用两种方式进行测试,1是Ping测试,2是将其应用于数据采集节点测试通信效果。

4.1 Ping测试

Pin命令主要是对网络层进行测试[15~16]。在测试中,客户端设定的IP地址是192.168.0.18,当服务器发出Ping命令时,客户端给出回应。从图9中可以看出,传递的数据并没有丢失,并且传输的时延较小,证明通信性能较好。可以证明IP层、物理层、数据链路层是连通的,能够保证客户端与服务器进行正常通信。

图9 ICMP的测试结果

4.2 数据采集节点通信测试

在本系统中,数据采集节点通过以太网完成与上位机的信息交互。上位机进行UDP测试工具如图10所示。

图10 上位机测试UDP包结果

经过实验验证,数据采集节点能够及时将所采集的数据通过网络以UDP包的形式传递给上位机,上位机根据节点传递的数据及时作出反映。

5 结语

针对LM3S8962芯片特点,采用了模块化设计方法设计了TCP/IP协议栈。根据实际系统通信需要,对各个栈功能进行精简,去掉了反地址解析协议,简化了控制报文协议和TCP包处理。既保证了以太网通信需求,又节约了嵌入式系统资源。通过相关实验验证,该协议栈的设计达到了嵌入式系统预期要求。本文提出的这种基于嵌入式系统的精简TCP/IP协议栈,对LM3S8962等同类型芯片的以太网通信等工程实践提供了参考借鉴,并且对该领域中的相关技术研究也具有一定的指导意义。

猜你喜欢

数据包报文以太网
基于J1939 协议多包报文的时序研究及应用
以太网QoS技术研究及实践
二维隐蔽时间信道构建的研究*
Microchip推出首款车载以太网音视频桥接(AVB)全集成解决方案
基于报文类型的限速值动态调整
民用飞机飞行模拟机数据包试飞任务优化结合方法研究
浅析反驳类报文要点
C#串口高效可靠的接收方案设计
三大因素驱动创新提速以太网快步迈入“灵活”时代
三大因素驱动创新提速 以太网快步迈入“灵活”时代