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

上传人:苏美尔 文档编号:7208940 上传时间:2020-11-06 格式:DOC 页数:3 大小:21.50KB
返回 下载 相关 举报
基于ucOSII系统及LWip协议栈建立多TCP线程服务器注意事项.doc_第1页
第1页 / 共3页
基于ucOSII系统及LWip协议栈建立多TCP线程服务器注意事项.doc_第2页
第2页 / 共3页
基于ucOSII系统及LWip协议栈建立多TCP线程服务器注意事项.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《基于ucOSII系统及LWip协议栈建立多TCP线程服务器注意事项.doc》由会员分享,可在线阅读,更多相关《基于ucOSII系统及LWip协议栈建立多TCP线程服务器注意事项.doc(3页珍藏版)》请在三一文库上搜索。

1、基于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 ME

2、MP_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 服

3、务器不能接收多于2个客户端的TCP连接解决办法:将下面 OS_MAX_QS 数量改大,为20,问题解决#define OS_MAX_QS 4u调试过程:1、 定义LWIP_DEBUG 允许打印调试信息在lwipopt.h中,加一句#define LWIP_DEBUG2、 打开TCP_DEBUG开关,在opt.h中,修改如下:#define TCP_DEBUG LWIP_DBG_ON3、 运行程序,查看调试信息,如下:TCP connection request 45091 - 8000.TCP connection established 45091 - 8000.tcp_pcb_purget

4、cp_pcb_purge: data left on -unacked4、解决过程:由上面调试信息发现新建立的连接被丢弃,错误发生在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

5、( )时候,出错,返回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-pvQEntries0), size ); LWIP_ASSERT( OSQCreate , pQDes

6、c-pQ != NULL );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

7、(); pq-OSQStart = start; /* Initialize the queue */ pq-OSQEnd = &startsize; 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 *)?

8、;#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 OSQTblOS_MAX_QS; /*Table of QUEUE control blocks */#endif而查看 OS_MAX_QS 的宏定义发现:#define OS_MAX_QS 4u就是这里出了问题,导致LWIP接收新连接后,由于usOS ii操作系统消息最大数受限制为4,而不能建立新的TCP连接,因为每个新连接都需要注册一个消息,应用线程通过消息与TCP 线程通信。修改这里后,程序测试OK。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1