TCP/IP协议栈在嵌入式芯片上的实现
发布时间:2008/5/27 0:00:00 访问次数:1533
摘??? 要:本文介绍了一种在atmega128芯片上嵌入tcp/ip协议栈的实现方法,整个协议栈采用模块化设计,结构简单,可以很方便的移植到不同芯片上。
关键词:tcp/ip;嵌入式系统;8019as;atmega128
引言
对于嵌入式系统而言,考虑到tcp/ip协议的复杂性以及嵌入式系统自身资源的有限,对tcp/ip的实现并不是一件容易的事情。在一些特殊场合,比如要求实时性或者数据的安全性,实现tcp/ip协议时还需要特别加以考虑。下面以atmel公司的mega128芯片为硬件平台,具体谈谈tcp/ip协议的实现。
atmega128芯片的特点
atmega128是atmel公司推出的一款基于avr risc结构的低功耗、高性能的8位微控制器芯片。通过在一个时钟周期内执行一条指令,atmega128可以取得1mips/mhz的性能。此外,该芯片还具有比较丰富的片上资源。而最大可外扩的64k数据存储器可以使得有充裕的空间来处理以太数据包。
本方案只外扩32k ram,剩余的高地址空间留给网卡芯片。网卡芯片主要功能是在物理层进行以太数据包的收发,以及在链路层进行信号的编/解码。本方案网卡芯片选用rtl8019as,它是针对pc机的isa总线设计的。
硬件接口电路设计
数据线与地址线均采用总线方式:8位数据线和16位地址线。pa口8位端口为复用ad端口,需要接一个地址锁存器。读数据时,d[0:7]数据直接送到atmega128;写数据时,d[0:7]送到rtl8019as。atmega128与rtl8019as同时复位,reset端口经74hc04反相后接rtl8019as的rstdrv引脚。iocs16脚的电平一直为低。8019采用8位数据总线宽度(高电平时为16位总线方式)。int0中断脚经电平转换接到atmega128的irq5。在程序中,以i/o方式访问rtl8019as。memr、memw接高电平时关闭其memory方式。
atmega128对8019as的驱动主要是通过操纵8019as内部寄存器来完成的,这些寄存器映射在atmega128的i/o端口上。因此,对8019as的操作也既是对atmega128的i/o端口操作。设计时可以将这些i/o地址定位到300h~31fh。由于atmega128外扩了32k的ram,所以这里存在片选的问题。考虑到网卡芯片8019as地址线的高15位是固定不变的,可以利用atmega128的地址线的最高位a15来进行片选:当a15=1时,选中8019as;当a15=0时,选中24c256。
8019as网络接口控制器提供了三种与系统主cpu的接口方式:跳线方式、pnp方式,以及rt方式。为了减少硬件资源,更直接地控制芯片,将8019as的65脚“jp”接高电平,选择跳线方式。
软件模块的设计
网卡芯片8019as的驱动
在具体设计实现tcp/ip协议栈之前,还要解决一个问题:对8019as的驱动。从程序员的角度看,8019as工作流程并不复杂。简而言之就是8019as完成数据包和电信号之间的相互转换,以太网协议由芯片硬件自动完成。因此,驱动程序需要完成的任务主要是:芯片初始化、收包、发包。本方案在协议栈中通过设计三个子函数来分别完成上述三个任务,8019init (void)、8019sendproc (unsigned char taskno)、8019 receiveproc(void)。
如前所述,对8019as的操作实际上是通过操纵其内部寄存器以及dma端口来实现的。因此在程序实现中,大量地出现了对8019as内部寄存器的读写操作。所以可以定义2个带参数的宏来简化对8019as的操作。reg表示8019as内部寄存器的偏移量,date是将被写入的数据,如下所示:
#define? nic_read (reg)?????? *(base + (reg) )
#define? nic_write (reg, date)? *(base + (reg)) = date
tcp/ip协议栈的实现
tcp/ip协议族是一组不同层次上的多个协议的组合。根据协议的层次结构,本方案安排四个协议模块来分别实现tcp/ip协议的不同功能。即除了数据链路层(物理层)的程序模块,也即前面所述8019as的驱动模块之外,还包括arp层模块、ip层模块、icmp层模块以及tcp层模块。当然,还可以多增加一个应用层的模块,例如http模块。下面逐一介绍各个协议模块的功能。
arp模块
arp模块完成的主要功能是将一个ip地址与其物理地址关联起来。同时,为了提高网络传输速度和效率,避免在每次发送数据时都要发送arp请求包来获得目的mac地址,还要维护一个常用的arp高速缓存。这些功能可以由两个函数来实现。arpreceive proc用于处理来自网络的arp请求和arp响应;arpsendproc用于发送arp请求包来寻找对应于ip地址的物理地址。
ip模块
ip协议的主要功能是使数据包可以分片发往任何网络,而且也能正确接收。分别由两个函数完成。ipreceiveproc负责处理收到的ip数据包,如果是一个分片的包,它还负责组装,最后根据ip包头字段的内容,将ip数据传递到上层协议模块;ipsendproc负责将上层送下来的、需要发送的数据包添加一个ip包头,然后重新封装起来发送下去。
icmp模块
由于ip协议没有差错报告和差错纠正机制,icmp协议与ip协议配合使用弥补了上述两个缺点。为了使实现的tcp/ip协议栈具备一定的差错诊断功能,icmp
摘??? 要:本文介绍了一种在atmega128芯片上嵌入tcp/ip协议栈的实现方法,整个协议栈采用模块化设计,结构简单,可以很方便的移植到不同芯片上。
关键词:tcp/ip;嵌入式系统;8019as;atmega128
引言
对于嵌入式系统而言,考虑到tcp/ip协议的复杂性以及嵌入式系统自身资源的有限,对tcp/ip的实现并不是一件容易的事情。在一些特殊场合,比如要求实时性或者数据的安全性,实现tcp/ip协议时还需要特别加以考虑。下面以atmel公司的mega128芯片为硬件平台,具体谈谈tcp/ip协议的实现。
atmega128芯片的特点
atmega128是atmel公司推出的一款基于avr risc结构的低功耗、高性能的8位微控制器芯片。通过在一个时钟周期内执行一条指令,atmega128可以取得1mips/mhz的性能。此外,该芯片还具有比较丰富的片上资源。而最大可外扩的64k数据存储器可以使得有充裕的空间来处理以太数据包。
本方案只外扩32k ram,剩余的高地址空间留给网卡芯片。网卡芯片主要功能是在物理层进行以太数据包的收发,以及在链路层进行信号的编/解码。本方案网卡芯片选用rtl8019as,它是针对pc机的isa总线设计的。
硬件接口电路设计
数据线与地址线均采用总线方式:8位数据线和16位地址线。pa口8位端口为复用ad端口,需要接一个地址锁存器。读数据时,d[0:7]数据直接送到atmega128;写数据时,d[0:7]送到rtl8019as。atmega128与rtl8019as同时复位,reset端口经74hc04反相后接rtl8019as的rstdrv引脚。iocs16脚的电平一直为低。8019采用8位数据总线宽度(高电平时为16位总线方式)。int0中断脚经电平转换接到atmega128的irq5。在程序中,以i/o方式访问rtl8019as。memr、memw接高电平时关闭其memory方式。
atmega128对8019as的驱动主要是通过操纵8019as内部寄存器来完成的,这些寄存器映射在atmega128的i/o端口上。因此,对8019as的操作也既是对atmega128的i/o端口操作。设计时可以将这些i/o地址定位到300h~31fh。由于atmega128外扩了32k的ram,所以这里存在片选的问题。考虑到网卡芯片8019as地址线的高15位是固定不变的,可以利用atmega128的地址线的最高位a15来进行片选:当a15=1时,选中8019as;当a15=0时,选中24c256。
8019as网络接口控制器提供了三种与系统主cpu的接口方式:跳线方式、pnp方式,以及rt方式。为了减少硬件资源,更直接地控制芯片,将8019as的65脚“jp”接高电平,选择跳线方式。
软件模块的设计
网卡芯片8019as的驱动
在具体设计实现tcp/ip协议栈之前,还要解决一个问题:对8019as的驱动。从程序员的角度看,8019as工作流程并不复杂。简而言之就是8019as完成数据包和电信号之间的相互转换,以太网协议由芯片硬件自动完成。因此,驱动程序需要完成的任务主要是:芯片初始化、收包、发包。本方案在协议栈中通过设计三个子函数来分别完成上述三个任务,8019init (void)、8019sendproc (unsigned char taskno)、8019 receiveproc(void)。
如前所述,对8019as的操作实际上是通过操纵其内部寄存器以及dma端口来实现的。因此在程序实现中,大量地出现了对8019as内部寄存器的读写操作。所以可以定义2个带参数的宏来简化对8019as的操作。reg表示8019as内部寄存器的偏移量,date是将被写入的数据,如下所示:
#define? nic_read (reg)?????? *(base + (reg) )
#define? nic_write (reg, date)? *(base + (reg)) = date
tcp/ip协议栈的实现
tcp/ip协议族是一组不同层次上的多个协议的组合。根据协议的层次结构,本方案安排四个协议模块来分别实现tcp/ip协议的不同功能。即除了数据链路层(物理层)的程序模块,也即前面所述8019as的驱动模块之外,还包括arp层模块、ip层模块、icmp层模块以及tcp层模块。当然,还可以多增加一个应用层的模块,例如http模块。下面逐一介绍各个协议模块的功能。
arp模块
arp模块完成的主要功能是将一个ip地址与其物理地址关联起来。同时,为了提高网络传输速度和效率,避免在每次发送数据时都要发送arp请求包来获得目的mac地址,还要维护一个常用的arp高速缓存。这些功能可以由两个函数来实现。arpreceive proc用于处理来自网络的arp请求和arp响应;arpsendproc用于发送arp请求包来寻找对应于ip地址的物理地址。
ip模块
ip协议的主要功能是使数据包可以分片发往任何网络,而且也能正确接收。分别由两个函数完成。ipreceiveproc负责处理收到的ip数据包,如果是一个分片的包,它还负责组装,最后根据ip包头字段的内容,将ip数据传递到上层协议模块;ipsendproc负责将上层送下来的、需要发送的数据包添加一个ip包头,然后重新封装起来发送下去。
icmp模块
由于ip协议没有差错报告和差错纠正机制,icmp协议与ip协议配合使用弥补了上述两个缺点。为了使实现的tcp/ip协议栈具备一定的差错诊断功能,icmp