基于 LWIP 的嵌入式网络系统设计和实现
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 语句定义的、与处理器相关的常 数、宏以及数据类型。我们要根据具体的处理器和编译器重写
- 基于FPGA的DSP设计方法(08-26)
- 电力电子装置控制系统的DSP设计方案(04-08)
- 基于DSP Builder的VGA接口设计(04-10)
- 基于DSP和USB的高速数据采集与处理系统设计(05-01)
- 数字信号处理(DSP)应用系统中的低功耗设计(05-02)
- 基于DSP的嵌入式显微图像处理系统的设计(06-28)