您现在的位置:机电论文网>> 嵌入式系统>> 正文内容

LwIP协议栈在基于实时内核uC/OS II的SoPC系统中的实现(图)

作者: 来源: 发布时间:2009/6/10 16:03:43  点击数:1572

 

       可编程单芯片系统(system-on-a-programmable-chip,SoPC)是Altera公司于2000年提出的,它综合了SOC和PLD、FPGA各自的优点。目标是将尽可能大而完整的电子系统在一块FPGA中实现。

       近年来,随着PLD器件制造水平、功能复杂的IP核和可重构的嵌入式处理器软核的发展,SoPC正处于高速发展阶段,已成为高效、快速的SOC解决方案之一。
  

        嵌入式Intemet技术已逐步趋于实用化,在工控与信息电器等领域得到了可喜的应用。据专家预测,今后在Intemet上传输的信息有70%来自小型嵌入式设备,构建基于嵌入式系统的网络平台已成为嵌入式领域的一个重要研究方向 。目前Intemet上的通信方式大都是基于TCP/IP协议,嵌入式设备要与Intemet网络直接交换信息,就必须支持TCP/IP协议。在当前SoPC技术和嵌入式网络技术飞速发展、日益结合的背景下,将LwIP协议栈引入到SoPC系统中,以支持嵌入式设备接入网络,是适合应用需求的。
  

       LwIP(lightweightIP)即轻型TCP/IP协议栈,一般只需要几十K的RAM 和40K左右的ROM 就可以运行,并实现了较为完备的IP、ICMP、UDP、TCP,DHCP协议。以SOC的形式基于uC/OS II实现LwIP,并成功应用到实际当中的,已有很多文献进行了报道。但是,基于SoPC系统的LwIP的实现比较少见。谢兵森等人主要报道了如何在Altera公司提供的SoPC系统开发环境下设计嵌入式以太网网络终端,偏重于应用 。本文详细阐述LwIP协议栈及其在SoPC系统上的移植原理,在此的基础上基于SoPC系统完成LwIP协议栈的移植。

      1 LwIP协议栈实现原理
  

      LwIP是瑞士计算机科学院(SCICS)的Adam Dunkels等开发的一套用于嵌入式系统的开放源码的轻型TCP/IP协议栈,LwIP实现了较为完备的IP、ICMP、UDP、TCP、DHCP协议,具有超时时间估计、快速恢复和重发、窗口调整等功能。LwIP在保持协议主要功能的基础上减少对RAM 和ROM 的占用,一般只需要几十K 的RA M 和40K左右的ROM 就可以运行,很适合同uC/OS II相配合用在嵌入式系统中。在使用和移植的过程中可根据传输数据的不同需求进行删减和增补。移植过程主要是针对系统采用的微处理器、编译器、操作系统和网络控制器做相关的移植工作。本次研究采用lwip-0.6.3版本,经移植优化的LwIP作为uC/OS II扩展的网络模块运行,为系统提供基本的网络通信功能。并且在其基础上构造了一个基于TCP的Telnet echo测试服务器,以特定网络应用任务形式运行。

      LwIP可移植到操作系统上,也可在无操作系统的情况下独立运行。本次研究LwIP在uC/OS-II下实现的原理如图1。
  

                                                         图1 LwIP实现的原理
  

        系统硬件核心为Stratix1s10的FPGA芯片。根据开发板的资源和研究要求将FPGA配置成定制的SoPC系统,具体的硬件系统如图2所示。网络控制器是SMSC公司生产的自适应10M/100M第3代快速以太网控制器LAN91c111,集成了SMSC/CD协议的MAC(媒体层)和PHY(物理层)。外围设备的驱动和控制接口都有相应的IP核来完成。

       系统软件核心为uC/OS-II-2.76,是一个源码开放的适合于小型、微控制器的占先式多任务管理的实时操作系统。它内核短小精悍、可裁减、执行时间确定。uC/OS II提供的仅仅只是一个实时的调度及任务间通信的内核,没有集成网络协议。针对NiosII处理器,首先完成uC/OS-II的移植工作。

       2 LwIP实现的硬件平台
  

      采用Altera公司的Stratix1s10开发板。在Altera公司的FPGA集成开发环境QuartusII 4.0和SoPC Builder下构建基于Avalon总线的SoPC系统。根据研究的需要,在FPGA上定制的SoPC系统硬件映像如图2所示。

  SoPC系统的硬件核心是Nios II处理器,Nios II内核有3种配置——快速(Nios II/f)、标准(Nios II/s)和经济型(Nios II/e)。Nios II是Nios的第2代,是专门针对Altera的可编程逻辑和可编程单芯片系统(SoPC)而设计的软CPU。此处配置成标准。jtag-uart是PC机和开发板的连接电缆,功能是下载FPGA配置、软件程序和调试程序。tri_bridge是Avalon片内总线和片外设备的连接总线。lan91c111是以太网控制器接口,允许中断。

      3 LwIP协议栈的移植
  

       移植LwIP协议栈,主要是针对系统所采用的Nios II处理器、GCC编译器、uC/OS-II-2.76和LAN91c111以太网控制器做相关的移植。
