AN833
Microchip TCP/IP 协议栈
此协议栈用 C 语言编写,可使用 Microchip C18 和
Hi-Tech PICC 18 编译器。根据所使用的编译器,源文
件会自动进行必要的更改。Microchip TCP/IP 协议栈被
设计为只在 Microchip 的 PIC18 系列单片机上运行。此
外,目前该协议栈专用于在 Microchip 的 PICDEM.netTM
因特网 / 以太网演示板上运行。但是,可以十分容易地
修改使之运行在装有 PIC18 单片机的任何硬件上。
图 1:
TCP/IP 参考模型
应用层
传输层
网络互连层
主机到网络层
作者: Nilesh Rajbharti
Microchip Technology Inc.
简介
在 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 协议栈实现起来相对容易些,并且节省存储
空间。但是当集成越来越多的新应用程序时,此专用协
议栈可能会产生特殊问题。
2006 Microchip Technology Inc.
DS00833B_CN 第1 页
AN833
协议栈层
类似于 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 参考模型的结构比较
TCP/IP 参考模型
Microchip 协议栈
应用层
传输层
网络互连层
HTTP/FTP/
DHCP
StackTask
UDP/TCP
IP
ICMP
ARPTask
ARP
主机到网络层
MAC(或 SLIP)
DS00833B_CN 第2 页
2006 Microchip Technology Inc.
协议栈配置
协同式多任务处理技术允许用户的主应用程序执行自己
的任务而不必同时管理 TCP/IP 协议栈。如前所述,要
实现这个功能意味着使用 Microchip TCP/IP 协议栈的所
有应用程序也必须用协同式多任务处理方式来编写。除
了协同式多任务处理设计以外,用户必须首先了解一些
基本的配置细节。
表 1:
协议栈配置定义
定义项
数值
CLOCK_FREQ
(compiler.h)
TICKS_PER_SECONDS
TICK_PRESCALE_VALUE
MPFS_USE_PGRM
MPFS_USE_EEPROM
MPFS_RESERVE_BLOCK
EEPROM_CONTROL
STACK_USE_ICMP
STACK_USE_SLIP
STACK_USE_IP_GLEANING
STACK_USE_DHCP
STACK_USE_FTP_SERVER
STACK_USE_TCP
STACK_USE_UDP
STACK_CLIENT_MODE
TCP_NO_WAIT_FOR_ACK
MY_DEFAULT_IP_ADDR_BYTE?
MY_DEFAULT_MASK_BYTE?
MY_DEFAULT_GATE_BYTE?
MY_DEFAULT_MAC_BYTE?
振荡器频率 (Hz)
10 - 255
2, 4, 8, 16, 32,
64, 128, 256
N/A
N/A
0 - 255
外部数据
EEPROM
控制代码
N/A
N/A
N/A
N/A
N/A
N/A
N/A
N/A
N/A
0 - 255
AN833
为了简化配置过程,协议栈使用 C 编译器的 “定义项
(define)”来使能、禁止或设置某个特定参数,用户需
要更改一个或多个 “定义项”。这些 “定义项”中的大
多数是在头文件 “StackTsk.h”中定义的。在其他文
件中定义的 “定义项”会显示相应的文件名。一旦修改
了这些文件,用户必须重新编译应用程序项目来包含这
些更改。表 1 中列出了这些 “定义项”。
使用程序
Tick.c
Tick.c
Tick.c
MP 文件系统
(MPFS.c)
MPFS.c
MPFS.c
MPFS.c
用途
定义系统振荡器频率,以确定 “滴
答”计数器 (Tick Counter)值
计算一秒
确定 “滴答”计数器值
如果将程序存储器用于 MPFS 存储,
则取消该项的注释符号
如果将外部串行 EEPROM 用于
MPFS 存储,则取消该项的注释符号
启动 MPFS 存储之前要保留的字节数
寻址外部数据 EEPROM
StackTsk.c 如果不需要 ICMP,则对该项加注释符
SLIP.c
号
如果不需要 SLIP,则对该项加注释符
号
StackTsk.c 如果不需要 IP Gleaning,则对该项加
DHCP.c 和
StackTsk.c
FTP.c
TCP.c 和
StackTsk.c
UDP.c 和
StackTsk.c
注释符号
如果不需要 DHCP,则对该项加注释
符号
如果不需要 FTP 服务器,则对该项加
注释符号
如果不需要 TCP 模块,则对该项加注
释符号。如果至少有一个高级模块需
要 TCP,则自动使能此模块。
如果不需要 UDP 模块,则对该项加注
释符号。如果至少有一个高级模块需
要 UDP,则自动使能此模块。
ARP.c 和 TCP.c 将使能与客户机相关的代码
TCP.c
用户应用程序
在发送下个包之前 TCP 将等待 ACK
定义缺省的 IP、 MAC、网关和子网掩
码值。
缺省值是:
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
表 1:
协议栈配置定义 (续)
定义项
MY_IP_BYTE?
MY_MASK_BYTE?
MY_GATE_BYTE?
MY_MAC_BYTE?
MAX_SOCKETS
数值
0 - 255
使用程序
MAC.c、 ARP.c、
DHCP.c 和用户
应用程序
1 - 253
TCP.c
MAX_UDP_SOCKETS
1 - 254
UDP.c
用途
由应用程序保存 / 定义的实际 IP、
MAC、网关和子网掩码值。如果使能
了 DHCP,则这些值反映了为当前
DHCP 服务器分配的配置。
定义受支持的套接字总数 (受可用
RAM 限制)。进行编译时要对此进行
检查,确保为选定的 TCP 应用程序提
供了足够的套接字。
定义受支持的套接字总数 (受可用
RAM 限制)。进行编译时要对此进行
检查,确保为选定的 UDP 应用程序提
供了足够的套接字。
MAC_TX_BUFFER_SIZE
MAX_TX_BUFFER_COUNT
201 - 1500
1 - 255
MAX_HTTP_CONNECTIONS
MPFS_WRITE_PAGE_SIZE
(MPFS.h)
FTP_USER_NAME_LEN
(FTP.h)
MAX_HTTP_ARGS (HTTP.c)
MAX_HTML_CMD_LEN
(HTTP.c)
1 - 255
1 - 255
1 - 31
1 - 31
1 - 128
TCP.c 和 MAC.c 定义单个发送缓冲区大小
MAC.c
HTTP.c
MPFS.c
FTP.c
HTTP.c
HTTP.c
定义发送缓冲区的总数。该数目受可
用 MAC 缓冲区大小限制。
定义任意时间允许的 HTTP 连接的最
大数目
定义当前 MPFS 存储介质的可写页面
大小
定义 FTP 用户名字符串的最大长度
定义包括 HTML 表单名称在内的
HTML 表单字段的最大数目
定义 HTML 表单 URL 字符串的最大
长度
DS00833B_CN 第4 页
2006 Microchip Technology Inc.
AN833
由于组成协议栈的每个模块都驻留在各自的文件中,所
以用户必须确保在项目中包含了所有所需的文件以进行
正确的编译。表 3 (下一页)中显示了模块和所需文件
的完整列表。
使用协议栈
本应用笔记附带的文件包含 Microchip TCP/IP 协议栈、
HTTP 和 FTP 服务器以及 DHCP 和 IP Gleaning 模块的
完整源代码。还包含了一个使用此协议栈的应用程序示
例。
有多个MPLAB®项目文件用来说明协议栈可以采用的所
有配置。表 2 中描述了这些项目文件。
表 2:
协议栈项目文件
项目名称
HtNICEE.pjt
HtNICPG.pjt
HtSlEE.pjt
HtSlPG.pjt
MPNICEE.pjt
MPNICPG.pjt
MPSlEE.pjt
MPSlPG.pjt
用途
使用的 “定义项”
使用网络接口控制器 (Network Interface
Controller, NIC)和外部串行 EEPROM 的
Microchip TCP/IP 协议栈——Hi-Tech 编译器。
使用 IP Gleaning、 DHCP、 FTP 服务器、 ICMP
和 HTTP 服务器。
使用 NIC 和内部程序存储器的 Microchip TCP/IP
协议栈——Hi-Tech 编译器。
使用 IP Gleaning、DHCP、ICMP 和 HTTP 服务
器。
使用 SLIP 和外部串行 EEPROM 的 Microchip
TCP/IP 协议栈——Hi-Tech 编译器。
使用 FTP 服务器、 ICMP 和 HTTP 服务器。
使用 SLIP 和内部程序存储器的 Microchip
TCP/IP 协议栈——Hi-Tech 编译器。
使用 ICMP 和 HTTP 服务器。
使用 NIC 和外部串行 EEPROM 的 Microchip
TCP/IP 协议栈——Microchip C18 编译器。
使用 ICMP 和 HTTP 服务器。
MPFS_USE_EEPROM,
STACK_USE_IP_GLEANING,
STACK_USE_DHCP,
STACK_USE_FTP_SERVER,
STACK_USE_ICMP,
STACK_USE_HTTP_SERVER
MPFS_USE_PGRM,
STACK_USE_IP_GLEANING,
STACK_USE_DHCP,
STACK_USE_ICMP,
STACK_USE_HTTP_SERVER
STACK_USE_SLIP,
MPFS_USE_EEPROM,
STACK_USE_FTP_SERVER,
STACK_USE_ICMP,
STACK_USE_HTTP_SERVER
STACK_USE_SLIP,
MPFS_USE_PGRM,
STACK_USE_ICMP,
STACK_USE_HTTP_SERVER
MPFS_USE_EEPROM,
STACK_USE_ICMP,
STACK_USE_HTTP_SERVER
使用 NIC 和内部程序存储器的 Microchip TCP/IP
协议栈——Microchip C18 编译器。
使用 ICMP 和 HTTP 服务器。
MPFS_USE_PGRM,
STACK_USE_ICMP,
STACK_USE_HTTP_SERVER
使用 SLIP 和外部串行 EEPROM 的 Microchip
TCP/IP 协议栈——Microchip C18 编译器。
使用 ICMP 和 HTTP 服务器。
使用 SLIP 和内部程序存储器的 Microchip
TCP/IP 协议栈——Microchip C18 编译器。
使用 ICMP 和 HTTP 服务器。
STACK_USE_SLIP,
MPFS_USE_EEPROM,
STACK_USE_ICMP,
STACK_USE_HTTP_SERVER
STACK_USE_SLIP,
MPFS_USE_PGRM,
STACK_USE_ICMP,
STACK_USE_HTTP_SERVER
2006 Microchip Technology Inc.
DS00833B_CN 第5 页
AN833
表 3:
MICROCHIP TCP/IP 协议栈模块和文件要求
模块
所需的文件
用途
MAC
SLIP
ARP
IP
ICMP
TCP
UDP
Stack Manager
HTTP Server
DHCP Client
MAC.c
Delay.c
SLIP.c
ARP.c
ARPTsk.c
MAC.c 或 SLIP.c
Helpers.c
IP.c
MAC.c 或 SLIP.c
Helpers.c
ICMP.c
StackTsk.c
IP.c
MAC.c 或 SLIP.c
Helpers.c
StackTsk.c
TCP.c
IP.c
MAC.c 或 SLIP.c
Helpers.c
Tick.c
StackTsk.c
UDP.c
IP.c
MAC.c 或 SLIP.c
Helpers.c
StackTsk.c
TCP.c
IP.c
ICMP.c
ARPTsk.c
ARP.c
MAC.c 或 SLIP.c
Tick.c
Helpers.c
HTTP.c
TCP.c
IP.c
MAC.c 或 SLIP.c
Helpers.c
Tick.c
MPFS.c
XEEPROM.c(1)
DHCP.c
UDP.c
IP.c
MAC.c
Helpers.c
Tick.c
介质访问层 (Media Access Layer)
用于 SLIP 的介质访问层
地址解析协议 (Address Resolution Protocol)
网际协议 (Internet Protocol)
网际控制报文协议 (Internet Control Message Protocol)
传输控制协议 (Transmission Control Protocol)
用户数据报文协议 (User Datagram Protocol)
协议栈管理器 (“StackTask”),协调其他 Microchip TCP/IP 协
议栈模块
超文本传输协议服务器 (HyperText Transfer Protocol Server)
动态主机配置协议 (Dynamic Host Configuration Protocol)
注 1:只有在 MPFS 存储选项中使能外部串行 EEPROM (MPFS_USE_EEPROM 定义)后才需要。如果选择此选
项,则必须包含相应的 MPFS 映像文件。(详情请参见第 84 页的 “MPFS Image Builder”。)
DS00833B_CN 第6 页
2006 Microchip Technology Inc.
AN833
表 3:
MICROCHIP TCP/IP 协议栈模块和文件要求 (续)
模块
IP Gleaning
FTP Server
所需的文件
用途
StackTsk.c
ARP.c
ARPTsk.c
ICMP.c
MAC.c 或 SLIP.c
FTP.c
TCP.c
IP.c
MAC.c 或 SLIP.c
只配置节点 IP 地址。
文件传输协议服务器 (File Transfer Protocol Server)。
注 1:只有在 MPFS 存储选项中使能外部串行 EEPROM (MPFS_USE_EEPROM 定义)后才需要。如果选择此选
项,则必须包含相应的 MPFS 映像文件。(详情请参见第 84 页的 “MPFS Image Builder”。)
一旦包含了相应的文件设置项目后,就必须修改主应用
程序源文件来包含例 1 中所示的编程语句。如需完整的
工作示例,请参见 “Websrvr.c”的源代码。该源文
件与其他协议栈文件一起实现了 HTTP 服务器。
要了解协同式多任务应用程序是如何执行的,请参见
HTTP.c 的源代码(HTTP 服务器任务)。如果不使用协
同式多任务工作模式,使用协议栈的应用程序需要将它
们的作业划分为多个较小的任务,每个任务都被限制为
不能独占 CPU 太长的时间。“HTTP.c”的代码说明了
状态机方法,即将长应用程序分为较小的状态机状态,
在作业等待特定事件期间需将控制权归还给主应用程
序。
2006 Microchip Technology Inc.
DS00833B_CN 第7 页
AN833
例 1:
// 声明该文件为主应用程序
#define THIS_IS_STACK_APPLICATION
补充到主应用程序的代码
#include “StackTsk.h”
#include “Tick.h”
#include “dhcp.h” // 只有在使用 DHCP 时
#include “http.h” // 只有在使用 HTTP 时
#include “ftp.h” // 只有在使用 FTP 时
// 其他应用程序特定的包含文件
...
// 主程序入口
void main(void)
{
// 执行应用程序的初始化
...
// 初始化协议栈各组成部分
// 如果使用 StackApplication,同样要对它进行初始化
TickInit();
StackInit();
HTTPInit(); // 只有在使用 HTTP 时
FTPInit(); // 只有在使用 FTP 时
// 进入无限程序循环
while(1)
{
// 更新 “滴答”计数器。可通过中断完成
TickUpdate();
// 协议栈管理器执行其任务
StackTask();
// 协议栈应用程序执行其任务
HTTPServer();
FTPServer();
// 只有在使用 HTTP 时
// 只有在使用 FTP 时
// 应用程序逻辑驻留于此
DoAppSpecificTask();
}
}
DS00833B_CN 第8 页
2006 Microchip Technology Inc.