首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于μC/OS-Ⅲ的LwIP协议栈的移植与实现

基于μC/OS-Ⅲ的LwIP协议栈的移植与实现

随着嵌入式系统功能的多样化及网络在各个领域中的广泛应用,具有网络功能的嵌入式终端拥有更高的使用价值和更强的通用性。μC/OS-Ⅲ是一个可裁剪、可固化、可剥夺型的实时内核,管理任务的数目不受限制[1]。作为μC/OS系列的最新版本,μC/OS-Ⅲ提供了实时内核所能提供的所有服务,可保证网络功能和其他诸多任务并发有序地执行。但μC/OS-Ⅲ仅仅是一个实时操作系统的内核,要实现网络功能还需移植一款符合嵌入式系统要求的以太网协议栈。LwIP是由瑞典计算机科学研究院开发的轻量型TCP/IP协议栈,其特点是保持了以太网的基本功能,通过优化减少了对片内存储资源的占用[2]。一般情况下,具有十几KB SRAM和几十KB Flash存储能力的微控制器即可运行LwIP协议栈[3]。该特点使其广泛使用于数据采集、工业控制等多个应用领域中。本文论述了使用LM3S9B95微控制器的嵌入式平台实现LwIP 1.4.0版本在μC/OS-Ⅲ上的移植。LM3S9B95是TI公司推出的基于ARM Cortex-M3内核的微控制器,其内部具有以太网控制器模块[4]。
        1 LwIP的移植过程
            LwIP的移植主要涉及两个方面:操作系统模拟层和硬件驱动层。LwIP在设计时已考虑到在不同操作系统中的可移植性,其内部使用的函数和数据结构均为抽象定义[5]。开发者可根据不同的操作系统要求来具体实现相关的函数和数据结构。同时,硬件相关的驱动同样预留了接口,开发者可针对实际使用情况编写网络控制芯片驱动函数。另外,对不同的编译环境,开发者还需要编写部分头文件定义相关数据结构和宏。LwIP在μC/OS-Ⅲ嵌入式系统中的结构如图1所示,其中的箭头框为移植工作需要实现的模块。

       


        1.1 操作系统模拟层的编写
        1.1.1 编写头文件cc.h

            cc.h文件中包含处理器相关的变量类型、数据结构及字节对齐的相关宏。
            LwIP中使用的基本变量类型均以位数进行命名,为抽象的变量定义,开发者需要根据所用处理器具体定义。基本变量的定义有两种方法:一种是将变量直接定义为C语言的基本类型,如unsigned char、int等;另一种是将变量定义为操作系统内对应的抽象变量。当使用操作系统时,应采用第二种方法。该方法的优点是变量对于处理器是“透明”的,应用程序更换硬件平台时无需修改操作系统模拟层内的定义。μC/OS-Ⅲ中对基本变量的定义在cpu.h文件中,均以CPU为命名前缀。对于这些变量在μC/OS-Ⅲ中具体如何定义本文不做讨论。LwIP要求定义8 bit、16 bit、32 bit和内存指针型变量:
            typedef    CPU_INT08U        u8_t;
            typedef    CPU_INT08S        s8_t;
            typedef    CPU_INT16U        u16_t;
            typedef    CPU_INT16S        s16_t;
            typedef    CPU_INT32U        u32_t;
            typedef    CPU_INT32S        s32_t;
            typedef    CPU_INT32U        mem_ptr_t;
            由于ARM处理器的编译环境默认对变量存储采取4 B对齐方式,而以太网数据包等结构体要求处理器按照变量的实际大小存储和访问,因此,需要定义相关的结构封装宏,使得结构体内的成员变量不以4 B对齐的方式进行存储。移植工作采用了IAR开发环境,需根据该环境定义如下相关的宏:
            #if defined (__IAR_SYSTEMS_ICC__)
            #define  PACK_STRUCT_BEGIN
            #define  PACK_STRUCT_STRUCT
            #define  PACK_STRUCT_END
            #define  PACK_STRUCT_FIELD(x) x
            #define  PACK_STRUCT_USE_INCLUDES
        1.1.2 编写头文件sys_arch.h
            sys_arch.h文件要求定义操作系统相关的数据结构和宏。
            LwIP多线程功能需要信号量和邮箱等结构体,用于多个任务的同步和消息的传递。μC/OS-Ⅲ中的信号量OS_SEM和消息队列OS_Q可实现相应的功能。LwIP 1.4.0版本中使用了互斥信号量管理共享的资源,而有些嵌入式操作系统中不包含互斥信号量的变量类型。为了适应不同的操作系统,LwIP定义了宏LWIP_COMPAT_MUTEX。LWIP_COMPAT_MUTEX的值定义为1,则LwIP使用二值信号量代替互斥信号量以及相关的功能函数。虽然μC/OS-Ⅲ包含了互斥信号量OS_MUTEX,但LwIP中两种数据结构可相互替换,选择使用二值信号量可以减少一定的移植工作。
            #define  LWIP_COMPAT_MUTEX        1
            typedef  OS_SEM                    sys_sem_t;
            typedef  OS_Q                         sys_mbox_t;
            LwIP中包含有必须完整执行而不可被打断的代码,因此需要使用临界段代码保护的功能。μC/OS-Ⅲ中提供了关闭中断和锁定调度器两种临界段代码保护方法。LwIP中的临界段代码保护宏可直接定义为μC/OS-Ⅲ关闭中断的对应临界段代码保护宏。
           #define  SYS_ARCH_DECL_PROTECT() CPU_SR_ALLOC()
           #define  SYS_ARCH_PROTECT()  OS_CRITICAL_ENTER()
           #define  SYS_ARCH_UNPROTECT() OS_CRITICAL_EXIT()
继承事业,薪火相传
返回列表