MSP430上实现tcpip协议栈

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

TCP/IP协议栈在MSP430单片机上的实现TCP/IP协议栈在MSP430单片机上的实现引言随着信息技术的不断发展,以及人们对日常生活舒适度、方便度要求的提高,信息家电、智能仪表等产品越来越频繁的出现在我们的生活当中;人们也越来越热衷于把家电、仪表等设备连接到Internet中,从而可以方便、及时的对它们进行远程察看、远程控制。把这些设备接入Internet,就需要考虑TCP/IP网络协议的实现。MSP430系列单片机是由TI公司开发的16位单片机,其突出特点是超低功耗,非常适合于各种功率要求比较低的场合,该系列已经应用在智能仪表、医疗设备和保安系统等方面。本文给出了在MSP430F149硬件平台上移植TCP/IP协议的方案,实现了终端设备到Internet的接入。嵌入式TCP/IP协议栈uIPTCP/IP是一个协议族,它是一个四层网络协议模型,分别包含应用层、传输层、网络层、网络接口层。应用层定义清晰的会话过程,平常所用的协议如HTTP、FTP、SMTP、Telnet等都属于应用层。传输层提供端对端的通信,该层协议有传输控制协议(TCP)和用户数据协议(UDP)。网络层负责数据打包和逻辑寻址,这一层的协议有IP、ICMP、ARP等协议。网络接口层负责在源和目的节点间的线路上进行无差错的传送数据,并且具有流量控制等功能。在嵌入式系统中,应用TCP/IP协议是主要为了完成数据采集和数据传输,不需要实现网页浏览、文件传输等功能,同时,MSP430芯片也没有足够的空间资源实现所有的TCP/IP协议,所以在本文的方案中,采用了UIPTCP/IP栈。它是瑞士计算机科学院的AdamDunkels等开发的一种免费公开源代码的小型TCP/IP协议栈,它专门为8位和16位MCU编写。uIP代码的大小和RAM的需求比其它一般的TCP/IP栈要小得多。UIP实现了TCP/IP协议组的四个基本协议:ARP(地址解析协议),IP(网际协议),ICMP(因特网信息控制协议)和TCP(传输控制协议)。链路层协议例如PPP等可以由UIP下面的设备驱动实现;应用层协议例如HTTP、FTP、SMTP、Telnet等可以由uIP之上的应用程序实现。ARP协议ARP协议把目标IP地址解析为相应的以太网MAC地址。当一个IP包要在以太网上发出时,先查询ARP表,找出包要发送去的MAC地址。如果在表里找不到对应的IP地址,就会广播ARP请求包,以获取给出IP地址所对应的MAC地址。目的主机收到请求包后发出一个ARP回应包,给出自己的MAC地址和IP地址。当ARP表中没有对应的地址条目时,就会发送ARP请求包时,同时该请求包会覆盖掉发出请求的IP包,以节省储存器。ARP表每十秒更新一次。IP协议UIP的IP协议主要负责验证输入包的IP头的正确性,以及在ICMP和TCP之间复用数据包。IP层没有实现数据包的分段和重组,从而代码得到极大的简化。ICMP协议ICMP中echo和echoreply信息常常用在ping程序里,以检查目的主机能否连通。在uIP只实现echo。在处理收到的echo信息时,只需要把ICMP类型字段从“echo”类型改变到“echoreply”类型,调整ICMP校验和,并互掉IP数据包头里的目的地址和源地址,把包发回到发送方。TCP为了减少储存器的使用,在UIP里,TCP不再实现发送和接收数据的窗口调整;不会缓存刚刚收到的TCP段,而是立即由应用程序处理,应用程序可以自己缓冲数据;在输出数据时,在每个连接只能有一个正在传输的TCP段。以上四个协议实现的过程中,极大的简化了代码和处理过程,节省了存储空间和缓存空间。UIP协议栈的接口UIP协议通过一系列接口函数与底层系统和上层应用通信,它内部的协议集合对外部系统来说是透明的,从而增强了该协议的通用性和独立性,可以非常方便地移植到不同系统和应用平台。图1描述了UIP、底层系统和应用程序三者之间的调用关系。其中UIP提供了三个函数给底层系统:UIP_init(),UIP_input(),UIP_periodic()。应用程序向UIP提供一个调用函数UIP_APPCALL(),在网络事件或计时事件发生时进行调用;同时,UIP也要向应用程序提供一些与协议栈的接口函数,应用程序根据接口函数提供的信息或者状态,执行相应的操作。图1UIP协议栈接口UIP应用接口UIP使用基于事件的程序模式,应用程序由C语言函数实现。当收发数据、新连接建立或者数据需要重新传输时,UIP都会调用应用程序。同时,应用程序还要周期查询是否有新的数据收发。因为应用程序只提供了一个回调函数,所以应用程序还要把不同的网络服务映射到不同的端口和连接。UIP在接受到底层传来的数据包后,如果需要送上层应用程序处理,就调用UIP_APPCALL()。同时,UIP设置结构体UIP_conn指针指向当前连接。UIP_conn记录一条TCP连接的所有相关信息,它是维持uIP运行的关键结构,定义如下:structuip_conn{u8_ttcpstateflags;PPTCP的状态和标志u16_tlport,rport;PP当地和远端端口u16_tripaddr[2];PP远端的IP地址u8_trcv-nxt[4];PP下一个要接收的序列号u8_tsnd-nxt[4];PP上一个已发送的序列号u8_tack-nxt[4];PP对端下一个应答序列号u8_ttimer;PP重传时间u8_tnrtx;PP计算特殊段的重发数量u8_tmss;PP连接中最大分段的大小u8_tappstate[UIP_APPSTATE_SIZE];};UIP提供给应用程序的接口函数如:uip_listen()、uip_connect()、uip_send()、uip_datalen()、uip_close()、uip_abort()、uip_stop()、uip_stopped()、uip_restart()等,实现了TCP/IP协议栈的基本功能。UIP系统接口从系统的角度来分析,UIP包含3个C函数:uip_init(),uip_input(),和uip_periodic()。uip_init()函数初始化uIP协议栈,在系统启动期间调用。其中uIP_input()和uIP_periodic()实质上都是使用uIP_process(),但它们调用的参数和使用情况不一样。当网络设备接收到新数据时调用函数uip_input();uip_periodic()周期性运行,通常一秒调用一次。当设备驱动程序发数据包到缓存(uip_buf)时,系统应该调用uip_input()函数。函数将会处理这个包,并在需要时调用应用程序。当uip_input()返回时,会有一个输出包放在包缓存里。包的大小由全局变量uip_len约束,如果uip_len是0,说明没有数据包要发送。周期时钟函数用于驱动UIP内部时钟事件。当周期计时被激活时,uip_periodic()函数被调用。连接号作为参数传递给uip_periodic()函数。如果有数据输出,则输出的IP包放在包缓存里。下面是察看输出包的一小段代码,它调用了uip_periodic()函数。其中netdev-send()是网络驱动部分,负责将uip_buf数组的内容发出到网上。for(i=0;iUIP-CONNS;++i){uip_periodic(i);if(uip_len0)netdev_send();}UIP协议移植到MSP430F149基于MSP430F149的嵌入式TCP/IP网络通信系统硬件部分主要包括MSP430芯片、以太网控制器CS8900A和以太网接口,软件部分包括设备驱动程序、嵌入式TCP/IP协议栈等部分。图2方案的硬件实现硬件的实现本方案的单片机选择MSP430F149完成TCP/IP协议的解释和执行,以太网控制器芯片CS89200A实现遵循的IEEE802.3协议的CSMAPCD和CRC校验等功能,以太网隔离变压器HR601627转换电平抑制高频干扰接入以太网,最后通过RJ245接口实现终端设备接入Internet。MSP430F149是一款16位超低功耗单片机,具有强大的处理能力,RISC结构,125ns的指令周期,具有丰富的片内外设,如硬件乘法器、ADC、定时器、看门狗等。它内部具有2KB的RAM和60KB的FLASH,寻址空间达64K。它适用于工业控制领域,同样也适用于处理复杂的TCP/IP协议。CS8900A是CIRRUSLOGIC公司的一种低价格、高集成度、单芯片、全双工的以太网控制器,也是专门为嵌入式系统设计优化的以太网控制器。CS8900A有三种工作方式:IPO方式、存储器方式和DMA方式。我们选择IPO方式,以便利用8-bit数据总线,该总线连接到MSP430的IPO-port5。IOR和IOW是控制线,指示进程是否有读P写访问。UIP应用接口UIP使用基于事件的程序模式,应用程序由C语言函数实现。当收发数据、新连接建立或者数据需要重新传输时,UIP都会调用应用程序。同时,应用程序还要周期查询是否有新的数据收发。因为应用程序只提供了一个回调函数,所以应用程序还要把不同的网络服务映射到不同的端口和连接。UIP在接受到底层传来的数据包后,如果需要送上层应用程序处理,就调用UIP_APPCALL()。同时,UIP设置结构体UIP_conn指针指向当前连接。UIP_conn记录一条TCP连接的所有相关信息,它是维持uIP运行的关键结构,定义如下:structuip_conn{u8_ttcpstateflags;PPTCP的状态和标志u16_tlport,rport;PP当地和远端端口u16_tripaddr[2];PP远端的IP地址u8_trcv-nxt[4];PP下一个要接收的序列号u8_tsnd-nxt[4];PP上一个已发送的序列号u8_tack-nxt[4];PP对端下一个应答序列号u8_ttimer;PP重传时间u8_tnrtx;PP计算特殊段的重发数量u8_tmss;PP连接中最大分段的大小u8_tappstate[UIP_APPSTATE_SIZE];};UIP提供给应用程序的接口函数如:uip_listen()、uip_connect()、uip_send()、uip_datalen()、uip_close()、uip_abort()、uip_stop()、uip_stopped()、uip_restart()等,实现了TCP/IP协议栈的基本功能。UIP系统接口从系统的角度来分析,UIP包含3个C函数:uip_init(),uip_input(),和uip_periodic()。uip_init()函数初始化uIP协议栈,在系统启动期间调用。其中uIP_input()和uIP_periodic()实质上都是使用uIP_process(),但它们调用的参数和使用情况不一样。当网络设备接收到新数据时调用函数uip_input();uip_periodic()周期性运行,通常一秒调用一次。当设备驱动程序发数据包到缓存(uip_buf)时,系统应该调用uip_input()函数。函数将会处理这个包,并在需要时调用应用程序。当uip_input()返回时,会有一个输出包放在包缓存里。包的大小由全局变量uip_len约束,如果uip_len是0,说明没有数据包要发送。周期时钟函数用于驱动UIP内部时钟事件。当周期计时被激活时,uip_periodic()函数被调用。连接号作为参数传递给uip_periodic()函数。如果有数据输出,则输出的IP包放在包缓存里。下面是察看输出包的一小段代码,它调用了uip_periodic()函数。其中netdev-send()是网络驱动部分,负责将uip_buf数组的内容发出到网上。for(i=0;iUIP-CONNS;++i){uip_periodic(i);if(uip_len0)netdev_send();}UIP协议移植到MSP430F149基于MSP4

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功