3.1 处理器和编译器相关部分的移植
  

       LwIP协议栈把所有和硬件,编译器相关的部分独立出来,放在/src/arch下面。/arch目录下cc.h、cpu.h、perf.h中是与Nios II和GCC相关的定义。如数据长度、字的高低位顺序等。这些应与用户实现uC/OS-II时定义的数据长度等参数是一致的。例如:
  

      #define BYTE_ORDER LITTLE_ENDIAN //Nios II默认为小端存储系统
一般情况下,C语言的结构体struct是4字节对齐的,但是在处理数据包的时候,LwIP使用的是通过结构体中不同数据的长度来读取相应的数据的。所以,一定要在定义struct的时候使用_packed关键字,让编译器放弃struct的字节对齐。在Nios II上对应GCC编译器的定义为:
      #define PACK_STRUCT FIELD(x)x _attribute_ ((packed))
      #define PACK_STRUCT_STRUCT _auribute_((packed))
      #define PACK_STRUCT_BEGIN
      #define PACK_STRUCT_END

       3.2 改写操作系统有关部分的函数
  

       sys_arch.c文件是和操作系统相关的一些结构和函数。和uC/OS-II的接口函数主要分为5个部分 。
  

      (1)信号量:LwIP中需用信号量通信,对信号量的处理函数:
      sys_sem_t sys_sem_new(u8_t count) //创建一个信号量 
      void sys_sem_free(sys_sem_t sem)//释放并删除一个信号量 
      void sys_sem_signal(sys_sem_t sem)//发送一个信号量 
      u32_t sys_arch_sem_wait(sys_sem_t sem,u32_t timeout))//等待一个信号量
  

       由于uC/OS-II已实现了信号量OS_EVENT的各种操作,且功能和LwIP上面几个函数的目的功能是完全一样的,所以只要把uC/OS II的函数重新包装成上面的函数,就可以直接使用。
  

       (2)消息队列:LwIP使用消息队列来缓冲、传递数据报文,对消息队列的处理函数如下:

        sys_mbox_t sys_mbox_new(void) //创建一个消息队列 
        void sys_mbox_free(sys_mbox_t mbox ) //释放一个消息队列 
        void sys_mbox_post(sys_mbox_t mbox,void *data)//向消息队列发送消息 
        u32_t sys_arch_mbox_fetch(sys_mbox_t mbox,void **msg,u32_t timeout) //从消息队列中获取消息

        uC/OS II同样实现了消息队列结构及其操作,但是uC/OS II没有对消息队列中的消息进行管理,因此不能直接使用,必须在uC/OS II的基础上重新实现。
  

        (3)等待超时函数:LwIP中每个与外界网络连接的线程都有自己的timeout属性,即等待超时时间。这个属性表现为每个线程的timeout时间长度, 以及超时后应调用的timeout函数,做相应的处理。用户要实现的函数如下:
struct sys_timeouts *sys_arch_timeouts(void);//返回正处于运行状态的线程所对应的timeout队列指针
  

        (4)创建新线程:LwIP可以是单线程运行,也可以多线程运行。为提高效率并降低编程复杂度,用户需要实现创建新线程的函数:
