导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[哈佛]实时操作系统µC/OS II



No.101831
作者:哈佛
邮件:jola2002@163.com
ID:29699
登陆:81次
QQ:5822022
--  MSN:jola2005912@hotmail.com
文章数:185篇
最后登陆IP:218.17.158.164
最后登陆:2014/12/16 13:54:00
注册:2005/1/6 19:18:03
财富:1280
发帖时间:2007/1/26 17:42:34
发贴者IP:210.21.215.18
标题:哈佛:实时操作系统µC/OS II下TCP/IP协议栈的实现
摘要:No.101831实时操作系统µC/OS II下TCP/IP协议栈的实现 实时操作系统µC/OS II下TCP/IP协议栈的实现 

摘要: 结合ez80和ARM7两种系统上的具体实现,说明了如何在嵌入式实时操作系统µC/OSII上移植实现LwIP这套TCP/IP协议栈,使µC/OS II成为支持网络的RTOS。

  

关键词: µC/OS II,TCP/IP,LwIP,网络设备驱动

引言 
随着嵌入式系统与网络的日益结合,在嵌入式实时操作系统中引入TCP/IP协议栈,以支持嵌入式设备接入网络,成为嵌入式领域重要的研究方向。µC/OS II是近年来发展迅速的一个开放源码实时操作系统,但它只是一个实时的任务调度及通信内核,缺少对外围设备和接口的支持,如没有文件系统、网络协议、图形界面。笔者在多个嵌入式项目的开发过程中,以开源TCP/IP协议栈LwIP为基础,给µC/OS II加上了网络支持。下面就以µC/OS II +LwIP分别在8位MCU ez80和32位MCU ARM7TDMI上的实现为例进行说明。

需要说明的是,笔者使用的ez80系统是Zilog公司的ez80190开发板,自带网络芯片。而ARM7系统是使用笔者参与开发的Skyeye,一个基于GDB的ARM7TDMI指令级软件仿真器。Skyeye小组最近为Skyeye加上了软件模拟的Ne2k兼容网络芯片,可以运行带网络支持的µcLinux和µC/OS II。以下的全部相关程序和代码都可以在Skyeye网站(hpclab.cs.tsinghua.edu.cn/~skyeye/)下载。

1  基于µC/OS II的网络平台概述 
嵌入式操作系统µC/OS II是一个公开源代码的占先式多任务的微内核RTOS,其性能和安全性可以与商业产品竞争。µC/OS II的特点可以概括为以下几个方面:公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好。可裁剪,可固化。内核属于抢占式,最多可以管理60个任务。µC/OS II自1992年的第一版(µC/OS)以来已经有好几百个应用,是一个经实践证明好用且稳定可靠的内核。目前国内对µC/OS II的研究和应用都很多。

       TCP/IP是Internet的基本协议,以其实用性、高效性已经成为事实上的工业标准。嵌入式设备要与Internet网络直接交换信息,就必须支持TCP/IP协议。目前嵌入式设备上TCP/IP方案有很多种,但面向低端应用的开源嵌入式网络平台还很少见。

       µC/OS II是一个富有开放色彩的RTOS,只要买一本书就可获得源代码,对学校和教育的使用完全免费,商业应用的费用相对也很低。但是它目前的一些第三方TCP/IP支持都是完全商业化的,用户需要付费才能获得,很少给出源代码,这影响了µC/OS II的研究和推广。通过把开放源代码的TCP/IP协议栈LwIP移植到µC/OS II上来,就获得了一套可免费研究、学习的嵌入式网络软件平台。系统示意图如图1:

LwIP协议栈
 
Ez80、Skyeye等MCU
 
Ne2k网络芯片
 
µC/OS II
 
网络设备驱动
 
应用程序(网络或非网络应用)
 
 
图1 µC/OS II+LwIP系统示意图

2  开源TCP/IP协议栈LwIP简介 
LwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP的含义是Light Weight(轻型)IP协议。LwIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。LwIP TCP/IP实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用,一般它只需要几十K的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端嵌入式系统中使用。

LwIP的特性如下:

(1)              支持多网络接口下的IP转发

(2)              支持ICMP协议

(3)              包括实验性扩展的的UDP(用户数据报协议)

(4)              包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议)

(5)              提供专门的内部回调接口(Raw API)用于提高应用程序性能

(6)              可选择的Berkeley接口API(多线程情况下)

我们目前使用的是LwIP的最新稳定版V0.5.3。有关LwIP的详细内容,可以参考其代码和网站上的文档。

4  LwIP在µC/OS II下的实现
4.1 概述 
       LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件、OS、编译器相关的部份独立出来,放在/src/arch目录下。因此LwIP在µC/OS II上的实现就是修改这个目录下的文件,其它的文件一般不应该修改。下面分几部份分别说明相应文件的实现原理和过程。具体的代码限于篇幅没有给出,Skyeye网站上有完整的代码和说明。

4.2 与CPU或编译器相关的include文件 
       /src/arch/include/arch目录下cc.h、cpu.h、perf.h中有一些与CPU或编译器相关的定义,如数据长度,字的高低位顺序等。这应该与用户实现µC/OS II时定义的数据长度等参数是一致的。

#define BYTE_ORDER LITTLE_ENDIAN  //ARM7默认为小端存储系统

//数据类型长度的定义

typedef unsigned char   u8_t;

typedef signed char     s8_t;

typedef unsigned short  u16_t;

typedef signed short    s16_t;

typedef unsigned int    u32_t;

typedef signed int      s32_t;

此外还有一点:一般情况下C语言的结构体struct是4字节对齐的,但是在处理数据包的时候,LwIP使用的是通过结构体中不同数据的长度来读取相应的数据的,所以,一定要在定义struct的时候使用_packed关键字,让编译器放弃struct的字节对齐。LwIP也考虑到了这个问题,所以,在它的结构体定义中有几个PACKED_FIELD_xxx宏,默认的时候这几个宏都是空的,可以在移植的时候添加不同的编译器所对应的_packed关键字。比如在Skyeye(ARM7)上对应gcc编译器的定义:

#define PACK_STRUCT_FIELD(x) x __attribute__((packed))

#define PACK_STRUCT_STRUCT __attribute__((packed))

#define PACK_STRUCT_BEGIN

#define PACK_STRUCT_END

4.3 sys_arch操作系统相关部份 
       sys_arch.[ch]中的内容是与OS相关的一些结构和函数,主要可以分为四个部份:

(1)              sys_sem_t 信号量

LwIP中需要使用信号量通信,所以在sys_arch中应实现信号量结构体和处理函数:

struct  sys_sem_t

       sys_sem_new()               //创建一个信号量结构

       sys_ sem _free()                     //释放一个信号量结构

       sys_ sem _signal()           //发送信号量

       sys_ arch_sem _wait()     //请求信号量

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

(2)              sys_mbox_t 消息

LwIP使用消息队列来缓冲、传递数据报文,因此要在sys_arch中实现消息队列结构sys_mbox_t,以及相应的操作函数:

sys_mbox_new()               //创建一个消息队列

sys_mbox_free()               //释放一个消息队列

sys_mbox_post()               //向消息队列发送消息

sys_arch_mbox_fetch()      //从消息队列中获取消息

µC/OSII同样实现了消息队列结构OSQ及其操作,但是µC/OSII没有对消息队列中的消息进行管理,因此不能直接使用,必须在µC/OSII的基础上重新实现。为了实现对消息的管理,我们定义了以下结构:

typedef struct {

           OS_EVENT*   pQ;

     ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:31毫秒 最大:11656毫秒 查询8次