基于ucOSII系统及LWip协议栈建立多TCP线程服务器注意事项

更新时间:2023-10-30 09:34:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于ucsO II系统及LWip协议栈建立多TCP线程服务器注意事项

2014.09.12

一、ucOS II 与多任务相关配置 1、os_cfg.h中

#define OS_MAX_EVENTS 20u #define OS_MAX_FLAGS 2u #define OS_MAX_MEM_PART 5u #define OS_MAX_QS 20u #define OS_MAX_TASKS 20u

二、Lwip协议栈与多TCP连接相关配置 1、lwipopts.h中

#define MEMP_NUM_TCP_PCB 10 #define MEMP_NUM_TCP_PCB_LISTEN 6 #define MEMP_NUM_SYS_TIMEOUT 10

#define PBUF_POOL_SIZE 10 注意:

MEMP_NUM_TCP_SEG 应设置为至少与 TCP_SND_QUEUELEN一样大

2、sys_arch.h中

#define MAX_QUEUES 10 /* the number of mailboxes */ #define MAX_QUEUE_ENTRIES 20 /* the max size of each mailbox */

#define LWIP_TASK_MAX (LWIP_TASK_END_PRIO - LWIP_TASK_START_PRIO + 1)

-------------------------------------------------------------------------------------------------------

发现问题:LWIP 服务器不能接收多于2个客户端的TCP连接 解决办法:

将下面 OS_MAX_QS 数量改大,为20,问题解决 #define OS_MAX_QS 4u

调试过程:

1、 定义LWIP_DEBUG 允许打印调试信息

在lwipopt.h中,加一句 #define LWIP_DEBUG

2、 打开TCP_DEBUG开关,在opt.h中,修改如下:

#define TCP_DEBUG LWIP_DBG_ON 3、 运行程序,查看调试信息,如下:

TCP connection request 45091 -> 8000. TCP connection established 45091 -> 8000. tcp_pcb_purge

tcp_pcb_purge: data left on ->unacked 4、解决过程:

由上面调试信息发现新建立的连接被丢弃, 错误发生在accept_function()中,

/* We have to set the callback here even though

* the new socket is unknown. conn->socket is marked as -1. */ newconn = netconn_alloc(conn->type, conn->callback); if (newconn == NULL) { return ERR_MEM; }

其中,调用netconn_alloc( )时候,出错,返回NULL,再细看netconn_alloc( )函数, 其中如下程序出错,返回了NULL

if ((conn->recvmbox = sys_mbox_new(size)) == SYS_MBOX_NULL) { sys_sem_free(conn->op_completed); memp_free(MEMP_NETCONN, conn);

return NULL;

再细看,sys_mbox_new()函数, 其中如下程序出错,

pQDesc->pQ = OSQCreate( &(pQDesc->pvQEntries[0]), size ); LWIP_ASSERT( \ if( pQDesc->pQ != NULL ) { return pQDesc; }

因此,将问题锁定在OSQCreate()函数

pq = OSQFreeList; /* Get a free queue control block */

if (pq != (OS_Q *)0) { /* Were we able to get a queue control block ? */

OSQFreeList = OSQFreeList->OSQPtr; /* Yes, Adjust free list pointer to next free*/ OS_EXIT_CRITICAL();

pq->OSQStart = start; /* Initialize the queue */ pq->OSQEnd = &start[size]; pq->OSQIn = start; pq->OSQOut = start; pq->OSQSize = size; pq->OSQEntries = 0u;

pevent->OSEventType = OS_EVENT_TYPE_Q; pevent->OSEventCnt = 0u; pevent->OSEventPtr = pq; #if OS_EVENT_NAME_EN > 0u

pevent->OSEventName = (INT8U *)(void *)\#endif

OS_EventWaitListInit(pevent); /* Initalize the wait list */ } else {

pevent->OSEventPtr = (void *)OSEventFreeList; /* No, Return event control block on error */

OSEventFreeList = pevent; OS_EXIT_CRITICAL(); pevent = (OS_EVENT *)0; }

查看OSQFreeList定义,发现在ucos_ii.h中,有如下定义: #if (OS_Q_EN > 0u) && (OS_MAX_QS > 0u)

OS_EXT OS_Q *OSQFreeList; /* Pointer to list of free QUEUE control blocks */ OS_EXT OS_Q OSQTbl[OS_MAX_QS]; /*Table of QUEUE control blocks */ #endif

而查看 OS_MAX_QS 的宏定义发现: #define OS_MAX_QS 4u

就是这里出了问题,导致LWIP接收新连接后,由于usOS ii操作系统消息最大数受限制为4,而不能建立新的TCP连接,因为每个新连接都需要注册一个消息,应用线程通过消息与TCP 线程通信。修改这里后,程序测试OK。

本文来源:https://www.bwwdw.com/article/18j2.html

Top