基于 LWIP 的嵌入式网络系统设计和实现

时间:2011-09-05

 

  ARM(Advanced RISC Machines)是目前在嵌入式领域里应用广泛的 RISC 微处理器 结构,以低成本、低功耗、高性能的特点占据了嵌入式系统应用领域的地位,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场。S3C2410 芯 片是由韩国 SAMSUNG 公司推出的基于 ARM920T 核的通用处理器,是为应用于小型掌上设备嵌入式系统应用而提供的微控制解决方案。SMDK2410 开发板是 SAMSUNG 公司推出 的基于此芯片的示例板,其网络部分使用的是 CS8900A 芯片。

  鉴于 ARM 处理器多方面的优势,现在已有多款操作系统实现了对其的支持,包括 Linux、 VxWork、WinCE、C/OS-II 等。其中 C/OS-II 以其源码公开、代码精简(全部仅 6000 余 行),高效稳定,移植性好,可裁剪等特点,正在不断扩大影响力。但是,?C/OS-II 只提供 了基本的操作系统功能,例如进程调度、同步、进程通信等,却不提供一般操作系统都提供的如文件系统、网络等功能,一定程度上限制了其使用。

  LWIP是开放源代码的独立TCP/IP协议栈,由瑞士计算机科学院的  Adam unkels  等开 发,其目的是在支持比较完整的TCP/IP协议的基础上减少代码尺寸,同时减少对存储器的使 用量,并且其移植接口简洁清晰,便于添加入其它操作系统中。

  本文以SMDK2410开发板为硬件平台,构建了一个以C/OS-II和LWIP为基础的软件系 统,并给出了一个在该系统上的网络服务应用程序,从而实现了一个完整的嵌入式网络系统。

  1  整体介绍 本嵌入式系统体系结构如图1所示,在终运行于SMDK2410开发板上的软件实际上包含五部分,分别是:硬件初始化程序、用户应用程序、C/OS-II操作系统、LWIP网络协议 栈、CS8900A网卡驱动程序:

  由于各部分相对的独立性,为了能使其协同工作,要实现各个模块之间的接口,这需要做五部分的工作

  编写SMDK2410开发板初始化代码,在系统启动后初始化硬件,为软件提供运行 环境。

  移植C/OS-II到SMDK2410开发板,即为C/OS-II添加硬件相关代码。

  移植LWIP到C/OS-II,即为LWIP实现与操作系统相关的接口函数。

  编写CS8900A网卡驱动支持LWIP,即为LWIP实现底层硬件数据接收功能。

  基于LWIP和C/OS-II提供的系统函数,编写用户网络应用程序。

  2    软件系统各部分介绍

  2.1  初始化硬件平台 初始化代码的目的是使系统硬件环境处于一个合适的状态,从而为执行操作系统做好准备,它是整个软件系统开始运行的程序。主要包括以下工作,由汇编文件 init.S 实现:

  中断向量表的建立:ARM要求中断向量表必须放置在从0X0地址开始,连续4byte 的空间内。每当一个中断发生以后,ARM处理器便强制把PC指针置为向量表中对 应中断类型的地址值。中断向量表的建立是通过一系列的跳转指令b来完成的,一 般如下:

  b

  ResetHandler

  //加电和复位处理函数的地址

  b

  HandlerIRQ

  //通用中断服务函数的地址

  b

  HandlerFIQ

  //快速中断处理函数的地址

  ……

  内部寄存器的设置:主要完成对 S3C2410 芯片中的时钟管理、电源管理(包括掉电与重启处理)、内存管理等。这部分工作在  ResetHandler  处理函数中完成,以 下两部分工作也是在此函数中实现的。

  堆栈的初始化:因为 ARM 有 7 种执行状态,每一种状态的堆栈指针寄存器(SP) 都是独立的。因此,对程序中需要用到的每一种模式都要给 SP 定义一个堆栈地址。 方法是改变状态寄存器内的状态位,使处理器切换到不同的状态,然后给 SP 赋值。 注意:不要切换到 User 模式进行 User 模式的堆栈设置,因为进入 User 模式后就 不能再操作 CPSR 回到别的模式了,可能会对接下去的程序执行造成影响。

  代码的搬移:全部可执行代码初被烧写在了硬件电路板中的只读 NorFlash  中, 虽然 CPU  可以直接从中执行,但是速度较慢,所以,要将可执行的代码搬移到系统 RAM 中,以提高运行速度。

  程序跳转:在初始化代码的,会通过跳转指令启动软件系统的 main()函数。

  2.2  C/OS-II  在 S3C2410  芯片上的移植

  C/OS-II  实际上可以看作是一个多任务的调度器,并提供了和多任务调度相关的一些 系统服务,如信号量、邮箱等,大部分代码由  C 语言编写,硬件独立。相对于移植工作而言,除一些类型定义等工作外,主要集中在多任务切换的实现上,这需要依据特定处理器结 构使用汇编语言实现处理器现场的保护和恢复。全部工作包括在对三个与体系结构相关文件[1]的修改上,具体如下:

  OS_CPU.H  文件:这个文件中包括了用#define 语句定义的、与处理器相关的常 数、宏以及数据类型。我们要根据具体的处理器和编译器重写,主要包括数据类型 的重新定义、堆栈单位和增长方向的设定,以及开关中断的宏定义和任务切换的宏 定义。

  OS_CPU_C.C  文件  :当 C/OS-II 进行任务切换或中断时要保护 CPU 的寄存器 到任务堆栈,在这个文件中定义了该堆栈的初始化函数,即设定了要保护的每一个 寄存器在堆栈中,使堆栈如同中断刚发生过一样。此外还有一些 HOOK 函数,必须 声明。

  OS_CPU_A.S  文件:C/OS-II 是多任务实时操作系统,在进行任务调度时需要切换任务上下文,这些和处理器相关的任务切换函数在这个文件中定义,此外还有时 钟中断处理函数和进退临界区宏指令也需要在此文件中实现。

  2.3  LWIP  在 C/OS-II  上的移植

  LWIP是独立的TCP/IP协议栈,代码中没有使用和操作系统及硬件相关的函数与数据结构,而是当需要这样的函数时,通过操作系统模拟层加以使用。操作系统模拟层向诸如定时 器、处理同步、消息传送机制等的操作系统服务提供一套统一的接口。原则上,移植LWIP 到其他操作系统时,仅仅需要实现适合该操作系统的操作系统模拟层,它包括以下这些函数[2]:

  sys_init()                                                        //初始化接口函数

  sys_arch_timeouts()       //定时器接口函数

  sys_sem_new()                      //创建信号量接口函数

  sys_sem_signal()    //发送信号量接口函数

  sys_arch_sem_wait()      //等待信号量接口函数

  sys_sem_free()     //释放信号量接口函数

  sys_mbox_t sys_mbox_new()   //创建消息邮箱接口函数

  sys_mbox_post()  //发送消息接口函数

  sys_arch_mbox_fetch()       //取得消息接口函数

  sys_mbox_free()  //释放消息邮箱接口函数

  sys_thread_new() //创建线程接口函数

  这些函数的实现,基本上是根据 ?C/OS-II 操作系统的相关数据结构,重定义这些函数 中的数据结构如 sys_sem_t、sys_mbox_t 等,再封装 ?C/OS-II 操作系统相应的系统调用函 数来完成的。以接口函数 sys_sem_new()为例,其实现如下:

  sys_sem_t sys_sem_new(u8_t count)

  {

  sys_sem_t pSem;

  pSem = OSSemCreate((u16_t)count );

  return pSem;

  }

  在 LWIP 中使用的这个信号量创建函数,可以看到是通过封装 ?C/OS-II 操作系统的信号 量创建函数 OSSemCreate()来完成的,其中使用的数据结构 sys_sem_t  也被重定义如下:

  typedef OS_EVENT* sys_sem_t;

  其中数据结构 OS_EVENT 同样为 C/OS-II 操作系统所有,其它函数的实现与此类似,不再重复。

  此外,为支持操作系统模拟层,还需要建立 cc.h  、perf.h 文件,完成与 CPU 或编译器 相关的定义,如数据长度、字的高低位顺序等,这些应该与实现 C/OS-II 时相一致。

  2.4  CS8900A  芯片驱动程序对 LWIP 的支持对于 LWIP 来说,它同样为网络驱动提供了一个移植接口,它使用 netif 数据结构代表 网络驱动层,此数据结构部分如下:

  struct netif {

  struct netif *next;

  err_t (* input)(struct pbuf *p, struct netif *inp);

  err_t (* output)(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr);

  err_t (* linkoutput)(struct netif *netif, struct pbuf *p);

  ……

  };

  LWIP  和网络驱动程序会共用一个这样的数据结构,从而实现了两者的联系。其中

  output( )函数提供给 LWIP 的 IP 模块,linkoutput( )函数提供给 LWIP 的 ARP 模块。LWIP 的

  驱动编写 示例 [3] 指出, output(  ) 函封装 了  LWIP  中  ARP  模块的数据 发送函 数 etharp_output(  ),此函数终会调用到 linkoutput(  )函数,即 linkoutput(  )函数是实际的数 据发送函数(这个函数由网络驱动程序实现)。另一方面,当网络驱动的中断处理函数接收到一个数据包后,也会调用此结构中的 input( )函数(这个函数由 LWIP 实现),将数据转交给 LWIP。接口结构[4]如图 2 所示:

  具体在为 LWIP 编写网络驱动程序时我们要实现以下函数:

  初始化函数:init( )

  在这个函数里,主要的任务就是初始化数据结构  netif,包扩硬件地址、传输 单元 mtu 和 state(指向设备驱动中网络接口的特定状态)以及 output( )函数、linkoutput( )函数和 input( )函数等。

  数据发送函数:output( )

  此函数只是简单的封装了 LWIP 中 ARP 模块的数据发送函数 etharp_output( )。

       数据发送函数:linkoutput( )

  这是真正的网卡数据发送函数,output( )函数终会调用到此函数。它将上层传递 来的数据转移到 CS8900A 网卡芯片上,使网卡将数据发送到网络上。

  中断函数:net_isr( )

  CS8900A 芯片将其要求的所有中断事件放在中断状态队列寄存器 ISQ 中,所以当 其产生中断要求 CPU 处理时,中断处理函数要循环处理 CS8900A 芯片的 ISQ,判断 中断事件类型,然后做相应处理。例如,如果是数据接收事件,则将数据从网卡中转移到内存,在必要处理后,调用 netif 中的 input( )函数将数据递交给 LWIP 层。 整体驱动程序由 CS8900A.c 实现,简要流程图[5]如图 3 所示:

  3  应用

  在完成上述工作后,一个嵌入式网络系统的软件平台基本完成。在这样的一个软件平台 上,通过调用 LWIP 提供的函数,即可以开发网络应用程序。本文编写了一个 web 服务器应 用程序,将主机与 SMDK 开发板连入局域网环境下,从主机 IE 浏览器敲入 SMDK2410 开发板 IP 地址后,可浏览 SMDK2410 开发板提供的 http 网页,如图 4 所示。

  4  结束语

  目前,基于 S3C2410 芯片的 SMDK2410 开发板在国内嵌入式教育领域正得到越来越 广泛的使用,本文给出了基于此硬件平台的 ?C/OS-II&LWIP 完整移植方案,构建了一个嵌 入式网络实验系统,并强调了硬件平台初始化和网卡芯片驱动程序的移植和实现,使得终的软件系统可实际工作。同时,由于移植的相似性,可以较容易的修改代码将其移植到其它 不同类型的开发板中运行,为基于 ?C/OS-II 和 LWIP 的网络研究和应用提供了基础。

  参考文献:

  [1] Jean J. Labrosse  邵贝贝  译。  嵌入式实时操作系统 ?C/OS-II(第二版)。  北京航空航 天大学出版社

  [2]  罗军宏,谢余强,舒辉,张有为。LWIP 在 ?C/OS-II 操作系统中的实现[J],微计算 机信息,2005,7-2:46-47

  [3]  Adam Dunkels Ethernetif.c in LWIP source code

  [4]  Adam  Dunkels  果农  译。  Lwip 协议栈的设计与实现  (中文版)。  Swedish  Institute  of Computer Science

  [5]  Cirrus Logic,IncCS8900A Product Data Sheet

      [6] RISC  datasheet https://www.dzsc.com/datasheet/RISC+_1189725.html.

      [7] ARM920T  datasheet https://www.dzsc.com/datasheet/ARM920T+_139814.html.

      [8] CS8900A  datasheet https://www.dzsc.com/datasheet/CS8900A+_593567.html.

     

上一篇:基于ADuC7026的功率放大器监控的设计与实现
下一篇:分析M16C62在uC/OS-II嵌入式系统中的应用

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料