没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
2010 Microchip Technology Inc. DS00833C_CN 第1 页
AN833
简介
在 Microchip 单片机上实现传输控制协议 / 网际协议
(Transmission Control Protocol/Internet Protocol,
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 协议。建议对该协
议细节感兴趣的用户阅读请求注解 (Request For
Comment,RFC)文档。在本文档的末尾可以找到一部
分主要 RFC 编号列表。
协议栈架构
许多 TCP/IP 的实现方案都遵循了称为“TCP/IP 参考模
型”的软件架构。基于此模型的软件被分成多层,一层
一层地堆叠(故称为“TCP/IP 协议栈”),并且每层接
受来自该层下面的一层或多层的服务。图 1 中显示了
TCP/IP 协议栈模型的简化版本。
根据规范,许多 TCP/IP 层都是 “活动的”,这意味着
不仅在被请求服务时,而且在像超时或新包到达这样的
事件发生时,它们都会作出反应。带有大量数据存储器
和程序存储器的系统可以十分容易地满足这些要求。多
任务操作系统可以提供额外工具,帮助程序实现模块
化。但是当系统只使用 8位单片机以及几百字节的 RAM
和有限的程序存储器时,该任务变得十分困难。此外,
如果不能访问一个多任务操作系统,用户必须特别注意
要保证协议栈独立于主应用程序。集成在主应用程序中
的 TCP/IP 协议栈实现起来相对容易些,并且节省存储
空间。但是当集成越来越多的新应用程序时,此专用协
议栈可能会产生特殊问题。
此协议栈用 C 语言编写,可使用 Microchip C18 和
HI-TECH C
®
PICC-18™ 编译器。根据所使用的编译
器,源文件会自动进行必要的更改。 Microchip TCP/IP
协议栈被设计为只在 Microchip 的 PIC18 系列单片机上
运行。此外,目前该协议栈专用于在 Microchip 的
PICDEM.net™ 因特网 / 以太网演示板上运行。但是,可
以十分容易地修改使之运行在装有PIC18单片机的任何
硬件上。
图 1: TCP/IP 参考模型
注: 本应用笔记最初是为 Microchip 于 2002 年发
布的 TCP/IP 协议栈编写的;之后协议栈经
过多次更新。最新的 API 信息在 Windows
®
帮助文件 TCPIP Stack Help.chm 中提
供,此帮助文件随最新的 TCP/IP 协议栈提
供,可从 http://www.microchip.com/tcpip 下
载。协议栈目前支持 8 位、 16 位及 32 位
PIC
®
和 dsPIC
®
器件。本应用笔记仍可作为
有用的参考资料。
作者:
Nilesh Rajbharti
Microchip Technology Inc.
应用层
传输层
网络互连层
主机到网络层
Microchip TCP/IP 协议栈
AN833
DS00833C_CN 第2 页 2010 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
2010 Microchip Technology Inc. DS00833C_CN 第3 页
AN833
协议栈配置
协同式多任务处理技术允许用户的主应用程序执行自己
的任务而不必同时管理 TCP/IP 协议栈。如前所述,要
实现这个功能意味着使用 Microchip TCP/IP协议栈的所
有应用程序也必须用协同式多任务处理方式来编写。除
了协同式多任务处理设计以外,用户必须首先了解一些
基本的配置细节。
为了简化配置过程,协议栈使用 C 编译器的“define”。
要使能、禁止或设置某个特定参数,用户需要更改一个
或多个 “define”。这些 “define”中的大多数是在头
文件 “StackTsk.h”中定义的。在其他文件中定义的
“define”会显示相应的文件名。一旦修改了这些文件,
用户必须重新编译应用程序项目来包含这些更改。表 1
中列出了这些 “define”。
表 1: 协议栈配置定义
定义项
数值 使用程序 用途
CLOCK_FREQ
(compiler.h)
振荡器频率 (Hz)
Tick.c
定义系统振荡器频率,以确定时钟节
拍计数器 (Tick Counter)值
TICKS_PER_SECONDS 10 - 255 Tick.c
计算一秒
TICK_PRESCALE_VALUE 2, 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_BLOCK 0 - 255 MPFS.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,则自动使能此模块。
STA
CK_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、网关和子网掩
码值。
缺省值是:
10.10.5.15 (IP 地址)
00:04:163:00:00:00 (MAC)
10.10.5.15 (网关)
255.255.255.0 (子网掩码)
AN833
DS00833C_CN 第4 页 2010 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 - 254 UDP.c
定义受支持的套接字总数 (受可用
RAM 限制)。进行编译时要对此进行
检查,确保为选定的 UDP 应用程序提
供了足够的套接字。
MAC_TX_BUFFER_SIZE 201 - 1500 TCP.c 和 MAC.c
定义单个发送缓冲区大小
MAX_TX_BUFFER_COUNT 1 - 255 MAC.c
定义发送缓冲区的总数。该数目受可
用 MAC 缓冲区大小限制。
MAX_HTTP_CONNECTIONS 1 - 255 HTTP.c
定义任意时间允许的 HTTP 连接的最
大数目
MPFS_WRITE_PAGE_SIZE
(MPFS.h)
1 - 255 MPFS.c
定义当前 MPFS 存储介质的可写页面
大小
FTP_USER_NAME_LEN
(FTP.h)
1 - 31 FTP.c
定义 FTP 用户名字符串的最大长度
MAX_HTTP_ARGS (HTTP.c) 1 - 31 HTTP.c
定义包括 HTML 表单名称在内的
HTML 表单字段的最大数目
MAX_HTML_CMD_LEN
(HTTP.c)
1 - 128 HTTP.c
定义 HTML 表单 URL 字符串的最大长
度
表 1: 协议栈配置定义 (续)
定义项
数值 使用程序 用途
2010 Microchip Technology Inc. DS00833C_CN 第5 页
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 C
®
编译
器。
使用 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 C 编译器。
使用 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 C 编译器。
使用 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 C 编译器。
使用 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 和内部程序存储器的 Mi
crochip 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
剩余93页未读,继续阅读
资源评论
kylin56
- 粉丝: 0
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功