导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[luzhl88]lwip 到 lxRTOS 移植实现



No.106149
作者:luzhl88
邮件:s6s6@sina.com
ID:73152
登陆:2次
文章数:2篇
最后登陆IP:61.141.70.88
最后登陆:2007/5/20 21:27:56
注册:2007/3/30 13:56:19
财富:111
发帖时间:2007/5/20 21:27:56
发贴者IP:61.141.70.88
标题:luzhl88:lwip 到 lxRTOS 移植实现
摘要:No.106149lwip 到 lxRTOS 移植实现 
lwip 到 lxRTOS 移植实现

一. 从  下载 lxRTOS 最新版本, 从  下载 lwip 最新版本.
    移植 lwip 需实现 cc.h cpu.h perf.h sys_arch.h 和 sys_arch.c 文件, 保存到 lwip-x.x.x/arch 目录下, 以下为这五个文件移植到 lxRTOS 上的实现.


二. cc.h 定义与体系结构环境, 编译器, 平台等相关的内容. 其中有 lwip 基本数据类型定义, 数据结构包装方法定义, 调试诊断和打印输出定义等. 通过 cc.h 使得 lwip 实现与平台无关.

#ifndef __ARCH_CC_H__
#define __ARCH_CC_H__

#include "../arch/cpu.h"
#include "../arch/sys_arch.h"

typedef unsigned   char    u8_t;
typedef signed     char    s8_t;
typedef unsigned   short   u16_t;
typedef signed     short   s16_t;
typedef unsigned   long    u32_t;
typedef signed     long    s32_t;
typedef unsigned   int     mem_ptr_t;

#define PACK_STRUCT_FIELD(x) x __attribute__((packed))
#define PACK_STRUCT_STRUCT   __attribute__((packed))
#define PACK_STRUCT_BEGIN
#define PACK_STRUCT_END

extern void _dbg_print(const char* fmt, ...);

#define LWIP_PLATFORM_DIAG(x)   do { _dbg_print x; } while(0)
#define LWIP_PLATFORM_ASSERT(x) do { _dbg_print("Assertion %s failed at line %d in %s\n", x, __LINE__, __FILE__); while(1); } while(0)
#define U16_F "u"
#define U32_F "u"
#define S16_F "d"
#define S32_F "d"
#define X16_F "X"
#define X32_F "X"

#endif /* __ARCH_CC_H__ */


三. cpu.h 定义与 CPU 相关的内容, 在这里定义有 CPU 的 endian.

#ifndef __ARCH_CPU_H__
#define __ARCH_CPU_H__

#ifndef BYTE_ORDER
#define BYTE_ORDER LITTLE_ENDIAN
#endif /* BYTE_ORDER */

#endif /* __ARCH_CPU_H__ */


四. perf.h 定义特定体系结构下性能测量的操作, 在这里定义为空.

#ifndef __ARCH_PERF_H__
#define __ARCH_PERF_H__

#ifdef PERF
#else /* PERF */
#define PERF_START    /* null definition */
#define PERF_STOP(x)  /* null definition */
#endif /* PERF */

#endif /* __ARCH_PERF_H__ */


五. sys_arch.h 定义 lwip 线程, 轻量同步(开/关中断), 邮箱, 信号量等的数据类型.

#ifndef __ARCH_SYS_ARCH_H__
#define __ARCH_SYS_ARCH_H__

#define SYS_MBOX_NULL NULL
#define SYS_SEM_NULL  NULL

typedef int   sys_thread_t;
typedef int   sys_prot_t;
typedef void* sys_mbox_t;
typedef void* sys_sem_t;

#endif /* __ARCH_SYS_ARCH_H__ */


六. sys_arch.c 为 lwip 移植的实现代码.

// 必要的头文件
#include "../arch/cc.h"
#include "../lwip/err.h"
#include "../lwip/sys.h"
#include "../lwip/pbuf.h"
#include "../lwip/mem.h"
#include "../lwip/memp.h"
#include "../lwip/stats.h"
#include "../lwip/ip_addr.h"
#include "../lwip/netif.h"
#include "../lwip/ip.h"
#include "../lwip/raw.h"
#include "../lwip/tcpip.h"
#include "../../lxRTOS-2.2.1/lxRTOS/lxRTOS.h"


// 网络接口与ip地址.
static struct netif     _netif;
static struct ip_addr   _ipaddr = { (205  <  <24) | (1  <  <16)   | (168  <  <8) | (192  <  <0) };
static struct ip_addr   _netmask= { (0  <  <24)   | (255  <  <16) | (255  <  <8) | (255  <  <0) };
static struct ip_addr   _gw     = { (1  <  <24)   | (1  <  <16)   | (168  <  <8) | (192  <  <0) };

// 网络接口初始化和接口数据输入到lwip, 在 wip-x.x.x/netif/ethernetif.c 中实现.
extern void ethernetif_init(struct netif *netif);
extern void ethernetif_input(struct netif *netif, struct pbuf *p);

// 网卡初始化与网卡数据接收中断, 在网卡驱动程序中实现.
extern void eth_init(void);
extern void eth_rx(int irq, void *devid);

// 初始化网卡与网络接口.
err_t init_ethernetif(struct netif *netif)
{
    // 初始化网卡.
    eth_init();
    // 初始化网络接口.
    ethernetif_init(netif);
    return ERR_OK;
}

// 接收网卡数据的线程.
void ethernet_rev(void *param)
{
    handle_t      mbox;
    struct netif *netif;
    struct pbuf  *p;

    // 将网络接口添加到lwip和设置网络接口的ip地址.
    netif = netif_add(&_netif, &_ipaddr, &_netmask, &_gw,
                Null, init_ethernetif, tcpip_input);

    // 创建邮箱, 接收从网卡中断服务程序传过来的数据包.
    mbox = (handle_t)CreateMailbox(8);
    // 安装网卡中断服务程序, 第一个参数为中断向量号.
    SetInterrupt(22, eth_rx, 0, (void *)mbox);

    for(;;)
    {
        // 接收网卡数据包.
        FetchMail(mbox, (void **)&p, -1);
        // 数据包送到lwip处理.
        ethernetif_input(netif, p);
    }
}

// 初始化lwip.
void sys_init(void)
{
    netif_init();
    mem_init();
    memp_init();
    pbuf_init();
    stats_init();
    raw_init();
    tcpip_init(Null, Null);
    // 创建接收网卡数据的线程. 在这里使用单独的线程来执行 ethernetif_input().
    sys_thread_new(ethernet_rev, (void *)0, TCPIP_THREAD_PRIO);
}

// 创建信号量, 调用lxRTOS直接创建信号量.
sys_sem_t sys_sem_new( ......

>>返回讨论的主题



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


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

   




老古网执行:16毫秒 最大:78531毫秒 查询6次