基于Altera FPGA无操作系统的LWIP移植
由于环境的特殊性,不仅要求设备具有较高的性能,也对设备的体积功耗等提出了严格的要求。为增加系统运行的可靠性,硬件设备需尽可能的紧凑。在满足系统运行需求的前提下,硬件中分立元件越少越好。基于现场可编程门阵列(FPGA)的以太网设计是一个较好的解决方案。
本文引用地址:http://www.amcfsurvey.com/article/201609/303790.htmSOPC Builder是一种特殊的嵌入式系统,其是片上系统,即由单个芯片完成系统的主要逻辑功能,并具有灵活的设计方式,可裁剪、可扩充和升级、且具备软硬件在系统可编程功能。NiosⅡ嵌入式处理器是Altera公司推出的采用哈佛结构、具有32位指令集的第二代可编程软核处理器,其最大优势是模块化的硬件结构,在设计阶段根据实际需求来增减外设的种类和数量。LWIP是瑞士计算机科学院的Adam Dunkela等开发出的一套用于嵌入式系统的开放源代码TCP/IP协议栈。一般情况下,LWIP既可移植到操作系统上,又可在无操作系统的情况下独立运行。LWIP实现的主要优点是在保持TCP/IP协议主要功能的基础上,又减少了其对RAM的占用,这使得LWIP协议适合在嵌入式系统中使用。
1 移植过程及设计流程
1.1 系统的组成
以软核NiosⅡ为核心,在FPGA中搭建存储器、DMA、三速以太网MAC等多种外设的SOPC系统,在片外配置三速以太网物理层芯片(PHY)。通过对TCP/IP协议栈的移植以及基于UDP协议的网络编程实现以太网应用。系统整体设计方案如图1所示,系统设计主要分整体硬件电路设计、基于FPGA的SOPC系统设计和系统软件设计。
1.2 系统硬件设计
硬件模块主要由FPGA模块、网络接口模块及电源模块等组成。核心器件是FPGA,其作为SOPC系统的搭载平台,并对其他硬件进行控制。网络接口模块选用Marvell公司的三速以太网物理层芯片88e1111,硬件结构如图2所示。
1.3 使用SOPC Builder搭建硬件环境
用SOPC Builder工具从NiosⅡ处理器内核和开发套件提供的外设列表中选取合适的CPU,存储器以及各自的外围器件,并定制和配置其作用;分配外设地址及中断号;设定复位地址;最后生成系统。硬件开发使用Quanus II和SOPC Builder CUI处理器库选择并配置外设。设计中除了必要的外设外还需添加MAC子层,MAC是以太网控制器的核心,主要提供与上层协议间的接口及与PHY设备间的介质无关接口,并对以太网数据包进行封装、解封装以及错误监测等。设计选择三速以太网(10/100/1 000 Mbit·s-1)MAC,其结构如图3所示。
FIFO用于缓存接收或发送的数据。设计采用M9K存储器块作为FIFO,设置发送FIFO为2 048×32 bit,接收FIFO设置为512×32 bit,因系统主要用于向上位机传送数据并接收上位机控制命令,因此接收FIFO需求较小。
在与PHY通信一侧,三速以太网MAC核提供RGMII接口,工作在全双工模式,并提供PHY管理接口。其中,PHY管理接口提供4个信号,分别是数据管理时钟MDC、管理数据输入MDIO_in、管理数据输出MDIO_out:以及管理数据输出使能MDIO_oen。由于在PHY芯片上只有时钟MDC和双向数据接口MDIO,所以MAC与PHY对接时中间需要一个双向三态缓冲器,连接电路如图4所示。
1.4 系统软件设计LWIP的移植
LWIP的移植可分为两大类,第一类是只移植内核核心,此时用户应用程序的编写只能基于raw/callback API进行;第二类是移植内核核心和上层API函数模块,此时用户可使用3种API进行编程,即除了raw/callback API外,还有sequentia API和BSD-style socket API。本文进行的是第一种移植,该移植较为简单,移植者只需完成头文件的定义,同时根据使用的具体网卡情况完成ethernetif.c中函数的编写。
介绍LWIP的源代码结构。解压后,源代码目录共有doc、src和test 3个文件夹。其中,doc文件夹下包含了几个与协议栈使用相关的文本文档,较为重要的文件有两个:rawa pi.txt为告诉读者如何使用协议栈的raw/callback API进行编程,其通过直接与协议栈内核函数交互以实现编程;sys_arch.txt在移植时被使用到,其中描述了移植说明,规定了移植者需实现的函数、宏定义等。Test文件夹则是LWIP提供的一些协议栈的内核测试程序。文件夹src包含了协议栈内核的所有源代码。
在NiosⅡ中建立新工程,添加srccore文件夹下的所有文件,同时包括其下IPV4文件夹中的所有文件。应该注意,这里添加了较多的文件,但其中有些是可条件编译的,如文件sys.c,若不提供操作系统模拟层的文件,则该文件不会被编译。接着添加netif文件夹中的loopif.c、etharp.c、ethernetif.c文件到工程中,同时在源文件目录下新建lwipopts.h、perf.h和cc.h这3个头文件,并同时将其添进工程。这3个头文件是内核要求用户在移植时需完成的头文件。
Cc.h文件主要完成协议栈内部使用的数据类型定义,用户应根据具体编译器和处理器特性定义这些数据类型的长度;此外,cc.h文件还要完成临界代码的保护、协议栈调试信息输出相关的宏和大小端的定义等。
Perf. h文件是与系统统计和测量相关的头文件,该头文件和平台的处理器密切相关,本文平台无需使用任何统计和测量功能。因此,该头文件中的两个宏直接定义为空。
最后一个头文件lwipopts.h,其包含用户对协议栈内核的参数设置,在内核的opt.h文件中,包含了内核所有参数的默认配置,当用户在lwipopts.h中配置相关参数,若用户对某个参数未配置,则内核将使用opt.h中的默认值。需注意,在移植时重新定义某些内核参数是必要的,否则协议栈可能无法正常运行。
评论