首页 >> 配电柜箱

LwIP协议栈在NI0S系统中的移植0织布机

2022-08-12 23:39:28

LwIP协议栈在NI0SⅡ系统中的移植

LwIP协议栈在NI0SⅡ系统中的移植 摘 要:本文介绍了LwIP在NIOS Ⅱ外发环境下的移植工作,包括底层驱动的编写。系统设计采用SmartSOPC多功能外发平台,使用uC/OS—Ⅱ作为底层设计系统,围绕uC/OS—Ⅱ进行LwIP的移植,最后,通过编写RTL8019AS在LwIP下的驱动程序,完成LwIP在RTL8019AS芯片上的移植。 LwIP即轻型TCP/IP协议栈,其实现的关键是在提供全翻TCP/IP的同时减少了资源的使用,LwIP被设计用于具有存储容量有限的嵌入式系统,并实现了较为完备的IP、ICMP、UDP、tCP、DHCP、ARP,标准套接字API。LwIP为NIOS Ⅱ处理器提供对以太网连接栈的快速、开源的访问。AI tera的LwIIP端口使用uC/OS—Ⅱ多线程环境,NIOS Ⅱ处理器系统也必须包含以太网接口,LwIP驱动程序采用中断驱动,所以必须保证以太网组件的中断被连接。AItera的LwIP接口是基于HAL的通用以太网设备模型。目前,大部分文献都是根据这个模型,编写新的驱动程序,以支持任意目标以太网MAC,偏重于应用。本文阐述LwIP协议栈及其在NIOS Ⅱ系统上的移植原理,在此基础通过编写RTL8019AS在LwIP下的驱动程序,完成LwIP在RtL8019AS芯片上的移植。1 、LwIP协议介绍 与许多其它的TCP/IP实现一样,LwIP也是以分层的协议为参照——设汁实现TCP/IP。每一个协议作为一个模块被实现,同时还提供了几个函数作为协议的入口点。尽管这些协议是被独立实现的,但是有些层却不是这样,这样做的目的是为了在处理边度与内存占用率方向提开性能。比如,当验让一个到达的TCP段的校验和并且分解这个TCP段时,TCP模块必须知道该TCP段的源及目的IP地址。因为TCP模块知道IP头的结构,因此它就可以自己提取这个信息,从而取代了通过函数调用传递IP地址信息的方式。 LwIP土要可以分为以下几个层次,LwIP由几个模块纵成,除TCP/IP协议的实现模块外(IP,ICMP,UDP,TCP),还包括许多相关支持模块。这些支持模块包括:操作系统模拟层、缓冲与内存管理了系统、网络接口函数及一纵Internet校验和汁算函数,LwIP还包括一个API概要说明。LwIP 可移植到操作系统上,也可在无操作系统的情况下独立运行。LwIP则采取将所有协议驻留在同_个进程的方式,以便独立于操作系统内核之外。应用程序既可以驻留在LwIP的进程中,也可以使用_个单独的进程。应用程序与TCP/IP协议栈通讯可以采用两种方法:一种是函数调用,这适用于应用程序与LwIP使用同一个进程的情况;另一种是使用更抽象的API。2、作系统模拟层移植 为了方便LwIP移植,属于操作系统的函数阏用及数据结构并没有在代码中直接使用,而是用操作系统模拟层来代替对这些函数的使用。操作系统模拟层使用统一的接口提供定时器、进程同步及消息传递机制等诸如此类的系统服务。原则上,移植LwIP,只需针对目标操作系统修改模拟层实现即可。 因此,我们只需要针对系统所采用的NioS Ⅱ处理器、GCC编译器、uC/OS_11_2.83和RTL8019AS以太网控制器做相关的移植。2.1 0S支持的模拟层需要添加的头文件 操作系统模拟层(sys—arch)存在的目的土要是为了方便LwIP的移植,它在底层操作系统和LwIP之间提供了一个接口。这样,我们在移植LwIP到一个新的目标系统时,只需修改这个接口即可。不过,不依赖底层操作系统的支持也可以实现这个接口。LwIP协议栈把所有和硬件、编译器相关的部分独立出来,放在/src/arch下面。/arch目录下cc.h、cpu.h、perf.h 中是与Ni0S II和GCC相关的定义。 cc.h与硬件件平台及编译器相关的环境变量及数据类型声明文件。LwIP使用的数据类型定义--u8_t,s8_t,u16_t,s16_t,u32_t,s32_t.mem_ptr_t。在上向的数据类型定义中,除了mem_ptr_t之外其它类型均很直观,不需解释。至于mem_ptr_t为什么指定为u32_t,而不是伤它的影称所表现的一样将其指定为指针呢?其复原因很简单,笔者在定义它时首先找到了使用t的相关语句,从这些语句中才确定这样声明。读者可找到mem.h文件看看早向有关mem_ptr_t使用语句就能明白怎么回事。与编译器相关的LWIP结构体封装宏: PACK_STRUCT_FIELD(x) PACK_STRUCT_STRUCT PACK_STRUCT_BEGIN PACK_ STRUCT_END 与平台相关的调试输出:LWIP_PLATFORM_DIAG(X)-非故障,输出一条提示信息。LwIP_PLATFORM_ASSERT(x)-故障,输出一条故障信息并放弃执行。 这个文件要么包含一个本地系统(system_local)提供的头文件<errno.h>——这个文件定义了标准的*nix错误编码,要么增加一条宏定义语句:#define LWIP_PROVI DE_ERRN0, 这将使得Lwip/arch.h头文件来定义这些编码。这些编码被用于LwIP的各个部分。 c pu.h #define BYTE_0RDER LITTLE_ENDIAN//NioS II默认为小端存储系统 perf.h定义了性能测量使用的宏,由LwIP调用,可以将其定义为一个空的宏。 PERF_START_开始测量。 PERF_STOP(x)_结束测量并记录结果。 sys_arch.h sys_arch.c的头文件。 定义Arch(即整个移植所依赖的操作系统平台)需要的数据类型: sys_sem_t,sys_mbox_t,sys_thread_t,以及可选类型:sys_prot_t。 sys_mbox_t和 sys_sem_t变量的NULL值定义: SYS_MBOX_NULL NULL SYS_S EM_NULL NULL2.2改写操作系统有关部分的函数 sys_arch.c文件是和操作系统相关的一些结构和函数。和uC/OS-II的接U函数主要分为5个部分。 (1)信号量:LwIP 中需用信号量通信,信号量既可以是计数信号量,也可以是二值信号量——LwIP都可以正常t作。我们指定数据类型“sys_sem_t”表示信号量,对信号量的处理函数: sys_sem_t sys_sem new(u8_t count)//建立并返回一个新的信号量,量的初始状态。参数count指定信号 void sys_sem_free(sy_sem_t sem)//释放并删除一个信号量 void sys_sem_signal(sys_sem_t sem)//发送一个信号量 u32_t sys_arch_sem_wait(sys_sem_t sem,u32_t timeout))//等待指定的信号并阻塞线程。timeout参数为0,线程会一直被阻塞至收到指定的信号;非0,则线程仅被阻塞至指定的timeout时间(单位为毫秒)。在timeout参数值非0的情况下,返回值为等待指定的信号所消耗的毫秒数。如果在指定的时间内并没有收到信号,返回值为SYS_ARCH_TIMEOUT。如果线程不必再等待这个信号(也就是说,已经收到信号),返回值也可以为0。注意,LwIP实现了一个粥称与之相似的函数来阏用这个函数,sys_sem_wait(),注意区别。 (2)消息邮箱:邮箱用于消息传递,用广既可以将其实现为一个队列,允许多条消息投递到这个邮箱,也可以每次只允许投递一个消息。这两种方式LwIP部可以正常运作。不过,前者更加有效。需要用户特别注意的是投递到邮箱中的消息只能是一个指针。“sys_mbox_t”表示邮箱。 对消息邮箱的处理函数如下: sys_mbox_tsys_mbox_new(void)//建立一个空的邮箱 voi d sys_mbox_free(sys_mbox_tmbox)//释放一个邮箱。如果释放时邮箱rfl还有消息,它表明LwIP中存在一个编程错误,应该通知开发者。 void sys_mbox_post(sys_mbox_tmbox,void*msg)//投递消息“msg”到指定的邮箱“mbox”。 u32_t sys_arch_mbox_fetch(sys_mbox_tmbox,void**msg,u32_t timeout)//阻塞线程直至邮箱收到至少一条消息。最长阻塞时间由timeout参数指定(与sys_arch_sem_wait()函数类似)。msg是_个结果参数,用来保存邮箱rfl的消息指针(即*msg=ptr),它的值由这个函数设置。“msg”参数有可能为空,这表明当前这条消息应该被丢弃。 (3)系统初始化:void sys_init(void)//系统初始化 (4)等待超时函数:LwIP中每个与外界网络连接的线程部有自己的timeout属性,即等待超时时间。这个属性表现为每个线程的timeout时间长度, 以及超时后应调用的timeout函数,做相应的处理。用户要实现的函数如下: Struct sys_timeouts* sys_arch_t imeouts(void);//返回正处于运行状态的线程所对应的timeout队列指针 (5)创建新线程:LwIP可以是单线程运行,也可以多线程运行。为提高效率并降低编程复杂度,用户需要实现创建新线程的函数: sys_thread_tsys_thread_new(void(*function)(void*arg),void *arg,int prio); 在uC/OS II 中,没有线程的概念,只有任务。只要把OSTaskCreate封装_下,就可以实现sys_thread_new。3 、LwIP接口_初始设置及网络驱动 TCP/IP协议栈引入到uC/OS II 后,为了实现网络通讯还必须完成相应网络控制器驱动程序的添加。我们所使用的以太网控制器芯片为RTL801gAS。驱动程序工作在IP协议模型的网络接口层,它提供给上层(IP层)的接口函数如下: err_t zlg_avalon_rt 1801g_init(struct netif*netif)//网卡初始化函数 void zlg_avalon_rt 1801g_rx(alt_1wip_dev*dev)//网卡接收函数,由网卡ISR调用 err_t zlg_avalon_rt 1801g_output(s tructnetif*netif,struct pbuf *p,Struct ip_addr*ipaddr)//网卡发送数据函数 void zlg_avalon_rt 1801g_irq(void*context,alt_u32 interrupt);//网卡中断处理函数 void zlg_avalon_rt1801g_irq(void*context,alt_u32 interrupt);//网卡中断处理函数 以上的函数部可以分为协议栈本身的处理和对网络接口硬件的操作两部份,但硬件操作是对上层屏蔽的。4 、p ing测试 在Altera公司的Nios II IDE 7.0开发环境下以Smart SOPC多功能教学实验开发平台为目标硬件建立私为web_server的软件工程。在web_server 中建立主函数程序框架如下: int main(void) {...... 1wip_stack_init(TCPIP_PRIO,tcpip_init_done,0) OSStart(); return 0;} 编译整个工程,无错误后下载SmartSOPC_expand_lc6核,目标板接上网线,并运行整个程序,根据控制台的提示信息输入命令:ping1g2.168.0.240如果ping不通,请检查计算机的IP地址设置:,要保证汁算机和SocketServer在同一个网段。在网络连接正常的情况下,键入命令telnet 1g2.168.0.240 30登录目标板telnet echo服务,客广端用户可在显示屏幕上看到自己键入的字符。实验说明符网络协议得到正确配置,同时各任务在内核调度管理下运行正常。 通过移植在NIOS II IDE开发环境下的LwIP网络协议栈,以uC/os-II为底层操作系统,针对本系统所使用的网络芯片RtL801gAS,开发相应的LwIP驱动程序。这样LwIP协议栈就可以利用RtL801gAS进行网络数据的收发,系统具备了以太网通信功能。最后,利用LwIP的API函数,编写实现具体的网络应用程序,通过测试证明系统的以太网通信功能正常。

治包皮过长医院哪家比较好

成都早孕检查项目

唐山中医男科哪个医院好

杭州肺癌中医医院专家

婴儿及儿童期癫痫及癫痫综合征早期症状怎么检查出来

友情链接