对于嵌入式系统而言,考虑到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模块实现了对回送请求消息产生一个回送应答。通过调用Ping命令就可以简单测试主机的可靠性。上述功能分别由ICMPReceiveProc和ICMPSendProc函数完成。
TCP模块
在本设计的协议栈中,通过一个有限状态机来实现TCP协议,用一个任务控制块(TCB)来记录客户和服务器的连接信息。虽然TCP协议是整个协议栈中最复杂的一个协议,但是对外面的接口还是只有两个:TCPReceiveProc和TCPSendProc函数。
TCP/IP协议栈的任务调度
通过对以上各层协议任务的分析,可以抽象出它们共同的特点。TCP/IP协议的每个模块只完成相应协议的任务,而任务通常只有两个:对底层送上来的数据包进行处理,以及将上层传下来的数据包再进行本层的封装,然后继续交下去。所以无论ARP、IP、ICMP、TCP哪一个协议,它们每一层对外都只有两个接口:收数据包、发数据包。
为了最大限度的模块化程序设计,便于日后的移植,可以采用面向对象的程序设计思路来具体实现TCP/IP协议。考虑到支持多用户以及多任务,首先在Atmega128的外部32K RAM内开辟若干个数据(任务)缓冲区,缓冲区的大小以能放入一个最大以太数据包为准,即1514个字节。以后需要处理的所有数据包都放在这些缓冲区内,各个缓冲区根据内部存入的不同类型数据包来设置缓冲区的标志。上面各协议层接口函数内的参数TaskNo就表示当前数据包所在的缓冲区号。
整个程序的处理流程如下:收数据时,8019AS不断将以太数据包从物理层收上来放入事先开辟好的任一个缓冲区内,作为一个待处理的任务,并根据数据包的包头信息标志此任务为ARP收任务或IP收任务。主程序扫描各个缓冲区,如发现有IP收数据包(任务)需要处理,于是根据任务的类型(IP收)调用相应处理进程IPReceiveProc()。处理完成后,将此数据包或任务根据包头信息重新标志为ICMP收或TCP收。主程序继续扫描,再次调用相应协议模块处理缓冲区内的任务如TCPReceiveProc(),直至将数据交到最上层的应用程序。发数据时,流程与收数据过程相反。
由于整个协议栈采用了模块化的设计,在具体使用的时候可以根据需要,很容易地加载相应的模块,完成相应的功能。比如可以按照同样的结构,再加载HTTP模块,在芯片内实现WEB SERVER。同样,在一些要求实时性的场合,由于发送的数据包是作为一个任务来管理的,因此可以很容易地给这些数据包(或任务)赋予一个较高的优先级,在进行任务调度时,优先处理这些任务。这样,在多用户情况下,对实时性也可以有一定改善。
结语
实现电子设备或者系统的网络化,使之具备网络功能,目前的解决方案通常有两种。除了直接在系统内部实现TCP/IP协议之外,还可以考虑使用专用芯片来完成单片机与网关间的协议转换。比如武汉力源公司开发的Webchip网络接口芯片PS-2000。但是专用芯片的使用,不但增加了系统的成本,而且不灵活。当然,如果在系统内部直接实现TCP/IP协议,也有自身的缺点。一是需要较大容量的程序存储器。二是对应用系统的设计工程师也具有更高的要求,如必须熟悉TCP/IP协议及其相关的接口。且软件设计的工作量也较大。所以在实际应用中,具体选择哪一种方案还需要根据具体情况做出不同的选择。
责任编辑:gt
全部0条评论
快来发表一下你的评论吧 !