0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于单片机ARM实现TCP/IP协议栈的设计

电子设计 来源:单片机与嵌入式系统应用 作者:廖日坤,纪越峰, 2021-05-26 11:24 次阅读

作者:廖日坤,纪越峰,黄小迅

随着计算机网络技术和电子信息技术的迅猛发展,Internet的使用越来越普及,信息家电和智能仪表等能够接入Iriternet的非PC设备越来越多,将各类电子设备接入Internet的需求也越来越大。

电子设备接入Internet。有多种解决方案:在51系列单片机上运行经过裁剪的TCP/IP协议栈;使用一些ASIC实现TCP/IP的芯片,如Analog Devices推出的Internet Modem;也可使用嵌入式操作系统自带的TCP/IP协议栈。在某些对网络速度要求不高的领域,可用单片机实现TCP/IP;在对性能要求高的场合,可选择后两种方案。

1 嵌入式TCP/IP的硬件结构

图1是嵌入式TCP/IP系统的硬件结构。其中CS8900A是Cirrus Logic的网络控制器,芯片内部已设置帧过滤器自动抛弃无效帧,减轻CPU负荷,提高CPU对网络的访问效率。CS8900A工作机制主要是通过设置好其内部各寄存器的值,然后就可以自动开始工作。在网络接口部分,由于是RJ45接口,所以须使用E2023传输线变压器对网络中的信号进行转换。

pIYBAGCtwJWAaajIAADRxKleIs0466.png

通常TCP/IP协议栈需要大量的RAM来存储需要被应答的TCP包。如果在规定时间内未被应答,则重发该TCP包;被应答以后释放。为了减小RAM的使用量,当数据包需要重新发送时,如果能够重新产生数据包所需的数据,则可不存储需要被应答的TCP包。

因为网络中数据非常多,如果把所有的数据都读到内存中再判断是否应丢弃帧,则显然效率不高。所以边读取数据边判断而没有一开始就把整个帧全部读到内存中。在程序里定义了帧中各部分的相对地址,可以方便地对帧的各字节寻址。这样的设计是基于提高访问速度考虑的。

在CPU中帧的存放方式,定义PacketRAM变量为存放帧的首地址。图2给出了CPU中TCP/IP的内存划分,以及内存中帧的各个字节的定义和相对位置。

pIYBAGCtwUOAOiSUAABw3J5dJLA484.png

2 嵌入式TCP/IP的优化设计

TCP/IP一般采用C语言或混合汇编。使用可重入函数和一般指针(gellerc pointer)使得程序代码增大,运行速度降低;使用函数指针时,需要手动重建调用树(calltree),或将函数指针调用的函数设置为可重入函数。

2.1 嵌入式TCP/IP输入输出流程

与PC机TCP/IP协议一样,嵌入式TCP/IP采用协议分层的结构:应用层、TCP层、IP层和网络设备接口层。图3描述了输入和输出数据包的流程以及需要调用的函数。

o4YBAGCtwUmATBBuAABu158xsIA842.png

输出时,TCP层先查看unsend队列,发现非空,将数据包插入队列;发现为空,则查看对方窗口是否够大(能够接收这个数据包)。然后,填写TCP头部信息。IP层选择网络设备接口,目的IP和该接口的子网掩码相“与”是否等于子网掩码,然后调用这个接口的Output函数来发送。

输入时,Timer()函数调用每个接口的Input函数。IP层判断IP版本、IP校验和,以及是否应转发数据包,然后根据IP头部的protocol字段将包传给相应的高层处理。TCP层,须判断TCP校验和,并在现有的套接字中查找,判断是否有套接字可接收这个数据包,判断TCP序号是否为希望的,然后更新这个连接的状态(包括释放被应答的数据包和TCP状态机的转化等),调用该套接字的回调函数recv。

2.2 嵌入式TCP/IP的程序结构

Tliner函数功能是调用TCPTimer处理TCP数据包的重发等功能,调用每个接口的Input函数接收到达的数据包。Timer函数必须在短时间(一般为20ms)内被调用一次,否则接收数据包和TCP定时等功能将停止。

如图4所示,程序主流程是一个大循环,在循环中处理发送数据包等应用层协议的同时,查询变量bTimeOut,在定时中断中将bTimerOut设置为真。应用层在程序流程中反复查询bTimerOut是否为真,若为真则调用Timer(),然后设置bTimerOut为假。

