AN833
简介
在Microchip单片机上实现TCP/IP(传输控制协议/网际协议)不需要任何创新之举。感兴趣的开发人员可以很容易到许多Microchip产品的商业和非商业的TCP/IP实现方案。本应用笔记详细说明了Microchip公司自己免费提供的TCP/IP协议栈。
Microchip TCP/IP协议栈是一套程序,它服务于标准的、基于TCP/IP的应用程序(HTTP服务器或邮件客户机等),或者使用在定制的、基于TCP/IP的应用程序中。为了更好地说明这一点,在本文档的末尾描述了一个完整的HTTP服务器应用程序,同时给出了协议栈的源代码。
Microchip TCP/IP协议栈是按照模块化方式实现的,它所有的服务创建了高度抽象的协议层。潜在用户使用时不需要知道TCP/IP规范的所有复杂细节。实际上,只对实现HTTP服务器应用程序感兴趣的用户并不需要知晓任何有关TCP/IP的具体知识。(关于HTTP服务器的具体信息请参见从第77页开始的部分。)
本应用笔记并没有深入讨论TCP/IP协议。建议对该协议细节感兴趣的用户阅读RFC(Request For Comment)文档。在本文档的末尾可以到一部分主要RFC编号列表。
协议栈架构
许多TCP/IP的实现方案都遵循了称为“TCP/IP参考模型”的软件架构。基于此模型的软件被分成多层,一层一层地堆叠(故称为“TCP/IP协议栈”),并且每层接受来自该层下面的一层或多层的服务。图1中显示了TCP/IP协议栈模型的一个简化版本。
根据规范,许多TCP/IP层都是“活动的”,这意味着不仅在被请求服务时,而且在像超时或新包到达这样的事件发生时,它们都会作出反应。带有大量数据存储器和程序存储器的系统可以十分容易地满足这些要求。多任务操作系统可以提供额外工具,帮助程序实现模块化。但是当系统只使用8位单片机以及几百字节的RAM 和有限的程序存储器时,该任务变得十分困难。此外,如果不能访问一个多任务操作系统,用户必须特别注意要保证协议栈独立于主应用程序。集成在主应用程序中的TCP/IP协议栈实现起来相对容易些,并且节省存储空间。但是当集成越来越多的新应用程序时,此专用协议栈可能会产生特殊问题。此协议栈用C语言编写,可使用Microchip C18和Hi-Tech PICC 18编译器。根据所使用的编译器,源文件会自动进行必要的更改。Microchip TCP/IP协议栈被设计为只在Microchip的PIC18系列单片机上运行。此外,目前该协议栈专用于在Microchip的PICDEM TM 因特网/以太网演示板上运行。但是,可以十分容易地修改使之运行在装有PIC18单片机的任何硬件上。
图1:TCP/IP参考模型
作者:Nilesh Rajbharti
Microchip Technology Inc.
应用层
传输层
网络互连层
主机到网络层
Microchip TCP/IP协议栈
2006 Microchip Technology Inc.DS00833B_CN 第1页
AN833
DS00833B_CN 第2页 2006 Microchip Technology Inc.
协议栈层
类似于TCP/IP 参考模型,Microchip TCP/IP 协议栈将TCP/IP 协议栈分为多层(图2)。每层的实现代
码驻留在一个独立的源文件中,而服务和应用程序编程接口(Application Programming Interfaces ,API )是通过头文件或包含文件定义的。与TCP/IP 参考模型不同的是,Microchip TCP/IP 协议栈中的许多层可以直接访问不正好在它下面的一层或多层。关于一个层是否绕过相邻模块来获得所需的服务,主要根据开销的大小以及服务是否需要智能处理后才能传递到下一层来决定。 与传统TCP/IP 协议栈实现方法不同的另外一个地方是添加了两个新模块:“StackTask ”和“ARPTask ”。“StackTask ”管理协议栈及其所有模块的操作,而“ARPTask ”管理地址解析协议(Address Resolution Protocol ,ARP )层的服务。
如前面所提到的,TCP/IP 协议栈是“活动的”,它的某些层必须能异步执行某些定时操作。为了能满足这个要求,并与使用其服务的主应用程序保持相对独立,Microchip TCP/IP 协议栈使用了一种众所周知的技术,称为协同式多任务处理(Cooperative Multitasking )技
术。在协同式多任务处理系统中,同时存在多个任务,
每个任务执行自己的作业然后交回控制权,这样下个任务才能够执行作业。就此而论,“StackTask ”和“ARPTask ”都是协同式任务。 通常,协同式多任务处理(或任何其他类型的多任务处理)是由操作系统或主应用程序自身来实现的。Microchip TCP/IP 协议栈被设计为独立于任何操作系统,可实现它自己的协同式多任务处理系统。因此,它可以被应用在任何系统中,而不论该系统是否为多任务操作系统。
但是,使用Microchip TCP/IP 协议栈的应用程序自身必须使用协同式多任务处理方法。可以通过将其作业分为多个任务,或将主作业组织为有限状态机(Finite State Machine ,FSM )并将长作业分为多个较小的作业来实现。本文档中稍后讨论的HTTP 服务器就遵循了后一种方法,并具体解释了如何实现协同式应用程序。 请注意Microchip TCP/IP 协议栈并没有实现TCP/IP 协议栈中通常有的所有模块。尽管不提供,但是在需要时可以将它们作为单独的任务或模块来实现。Microchip 将在该协议栈的基础上实现其他协议。
图2:MICROCHIP TCP/IP 协议栈与TCP/IP 参考模型的结构比较
HTTP/FTP/StackTask
UDP/TCP
ICMP
IP MAC (或SLIP )
ARPTask ARP
应用层
传输层
网络互连层
主机到网络层
TCP/IP 参考模型
Microchip 协议栈
DHCP
AN833
协议栈配置
协同式多任务处理技术允许用户的主应用程序执行自己的任务而不必同时管理TCP/IP协议栈。如前所述,要实现这个功能意味着使用Microchip TCP/IP协议栈的所有应用程序也必须用协同式多任务处理方式来编写。除了协同式多任务处理设计以外,用户必须首先了解一些基本的配置细节。
为了简化配置过程,协议栈使用C编译器的“定义项(define)”来使能、禁止或设置某个特定参数,用户
需要更改一个或多个“定义项”。这些“定义项”中的大多数是在头文件“StackTsk.h”中定义的。在其他文件中定义的“定义项”会显示相应的文件名。一旦修改了这些文件,用户必须重新编译应用程序项目来包含这些更改。表1中列出了这些“定义项”。
表1:协议栈配置定义
定义项数值使用程序用途
CLOCK_FREQ (compiler.h)振荡器频率(Hz)Tick.c定义系统振荡器频率,以确定“滴
答”计数器(Tick Counter)值
TICKS_PER_SECONDS10 - 255Tick.c计算一秒
TICK_PRESCALE_VALUE2, 4, 8, 16, 32,
64, 128, 256
Tick.c确定“滴答”计数器值
MPFS_USE_PGRM N/A MP文件系统
(MPFS.c)如果将程序存储器用于MPFS存储,则取消该项的注释符号
MPFS_USE_EEPROM N/A MPFS.c如果将外部串行EEPROM用于
MPFS存储,则取消该项的注释符号MPFS_RESERVE_BLOCK0 - 255MPFS.c启动MPFS存储之前要保留的字节数EEPROM_CONTROL外部数据
EEPROM
控制代码
MPFS.c寻址外部数据EEPROM
STACK_USE_ICMP N/A StackTsk.c 如果不需要ICMP,则对该项加注释符
号
STACK_USE_SLIP N/A SLIP.c如果不需要SLIP,则对该项加注释符
号
STACK_USE_IP_GLEANING N/A StackTsk.c 如果不需要IP Gleaning,则对该项加
注释符号
STACK_USE_DHCP N/A DHCP.c和
StackTsk.c 如果不需要DHCP,则对该项加注释符号
STACK_USE_FTP_SERVER N/A FTP.c如果不需要FTP服务器,则对该项加
注释符号
STACK_USE_TCP N/A TCP.c和
StackTsk.c 如果不需要TCP模块,则对该项加注释符号。如果至少有一个高级模块需要TCP,则自动使能此模块。
STACK_USE_UDP N/A UDP.c和
StackTsk.c 如果不需要UDP模块,则对该项加注释符号。如果至少有一个高级模块需要UDP,则自动使能此模块。
STACK_CLIENT_MODE N/A ARP.c和TCP.c将使能与客户机相关的代码
TCP_NO_WAIT_FOR_ACK N/A TCP.c在发送下个包之前TCP将等待ACK
MY_DEFAULT_IP_ADDR_BYTE? MY_DEFAULT_MASK_BYTE? MY_DEFAULT_GATE_BYTE? MY_DEFAULT_MAC_BYTE?0 - 255用户应用程序定义缺省的IP、MAC、网关和子网掩
码值。
tcpip协议中基于tcp协议的应用程序缺省值是:
10.10.5.15(IP地址)
00:04:163:00:00:00(MAC)
10.10.5.15(网关)
255.255.255.0(子网掩码)
2006 Microchip Technology Inc.DS00833B_CN 第3页
AN833
DS00833B_CN 第4页 2006 Microchip Technology Inc.
MY_IP_BYTE?MY_MASK_BYTE?MY_GATE_BYTE?MY_MAC_BYTE?0 - 255
MAC.c 、ARP.c 、DHCP.c 和用户 应用程序
由应用程序保存/定义的实际IP 、MAC 、网关和子网掩码值。如果使能了DHCP ,则这些值反映了为当前DHCP 服务器分配的配置。
MAX_SOCKETS
1 - 253
TCP.c
定义受支持的套接字总数(受可用RAM 限制)。进行编译时要对此进行检查,确保为选定的TCP 应用程序提供了足够的套接字。
MAX_UDP_SOCKETS 1 - 254UDP.c
定义受支持的套接字总数(受可用RAM 限制)。进行编译时要对此进行检查,确保为选定的UDP 应用程序提供了足够的套接字。MAC_TX_BUFFER_SIZE 201 - 1500TCP.c 和MAC.c
定义单个发送缓冲区大小
MAX_TX_BUFFER_COUNT 1 - 255MAC.c 定义发送缓冲区的总数。该数目受可用MAC 缓冲区大小限制。
MAX_HTTP_CONNECTIONS 1 - 255HTTP.c 定义任意时间允许的HTTP 连接的最大数目
MPFS_WRITE_PAGE_SIZE (MPFS.h )
1 - 255MPFS.c 定义当前MPFS 存储介质的可写页面大小
FTP_USER_NAME_LEN (FTP.h )
1 - 31FTP.c 定义FTP 用户名字符串的最大长度MAX_HTTP_ARGS (HTTP.c ) 1 - 31HTTP.c 定义包括HTML 表单名称在内的HTML 表单字段的最大数目MAX_HTML_CMD_LEN (HTTP.c )
1 - 128
HTTP.c
定义HTML 表单URL 字符串的最大长度
表1:
协议栈配置定义 (续)
定义项
数值使用程序用途
AN833
使用协议栈
本应用笔记附带的文件包含Microchip TCP/IP协议栈、HTTP和FTP服务器以及DHCP和IP Gleaning模块的完整源代码。还包含了一个使用此协议栈的应用程序示例。
有多个MPLAB®项目文件用来说明协议栈可以采用的所有配置。表2中描述了这些项目文件。由于组成协议栈的每个模块都驻留在各自的文件中,所以用户必须确保在项目中包含了所有所需的文件以进行正确的编译。表3(下一页)中显示了模块和所需文件的完整列表。
表2:协议栈项目文件
项目名称用途使用的“定义项”
HtNICEE.pjt使用网络接口控制器(Network Interface
Controller,NIC)和外部串行EEPROM的
Microchip TCP/IP协议栈——Hi-Tech编译器。
使用IP Gleaning、DHCP、FTP服务器、ICMP
和HTTP服务器。MPFS_USE_EEPROM, STACK_USE_IP_GLEANING, STACK_USE_DHCP,
STACK_USE_FTP_SERVER, STACK_USE_ICMP,
STACK_USE_HTTP_SERVER
HtNICPG.pjt使用NIC和内部程序存储器的Microchip TCP/IP
协议栈——Hi-Tech编译器。
使用IP Gleaning、DHCP、ICMP和HTTP服务
器。MPFS_USE_PGRM,
STACK_USE_IP_GLEANING, STACK_USE_DHCP,
STACK_USE_ICMP,
STACK_USE_HTTP_SERVER
HtSlEE.pjt使用SLIP和外部串行EEPROM的Microchip
TCP/IP协议栈——Hi-Tech编译器。
使用FTP服务器、ICMP和HTTP服务器。STACK_USE_SLIP,
MPFS_USE_EEPROM, STACK_USE_FTP_SERVER, STACK_USE_ICMP, STACK_USE_HTTP_SERVER
HtSlPG.pjt使用SLIP和内部程序存储器的Microchip
TCP/IP协议栈——Hi-Tech编译器。
使用ICMP和HTTP服务器。STACK_USE_SLIP,
MPFS_USE_PGRM, STACK_USE_ICMP, STACK_USE_HTTP_SERVER
MPNICEE.pjt使用NIC和外部串行EEPROM的Microchip
TCP/IP协议栈——Microchip C18编译器。
使用ICMP和HTTP服务器。MPFS_USE_EEPROM, STACK_USE_ICMP, STACK_USE_HTTP_SERVER
MPNICPG.pjt使用NIC和内部程序存储器的Microchip TCP/IP
协议栈——Microchip C18编译器。
使用ICMP和HTTP服务器。MPFS_USE_PGRM, STACK_USE_ICMP, STACK_USE_HTTP_SERVER
MPSlEE.pjt使用SLIP和外部串行EEPROM的Microchip
TCP/IP协议栈——Microchip C18编译器。
使用ICMP和HTTP服务器。STACK_USE_SLIP,
MPFS_USE_EEPROM, STACK_USE_ICMP, STACK_USE_HTTP_SERVER
MPSlPG.pjt使用SLIP和内部程序存储器的Microchip
TCP/IP协议栈——Microchip C18编译器。
使用ICMP和HTTP服务器。STACK_USE_SLIP,
MPFS_USE_PGRM, STACK_USE_ICMP, STACK_USE_HTTP_SERVER
2006 Microchip Technology Inc.DS00833B_CN 第5页
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论