sys_thread_t sys_thread_new(void(*function)(void *arg),void *arg,int prio);
在uC/OS II中,没有线程的概念,只有任务。只要把OSTaskCreate封装一下,就可以实现sys_thread new。
  

        (5)系统初始化: 
        void sys_init(void);//系统初始化

        3.3 网络控制器的驱动
  

        TCP/IP协议栈引入到uC/OS II后,为了实现网络通讯还必须完成相应网络控制器驱动程序的添加。Stratix1s10开发板所带的网络芯片是由SMSC公司生产的以太网控制器芯片LAN91c111。驱动程序工作在IP协议模型的网络接口层,它提供给上层(IP层)的接口函数如下:

        err_t alt_avalon_lan91c111_init(struct netif *netif)//网卡初始化函数 
        void alt_avalon_lan91c111_rx(alt_lwip_dev *dev)//网卡接收函数, 由网卡ISR调用 
        err_t alt)avalon)lan91c111_output(struct netif *netif,struct pbuf *p,struct ip_addr *ipaddr)//网卡发送数据函数 
        void alt_avalon_lan91c111_irq(void* context,alt_u32 interrupt)//网卡中断处理函数
以上的函数都可以分为协议栈本身的处理和对网络接口硬件的操作两部份,但硬件操作是对上层屏蔽的。

        4 实验测试
  

        在Altera公司的Nios II IDE 开发环境下以前文建立的SoPC系统硬件为目标硬件建立名为lwip test的软件工程。同时,开发环境会自动建立名为lwip_test_syslib的工程。uC/OS II的初始化在lwip_test_syslib中由系统自动完成,在lwip_test中建立主函数程序框架如下:
main(void)
{
……
Lwip_stack_init();
OSStart();
}
  Lwip_stack_init(int thread_prio,void(*inti_done_func)(void *),void arg)函数初始化LwIP协议栈。它的形参init_done_func是函数指针,指向tcpip_init_done的函数。tcpip_init_done函数是在LwIP协议栈初始化完毕后被调用,目的是安装以太网控制器的驱动和建立相应的Telnet echo任务,监听7号端口,为客户机提供回显服务。程序编译调试通过后,将其烧入Flash中,开发板通过以太网线经Hub与局域网连接,作为局域网的一台小型嵌入式服务器运行。等待LwIP从网络服务器动态获取IP地址后,通过局域网中一台Pc机,在DOS环境下,键入ping 172.18.6.136命令向目标板发送ICMP请求,客户端可得ICMP回应。键入telnet 172.18.6.136 7(7号端口)命令登录开发板Telnet echo服务,客户端用户可在显示屏幕上看到自己键入的字符。实验说明各网络协议得到正确配置,同时各任务在内核调度管理下运行正常。

        5 结束语
  

        基于实时内核uC/OS II,在SoPC系统中实现了LwIP协议栈的移植与优化。移植优化后的LwIP栈做为一个网络模块运行,代码占用40 K的ROM,实现了以太网/IP/TCP/Telnet网络功能,并提供了模块API,与系统实现无缝连接。基于LwIP的网络应用任务与其它非网络应用任务,在uC/OS II实时内核管理下协调运行。进一步增强协议栈的网络安全性与稳定性,并开发相应的的网络应用程序,“SoPC系统/uCOS II/LwIP协议栈”的架构有望应用在信息家电和网络化的仪器、仪表方面。
 

   作者:章智慧 白瑞林 沈宪明

 


更多
字体:【】-【】-【】【关闭此页

上一篇:实例解析:Linux操作系统的TCP'   下一篇:Modbus协议下51系列单片机与e'


特别声明:机电之家(http://www.jdzj.com )所共享的机电类资料,机电论文、机电类文章、机电企业类管理制度、机电类软件都来自网上收集,其版权归作者本人所有,如果有任何侵犯您权益的地方,请联系我们,我们将马上进行处理。购买的论文都出自原创,保证作者的原创的版权的转让,任何纠纷由法律解决。