1、概述:
LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件、OS、编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下。因此LwIP在uCOS II上的实现就是修改这个目录下的文件,其它的文件一般不应该修改。下面分几部份分别说明相应文件的实现原理和过程。
2、与CPU或编译器相关的include文件:
ucosii&LwIPsource etlwiparchucosIIincludearch目录下cc.h、cpu.h、perf.h中有一些与CPU或编译器相关的定义,如数据长度,字的高低位顺序等。这应该与用户实现µC/OS II时定义的数据长度等参数是一致的。
#define BYTE_ORDER LITTLE_ENDIAN //C33209默认为小端存储系统
//数据类型长度的定义
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(C33209)上对应gcc编译器的定义:
#define PACK_STRUCT_FIELD(x) x __attribute__((packed))
#define PACK_STRUCT_STRUCT __attribute__((packed))
#define PACK_STRUCT_BEGIN
#define PACK_STRUCT_END
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/OS-II没有对消息队列中的消息进行管理,因此不能直接使用,必须在µC/OS-II的基础上重新实现。为了实现对消息的管理,我们定义了以下结构:
typedef struct {
OS_EVENT* pQ;
void* pvQEntries[MAX_QUEUE_ENTRIES];
} sys_mbox_t;
在以上结构中,包括OS_EVENT类型的队列指针(pQ)和队列内的消息(pvQEntries)两部分,对队列本身的管理利用µC/OS-II自己的OSQ操作完成,然后使用µC/OS-II中的内存管理模块实现对消息的创建、使用、删除回收,两部分综合起来形成了LwIP的消息队列功能。
(3) sys_arch_timeout 函数
LwIP中每个与外界网络连接的线程都有自己的timeout属性,即等待超时时间。这个属性表现为每个线程都对应一个sys_timeout结构体队列,包括这个线程的timeout时间长度,以及超时后应调用的timeout函数,该函数会做一些释放连接,回收资源的工作。如果一个线程对应的sys_timeout为空(NULL),说明该线程对连接做永久的等待。
timeout结构体已经由LwIP自己在sys.h中定义好了,而且对结构体队列的数据操作也由LwIP负责,我们所要实现的是如下函数:
struct sys_timeouts * sys_arch_timeouts(void)
这个函数的功能是返回目前正处于运行态的线程所对应的timeout队列指针。timeout队列属于线程的属性,因此是OS相关的函数,只能由用户实现。
(4) sys_thread_new 创建新线程
LwIP可以是单线程运行,即只有一个tcpip线程(tcpip_thread),负责处理所有的tcp/ucp连接,各种网络程序都通过tcpip线程与网络交互。但LwIP也可以多线程运行,以提高效率,降低编程复杂度。这时就需要用户实现创建新线程的函数:
void sys_thread_new(void (* thread)(void *arg), void *arg);
在µC/OS II中,没有线程(thread)的概念,只有任务(Task)。它已经提供了创建新任务的系统API调用OSTaskCreate,因此只要把OSTaskCreate封装一下,就可以实现sys_thread_new。需要注意的是LwIP中的thread并没有µC/OS II中优先级的概念,实现时要由用户事先为LwIP中创建的线程分配好优先级。
4、lib_arch中库函数的实现:
LwIP协议栈中用到了8个外部函数,这些函数通常与用户使用的系统或编译器有关,因此留给用户自己实现。如下:
u16_t htons(u16_t n); //16位数据高低字节交换
u16_t ntohs(u16_t n);
u32_t htonl(u32_t n); //32位数据大小头对调
u32_t ntohl(u32_t n);
int strlen(const char *str); //返回字符串长度
int strncmp(const char *str1, const char *str2, int len); //字符串比较
void bcopy(const void *src, void *dest, int len); //内存数据块之间的互相拷贝
void bzero(void *data, int n); //内存中指定长度的数据块清零
前四个函数通常由用户自己实现。在我的系统中,由于使用了gcc编译器,gcc的lib库里已经有了两个字符串操作函数。若用户的编译器的库中没有这些函数,需要自己编写。
5、网络设备驱动程序:
在我的系统中使用的网络芯片为RealTek的8019as芯片,这是ISA 10BASE-T的以太网芯片,与Ne2k兼容。所以目前实现的网络设备驱动是针对Ne2k的,其它类型的网络芯片驱动可以在LwIP的网站上找到。LwIP的网络驱动有一定的模型,ucosii&LwIPsource etlwiparchucosII etif 中的ne2kif.c文件即为驱动的模板,用户为自己的网络设备实现驱动时应参照此模板。
在LwIP中可以有多个网络接口,每个网络接口都对应了一个struct netif,这个ne2kif包含了相应网络接口的属性、收发函数。LwIP调用ne2kif的方法netif->input()及netif->output()进行以太网packet的收、发等操作。在驱动中主要做的,就是实现网络接口的收、发、初始化以及中断处理函数。驱动程序工作在IP协议模型的网络接口层,它提供给上层(IP层)的接口函数如下:
//网卡初始化函数
void low_level_init (struct netif *netif)
//网卡接收函数,从网络接口接收以太网数据包并把其中的IP报文向IP层发送
//在中断方式下由网卡ISR调用
void ne2k_recv_packet (struct netif *netif)
//网卡发送函数,给IP层传过来的IP报文加上以太网包头并通过网络接口发送
err_t ne2k_send_packet (struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr)
//网卡中断处理函数ISR
void ne2k_isr (void);
以上的函数都可以分为协议栈本身的处理和对网络接口硬件的操作两部份,但硬件操作是对上层屏蔽的,具体参见RTL8019as、DM9008等Ne2k网络芯片的数据手册。驱动程序可以到LwIP的网站下载。
6、应用实例的建立和测试
做完上面的移植修改工作以后,就可以在uCOS II中初始化LwIP,并创建TCP或UDP任务进行测试了。这部份完全是C语言的实现,因此这部份在ez80和ARM7上基本都是一样的。值得注意的是LwIP的初始化必须在uCOS II完全启动之后也就是在任务中进行,因为它的初始化用到了信号量等OS相关的操作。关键部份的代码和说明如下:
void start_kernel(void)
{
int LineNo10 = 0;
int LineNo11 = 1;
int LineNo12 = 2;
int LineNo13 = 3;
int LineNo14 = 4;
OSInit();
OSTaskCreate(lwip_init_task, &LineNo10, &lwip_init_stk[TASK_STK_SIZE-1], 0);
OSTaskCreate(usr_task,&LineNo14,&usr_stk[TASK_STK_SIZE-1],20);
vRTCStart();
OSStart();
/* NEVER EXECUTED */
while(1);
}
主程序中创建了lwip_init_task初始化LwIP任务(优先级0)和usr_task用户任务(优先级20)。lwip_init_task任务中除了初始化硬件时钟和LwIP之外,还创建了tcpip_thread(优先级5)和tcpecho_thread(优先级6)。实际上tcpip_thread才是LwIP的主线程,多线程的Berkley API也是基于这个线程实现的,即上面的tcpecho_thread线程也要依靠tcpip_thread线程来与外界通信,这样做的好处是编程简单,结构清晰。
实用Berkley API实现的tcpecho_thread是一个TCP echo服务器,监听7号端口,程序框架如下:
void tcpecho_thread(void *arg){
conn = netconn_new(NETCONN_TCP); //创建新的连接标识
netconn_bind(conn, NULL, 7); //绑定到7号端口
netconn_listen(conn); //开始监听端口
while(1){
newconn = netconn_accept(conn); //接收外部到来的连接
buf = netconn_recv(newconn) //获取数据
……. //处理数据
netconn_write(newconn, data, len, NETCONN_COPY); //发送数据
netconn_delete(newconn); //释放本次连接
}
}
编译运行后,用ping ip地址命令可以得到ICMP reply响应。用telnet ip地址 7(登录7号端口)命令可以看到echo server的回显效果。说明ARP、ICMP、IP、TCP协议都已正确运行。
LwIP协议栈在uCOS II下的实现
- LwIP(26552)
- 协议栈(33348)
- uCOS II(22657)
相关推荐
LWIP协议栈的TCP连接的本地端口为什么一直在变化?
LWIP协议栈的RAW_TCP客户端那个例程中,本地端口一直在变化是为什么?我想让开发板的本机端口固定住应该怎么修改?在例程的哪里可以修改?
2019-09-17 23:21:47
LwIP协议栈开发嵌入式网络有哪几种方法
LwIP协议栈开发嵌入式网络的三种方法分析摘要 轻量级的TCP/IP协议栈LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操作系统中。本文结合μC/OS-II这一实时操作系统,以建立
2021-08-06 07:33:33
LwIP协议栈开发嵌入式网络的三种方法有何关系
LwIP协议栈开发嵌入式网络的三种方法分析 轻量级的TCP/IP协议栈LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操作系统中。本文结合μC/OS-II这一实时操作系统,以建立TCP
2021-08-05 07:55:17
LwIP是什么意思
是:用少量的资源消耗实现一个较为完整的TCP/IP协议栈,其中“完整”主要指的是TCP协议的完整性,实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。此外LwIP既可以移植到操作系统上运行
2021-08-24 06:24:12
UCOS II任务栈使用率一直是100%
我在使用ucos ii移植到STM32时发现一个问题,具体如下: 我用内存管理函数创建的任务栈,然后调用OSTaskStkChk对任务栈进行检测,发现任务栈使用率一直是100%,多次实验后发现
2020-03-11 02:50:51
lwip移植到ucsos-ii平台的步骤
移植的步骤参照《Day_Day_Up笔记之uCOS-II_LwIP_在_STM32F107_上移植》,《uCOS平台下的LwIP移植笔记》,《嵌入式网络那些事》。 首先说说自己的准备的工程,在
2021-08-23 06:22:21
ucos II下407作为服务端时总是报出以下情况是怎么回事?
ucos II 下407 单独作为tcp客户端或者服务端时都可以正常工作。如果同时作为tcp 客户端和服务端,作为服务端时总是报出Assertion "OSQCreate" failed at line 67 in ..\LWIP\arch\sys_arch.c。
2019-10-24 03:25:46
ucos_ii 每个任务具体定义栈大小
在ucos_ii 系统中,针对每个任务怎么来分配其栈的大小。我在程序中对一个只是LED点亮的任务,如果真是LED,大小为10就可以正常运行,如果增加一个消息队列,再用10就不能运行,我定义为80,就能够正常运行。到底是应该怎么定义栈的大小那。
2014-04-30 17:43:32
协议栈介绍
协议栈介绍本协议栈的联系方式:qq:292942278附件代码是在ARM7(LPC2210)下开发,用于用户参考。本协议栈已经移植到ARM9(ATMEL AT91RM9200),使用操作系统UCOS
2015-09-14 08:44:24
协议栈介绍
,在使用上与一般的协议栈相同,可能只是在具体的使用细节可能有点不同。3)本协议栈设计时使用标准UCOS-II操作系统。也可使用其它操作系统下运行。4)本协议栈支持ARP,IP,ICMP,TCP,UDP
2015-09-03 15:02:00
协议栈介绍--TCP/IP
,在使用上与一般的协议栈相同,可能只是在具体的使用细节可能有点不同。3)本协议栈设计时使用标准UCOS-II操作系统。也可使用其它操作系统下运行。4)本协议栈支持ARP,IP,ICMP,TCP,UDP
2015-09-03 15:03:59
在Ucos-ii文件夹下新建文件夹inc和src
1、新建文件夹Ucos-ii2、在Ucos-ii文件夹下新建文件夹inc和src3、新建ucos-ii组4、将Ucos-ii/src下的.c和.asm放到ucos-ii组下5、将app_cfg.h
2021-08-24 08:06:52
在BL706上基于LwIP协议栈实现一个HTTP服务器
是万维网的数据通信的基础。本 demo 主要是在 BL706 上基于 LwIP 协议栈,实现一个 HTTP 服务器,在 BL706 上部署了一个简单的网页,然后我们可以通过浏览器去访问 BL706
2022-07-04 18:13:29
CC2530协议栈下很精确的延时函数是什么?
CC2530协议栈下很精确的延时函数是什么?协议栈下精确的1微秒、10微秒延时函数。在裸机上面(基础实验)能实现SHT11温湿度数据的采集,但是把他移植到协议栈下,使用协议栈自带的延时函数,但采集不到数据,猜想是协议栈下延时函数不精确导致数据出现问题。
2016-03-28 10:02:16
RTOS环境下的RAW API与LwIP协议栈进行交互
前言这篇文章是 LwIP应用笔记(二):无操作系统支持下的RAW API移植 的后续,以下所有内容都是建立在已经完成RAW API移植的前提下。本文可能不会太纠结于代码细节,因为本文的目标并不是演示
2022-01-19 06:48:00
STM32F407+ucos-iii+lwip1.4.1移植分享!
这是我自己参考原子ucos-ii+lwip移植的,目前测试lwip没有问题,如图1,开发板做tcp服务器,PC的调试助手做客户端,1秒钟发送一次,每次发送1000字节。注意:1,我用到的STM32
2019-11-10 23:05:24
UDP在LWIP协议栈上的实现
。因此所有以广播、组播方式通信的协议都是在UDP协议上实现的,如我们常见的DHCP、SNMP协议。1.3 报文格式本篇文章重点是UDP在LwIP中的实现,报文格式就不再展开介绍了,但还是可以直观地看出
2022-11-14 16:52:04
为什么LWIP双向发送大量数据时网络协议栈会崩溃?
鼠标坐标信息,LWIP协议栈就在几秒内挂掉,LWIP通过串口留下的遗书是以下两个的其中之一(不会两个都同时出现):Assertion"netconn_accept:invalid
2019-11-04 03:19:48
为什么STM32F407+LWIP+UCOS II最终都会崩溃?
我自制PCB,STM32F407+4M SRAM+DP83848,运行LWIP+UCOS II,没有见面操作,只运行MODBusTCP+TCP Server,MODBusTCP PC客户端每
2019-11-08 00:34:04
以UCOS-II为例介绍下实时操作系统的移植
用操作系统,比如BLE协议栈应用开发就是用了状态机模型,但如果需要处理器完成的任务比较多,为了便于管理可以引入轻巧的实时操作系统,下面以UCOS-II为例介绍下实时操作系统的移植。1. UCOS的底层支...
2021-08-05 08:12:06
基于LwIP轻量级网络协议栈实现一个TCP协议通信的例程
1、基于LwIP轻量级网络协议栈实现一个TCP协议通信的例程硬件准备一块 BL706 ETH 开发板一块 PHY 8720 模块一个串口线一根标准 5/6 类网线硬件连接本 demo
2022-06-29 17:58:21
基于LwIP轻量级网络协议栈实现一个UDP协议通信例程
本 demo 基于 BL706 ETH 开发板,并基于 LwIP 轻量级网络协议栈,实现了一个 UDP 协议通信的例程。以太网 PHY 芯片这里使用的是 PHY8720硬件准备一块 BL706
2022-06-17 17:49:27
基于μC/OS—II的μC/IP协议栈在ARM系统中的实现
基于μC/OS—II的μC/IP协议栈在ARM系统中的实现深入分析了UC/IP协议栈,阐述了其移植原理和实现方案,并给出了在具体软硬件平台上的移植实例。首先,通过分析UC/IP协议栈,结合实时内核
2009-03-28 14:04:52
如何将LwIP协议栈移植到μC/OS-II实时操作系统上去呢
LwIP协议是什么?什么是μC/OS-II实时操作系统呢?如何将LwIP协议栈移植到μC/OS-II实时操作系统上去呢?
2021-11-05 08:44:35
实时操作系统μC/OS-Ⅱ下TCP/IP协议栈的实现,不看肯定后悔
基于µC/OS II的网络平台介绍开源TCP/IP协议栈LwIP是什么LwIP在µC/OS II下的实现方法
2021-04-28 06:44:36
怎么使用stm32的LWIP协议栈进行报文调度算法的开发?
各位朋友好,我的导师要求我设计一个新的报文调度算法,能够实现不同优先级的报文在发送的过程中,实现高优先级报文的低延时和低抖动。要求使用stm32的LWIP协议栈进行报文调度算法的开发,请问要实现
2020-04-07 04:35:59
怎样通过以太网+LWIP协议栈实现远程升级stm32f407开发板呢
LAN8720与DP83848有哪些区别?怎样通过以太网+LWIP协议栈实现远程升级stm32f407开发板呢?
2021-10-21 06:48:05
第9章 RL-TCPnet网络协议栈移植(uCOS-III)
转最新教程本章教程为大家讲解RL-TCPnet网络协议栈的uCOS-III操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文件、配置文件和驱动文件即可。另外
2017-10-22 13:48:28
网络协议栈-lwip2.1.2移植
本篇目标:上一篇freertos的优化(stm32f4_os_app)中,RTOS的移植已经告一段落了,接下来就是移植重要的网络协议栈-lwip2.1.2!硬件配置:STM32_ETH以太网
2021-08-16 08:08:40
请问lwip的server web的那些ssi和cgi是协议栈提供的吗?
想请教下,lwip的server web 那些ssi和cgi是协议栈提供的?哪些是自己写的
2019-06-30 22:50:22
请问F429接wifi芯片需要lwip协议栈吗?
F429内部提供了802.3的MAC层,但是没有802.11的,如果我想外接WIFI的话,怎么接?还有就是外接WIFI芯片需不需要 lwip协议栈,好像有不少芯片直接用spi或者uart和mcu通讯,还用得上lwip吗?
2019-04-25 06:35:38
请问不用lwip协议栈怎么实现上下位机的以太网通信?
各位仁兄下午好,小弟当前在做下位机(STM32平台)与上位机(电脑)的以太网通信,本来想用lwip协议栈移植的方式来做,但上位机软件编起来比较麻烦,所以想问:1. 能否不用TCP/IP协议栈,通过
2019-07-02 04:35:41
请问有ESP8266和LwIP结合的例程吗?
买板自带资料里面有UCOS有线实现LwIP的例程,还有实现ESP8266简单通信的例程,请问如何使用ESP8266实现LwIP协议栈?
2019-06-20 04:35:28
请问能在ucos3下移植lwip吗?
我的探索版stm32f407 下用ucos3emwin 平台希望移植lwip网络。原子的例程都是ucos2下的lwip移植。请问有没有ucos3下移植lwip的啊
2019-11-10 22:33:38
实时操作系统μC OS - II下TCP IP 协议栈的实现
结合在ez80 和ARM7 两种系统上的具体实现,说明如何在嵌入式实时操作系统μC/OS-II 上移植、实现LwIP 这套TCP/IP 协议栈, 使μC/OS-II 成为支持网络的RTOS。
2009-05-15 14:37:3911
COS II 下LwIP协议栈的移植和测试
把嵌入式系统连接到Internet 已经成为嵌入式系统一个重要发展方向。本文讨论如何在实时操作系统μC/OS II 下移植LwIP 协议以及测试移植后的结果,使μC/OS II 成为支持网络通信
2009-09-15 16:22:2240
uCOS II 在SkyEye 上的移植分析
uCOS II 在SkyEye 上的移植分析摘要:移植 uC/OS-II 到 SkyEye 上,既是对 uC/OS-II 的学习和实验,同时也是对 SkyEye仿真器的验证和实践。uC/OS-II 作为一个优秀的实时操作系统已经被移植
2010-02-08 09:58:1234
ucos+lwip应用心得[社区]
经过几天调试除掉几个bug以后,ucos+lwip在我的44b0+8019开发板上终于跑得比较稳定了.一只觉得lwip是一个不错的开放源码的tcp/ip 协议栈,想把自己对lwip的移植和理解写出来.但是由于最
2006-03-11 12:37:531106
UCOS II及LWIP的移植
本内容提供了UCOS II及LWIP的移植,附带详细源代码 #include isr.h #include uart.h #include segment7.h #ifdef
2011-05-11 16:49:1057
Lwip协议栈的设计方案
LWIP是TCP/IP协议栈的一种实现。LWIP的主要目的是减少存储器利用量和代码尺寸,使LWIP适合应用于小的、资源有限的处理器如嵌入式系统。为了减少处理器和存储器要求,lwIP可以通过不需
2011-09-16 15:18:3633
lwip协议中文版
LWIP是TCP/IP协议栈的一种实现。LWIP的主要目的是减少存储器利用量和代码尺寸,使LWIP适合应用于小的、资源有限的处理器如嵌入式系统。为了减少处理器和存储器要求,lwIP可以通过不需
2012-02-03 16:47:580
LwIP协议详解
LwIP协议详解,LwIP是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。
2015-11-09 18:25:2048
uCOS平台下的LwIP移植笔记
uCOS平台下的LwIP移植笔记,lwIP协议栈主要关注的是怎么样减少内存的使用和代码的大小,这样就可以让lwIP适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,lwIP对API进行了裁减,可以不需要复制一些数据。
2015-11-09 18:25:0918
uCOS-II平台下的LwIP移植笔记
uC/OS-II 平台下的 LwIP 移植笔记,本文将指导读者一步步完成 LwIP 在 ADS1.2 开发环境下的移植工作,包括底层驱动的编写。本文使用的硬件平台是 AT91SAM7X256
2016-01-06 11:31:538
uCOS-II-RefMan.PDF
uCOS-II-RefMan.PDF、ReleaseNotes.PDF、TaskAssignmentWorksheet.PDF、QuickRefChart-Color.PDF、uCOS-II-CfgMan.PDF、WhatsNewSince-V200.PDF。
2016-02-22 17:48:252
评论
查看更多