
数字技术与应用
基于LwIP的嵌人式以太网系统的设计与实现
胡龙鹃
塑田
(电子科技大学自动化工程学院
四川成都
611731)
要)针对uC/OS-II操作系统没有TCP/IP通信功能,本文给出一种将LwIP协议栈移植到
满
uC/OS-II的方法,使其具有TCP/IP通信功能,并通过测试,实际应用效果良好。[关键词]uC/OS-II操作系统
TCP/IP
LwIP协议
[中图分类号]TP316 1LwIP协议栈简介
[文献标识码]A
[文章编号]10079416(2010)07004401
务创建函数封装成此线程创建函数,还需
LwIP是端士计算机科学院的Adam Dunkels等开发的一套用于嵌人式系统的开放源代码TCP/IP协议栈。LwIP既可移植到操作系统上。LwIP实现了较为完备的 IP、ICMP.UDP,TCP协议,具有超时时间估计、快速恢复和重发、窗口调整等功能。还有一个重要的特点就是协议栈只需要几十 K的RAM和40K左右的ROM就可以运行,这样我们就可以在一些低端的嵌入式系统中使用LwIP协议栈。
2uC/OS-l操作系统简介
uC/OS-II是一个开象的占先式多任务的实时操作系统。它的执行时间可确定,内核可剪裁,可移植,可固化,代码量小,这对于嵌入式有限的资源是非常重要的。它支持x86、ARM,PoWerPC,MIPS等众多体系结构,其稳定性和可用性是经过实验验证的,因此被广泛应用于各种嵌人式设备中。
3LwIP协议栈移植到uC/OS-Il 操作系统的实现方法
整个联入式系统主要由ARM微处理器、网卡芯片、网络设备驱动、lwip、uC/ OS-II和应用程序组成,
LwIP在设计时就充分考虑了移植的向题,因此把与操作系统、硬件、编详器相关的部分都放在源码的/src/arch目录下,所以我们主要修改这月录甲而的文件。
3.1编写和CPU及编译器相关的头文件这些头文件包括cc.h,cpu.h,perf.h
等,在这里都定义了和使用的CPU以及编译器相关的内容,如数据类型,存储模式的选择等。
本次使用的是RealView!
MDK编译器。
LPC2148是32位微处理器,int和long类型长度为32位,short类型长度为16位,char类型长度为8位,处理器内核为小端存储系统,定义为
#define
BYTE_ORDER
LITTLE_ENDIAN
3.2编写与操作系统相关的函数
按协议栈要求,需要在操作系统中实现以下函数:
(1)线程创建承数sys_thread_new() 在uC/OS-II中没有线程概念,只有任
务,故可把uC/OS=II中的OSTaskCreate()任
44
数字技术与应用方方数据
要注意的地方是创建时要为线程分配好优先级。
(2)定时器函数
sys_arch_timeouts()
LwIP的每个与外界网络连接的线程都有自己的超时等待属性,并为每个线程都分配-个sys_timeout数据结构,并把这个数据结构存放在链表sys_timeouts中,如果一个线程对应的sys_timeout为空(NULL),说明该线程对连接做水久的等待。超时等待的数据结构包括指向链表下个sys_timeout 结构的指针,线程的超时时间长度,以及趣时后应调用的timeout函数。
(3)进程间通信的函数
sys_sem_t信号量:sys_sem_new(), sys_sem_free(),sys_sem_signal(),sys_arch_sem_wait()。因为uC/OS-II已经实现了信号量OS_EVENT的各种操作,这载功能完全可以用uC/OS-II果一些函数封装实现。
sys_mbox_ti消..sys_mbox_new(). sys_mbox_free(),sys_mbox_post(), sys_arc_mbox_fetch(),这些函数基本都能在uC/OS-II中实现,但要注意mbox需用 uC/OS-II中消息队列实现,uC/OS-II没有对消息队列中的消息进行管理,因此不能直接使用,必须在uC/OS-II的基端上重新实现。
3.3编写与硬件的接口函数
主要编写ethernetif.c文件,实现底层的数据接收发送,数制包的发送可以采用中断处理程序执行,每接收到一个数据包,向 tcpip_thread进程发送一清息,系统调度 tcpip_thread进程对消息进行处理,并根据数据包的类型转向相应的协议处理程序。
4LwIP在uC/OS-II上应用测试系统运行时,首先调用OSInit()初始化
操作系统的变量和结构,再调用Targetinit() 设置处理器外设时钟等,盐后创建一个测试任务wip_test(),优先级设为2.再调用OS Start()启动系统,进入测试任务。
测试任务中先进行调用lwip_init()函数对 sys,mem,memp,pbuf,raw,tcpip进行始化,特别地,在对tcpip初始化过程中需要创建前面提到的tcpip_thread()进程,优先级设为4,
Lwip初始化完成后,需要对1wip进行设置,即调用lwip_set()函数,执行网卡初始化,网络接口链表初始化(netif结构体链
·自动化技术·
表),这甲需要创建测试的最后一个进程 ethernetif_input(),优先级设为5,此进程负责底层的数据接收亏发送。
测试使用Iwip自带的API函数,先调用 netconn_new()函数建立一个TCP连接,再调用netconn_bind()绑定到80端口,接着调用netconn_listen()进监听调用 netconn_accept()塞测试进程直到等到外界的连接,如果连接成功,则可调用 netconn_recv()和netconn_write()进行数据收发工作,本次测试上位机使用TCP测试工具软件,要求PC端的IP地址与下位机网卡IP地址在间一网段。当PC端与下位机连接成功时,上位机发送一组数组给下位机,下位机收到数带后不微处理直接把数据发回上位机,通过上位机检查发送和接收到的数据是否·致来判断协议栈是否移植成功。也可以在连接后,在PC命令提示符里输人ping=t192.168.1.25,可看到ICMP reply响应,得出time二1ms,说明本次移植成功,且效果良好。
5结语
本设计详细闹速了LwIP协议栈移植到 uC/OS-II操作系统的方法,提出较为方便的测试方法,并月选用了成本较为低家的硬件平台,测试结果较为满意,达到预期效果。本设计已成功应用于实验室传感器网络项目。
[参考文献】
[1]LABROSSEJJ.嵌人式实时操作系统uC/OS_E[M].2版.邵贝贝,译,北京:北京航空航天大学出版社,2005.
[2]李鸿强,苗长云.Lw[P移植到uC/ OS_Ⅱ中的实现[J].天津工业大学学报, 2006,25(4):38.40
[3]刘冬明,李正明,刘军良.电网远程监控的实现[].电力自动化设备,2005,8.[4]刘健康,焦海波.嵌入式网络系统设计:基于AtmelARM7系列[M].北京;北京航空航天大学出版社,2008,
[作者简介]
胡龙爵(1985-),男,四川安岳人,硕士研究生,主要从事嵌入式络系统研究。
田雨(1980-),男,四川成都人,讲师,主要从事微波测量,无线传感器网络研究。