pIYBAGCtwU-AZrXjAAA7AiMb5tc898.png

在使用嵌入式操作系统时,还要注意网络设备驱动函数被重入的问题。以NE2K的以太网卡为例,拷贝数据包到网卡缓存前要先设置寄存器(如起始地址)。如果设置完寄存器以后中断发生且放重入。则寄存器的设置被修改,中断返回以后拷贝将出错。

2.3 嵌入式TCP/IP运行速度优化

TCP/IP发送过程中主要的运算量集中在3部分:应用程序将数据拷贝到RAM;计算TCP校验和;将RAM中的数据包拷贝到网络设备的发送缓冲区。对于每个字节数据,两次拷贝大致共使用12×2=24个指令周期;计算TCP校验和使用16个指令周期。采用12MHz晶振,最高网络传输速度为25KB/s。

为了提高速度可以采用快速CPU或提高晶振频率。另外,尽量避免使用Reentrant函数。Reentrant类型的函数比一般函数速度要慢很多,但某些时候为了程序结构的需要必须使用Reentrant,这就需要在速度和结构之间作一个选择。选择的方法有:使用“指定存储类型”的指针(memoryr-specific pointer);精简协议栈去除运算量大但是用处不大的功能,目前TCP定时重发时间是固定的,也没有拥塞窗口控制和IP层路由;防止数据包不必要的拷贝;优化计算校验和与内存拷贝函数。

3 TCP/IP的嵌入式实现

TCP/IP协议实现一般以软件方式嵌人到ROM中,然后通过网络通信技术与专用嵌入式网关连接,运行TCP/IP协议,并提供TCP/IP到用户的轻型网络的连接和路由功能。

3.1 内存管理方法和无多余数据包拷贝的实现

嵌入式TCP/IP的内存管理可用链表方法,即根据数据包大小分配相应大小的内存块。如图5所示,链表将内存块链接起来,used字段表示该内存块是否正在使用,pStart和pEnd表示数据部分有效数据的开始地址和结束地址。

o4YBAGCtwVWASuzgAAA-f1F44bQ610.png

分配时,搜索内存链表找到一个没有分配的比所需空间大的内存块,截取所需的大小。该内存块被截取以后可能还有较多剩余,这时将剩余部分从原内存块中分离出来,成为一个新的内存块,并插入链表。释放时,将used置为假。如果pNext或pPre指向的链表单元也是空闲的,则将其与自己合并。以防止内存分片。在协议层之间传送数据包只要传送内存块的起始地址即可。这种内存管理方法空间浪费小,但运算量相对较大。

3.2 整序、重发与窗口控制的实现

使用队列缓存的方式来实现整序、重发和窗口控制。队列的一个元素指向一个数据包,队列的最大长度没有限制。

对于整序,使用ooSeq队列,如果发现接收的TCP包序号并不是希望的,但序号在接收窗口内,此时不能立刻接收这个包也不应丢弃,先将这个包放入ooSeq队列。当一个希望的TCP包被接收以后,再查看ooseq队列现在是否有TCP包成为了希望的数据包,如果有则将其取出并处理。

对于重发,使用unacked队列,每个需要被应答的TCP数据包发送以后都要放入unacked队列,直到被应答后才从队列中删除。TCP重发定时只针对unacked队列第一个TCP包。如果定时超出,则重新发送;如果重发次数超出规定值,则报错。

对于窗口控制,使用unsend队列,如果发现对方的窗口过小无法接收这个数据包,则只发送部分数据,将多余部分放入unsend队列,等待对方发来TCP包通知新的窗口大小时,再次判断是否可以发送。在unsend队列不为空的情况下,须发送的数据包都应插入unsend队列。

3.3 捎带应答的实现

捎带应答是指,当对方一个需要应答的TCP包到达时,不马上给予应答,而是等待一段较短的时间。如果在这段时间内有数据发送,则会捎带给予应答,从而减少了包的发送数量。

若暂时没有数据须发给对方或数据还未准备好,则等待一定的时间;如果在该时间内准备好了数据,则可使用捎带应答。使用捎带应答就不可能对每个帧都作确认,可用对某个帧的确认来代替对该帧之前所有帧的确认。

4 总 结

嵌入式系统中大量存在的是8/16位低速处理器,在进行Internet接入时,由于本身资源的限制,很难实现完整的TCP/IP协议。本文从既实现相应的功能又节省系统资源角度出发,对协议进行有针对性的模块化裁剪和优化设计,可以在单片机ARM上嵌入TCP/IP协议簇实现嵌入式Internet接入。

经过优化设计的嵌入式TCP/IP,支持套接字形式的多个TCP连接;支持多个网络设备;支持通过网关发送数据包和数据包转发功能,响应ping命令;支持TCP包的整序、重发和窗口控制流量控制。实践证明,这种设计方式灵活,能按用户需求实现很多复杂的功能。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 变压器
    +关注

    关注

    157

    文章

    6887

    浏览量

    130377
  • 单片机
    +关注

    关注

    5997

    文章

    43947

    浏览量

    620538
  • 控制器
    +关注

    关注

    112

    文章

    15145

    浏览量

    170940
收藏 人收藏

    评论

    相关推荐

    基于 51 系列单片机TCP/ip协议C程序

    基于 51 系列单片机TCP/ip协议C程序
    发表于 01-06 21:28

    基于μC/OS—II的μC/IP协议ARM系统中的实现

    UC/OS—II与32住ARM7 Core的软硬件平台,论述了UC/IP协议的移植原理。然后,根据TCP
    发表于 03-28 14:04

    一种uIP TCP/IP协议在51系列单片机上的实现

    单片机,被应用在各个领域内。因此使用uIP这种免费的TCP/IP协议解决由51内核的单片机构建
    发表于 08-08 09:27

    uC/OS-II下如何实现TCP/IP协议

    uC/OS-II下应如何实现TCP/IP协议
    发表于 09-15 11:35

    剖析:WIZnet以太网核心技术–全硬件TCP/IP协议

    和PHY),实现了一片解决联网,真正实现TCP/IP卸载引擎技术(ToE),为单片机减负,缩短了开发周期。好,那我们看一下全硬件
    发表于 04-09 09:44

    协议介绍

    协议介绍本协议开发人:杨文斌,联系方式:qq:2929422782.参数说明1)本协议完全
    发表于 09-03 15:02

    协议介绍--TCP/IP

    协议介绍本协议开发人:杨文斌,联系方式:qq:2929422782.参数说明1)本协议完全
    发表于 09-03 15:03

    协议介绍

    :2929422782.参数说明1)本协议完全由C代码编写,可以移植去各种单片机平台上实现协议
    发表于 09-14 08:44

    如何去简化Simplified TCP/IP协议

    Simplified TCP/IP协议的特点是什么?如何去简化Simplified TCP/IP
    发表于 05-26 07:23

    怎么实现TCPIP协议单片机上的移植?

    本文实现TCPIP协议单片机上的移植,完成了系统的硬件电路和相关嵌入式软件的设计,应用V
    发表于 06-03 07:08

    基于ARMTCP/IP协议LwlP是如何实现的?

    嵌入式网络通信系统的硬件平台由哪几个部分组成?基于ARMTCP/IP协议LwlP是如何实现
    发表于 06-04 06:37

    怎么实现嵌入式TCP/IP协议的设计?

    本文阐述在一种异构网络互联——CAN总线与以太网互联系统设计方案中嵌入式TCP/IP协议的设计与实现。从而
    发表于 06-07 06:28

    TCP/IP协议有何功能

    TCP/IP协议是什么?TCP/IP协议
    发表于 10-14 06:39

    51+单片机TCP-IP+协议栈ZLIP源码

    单片机上网技术,是当前的一个热门技术。单片机上网技术中的一个重要部分是在单片实现 TCP/IP
    发表于 12-17 16:11 9次下载

    基于PIC单片机TCP/IP协议实现

    电子发烧友网站提供《基于PIC单片机TCP/IP协议实现.ppt》资料免费下载
    发表于 10-20 10:03 1次下载
    基于PIC<b class='flag-5'>单片机</b>的<b class='flag-5'>TCP</b>/<b class='flag-5'>IP</b><b class='flag-5'>协议</b>栈<b class='flag-5'>实现</b>