基于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。
正在阅读:
基于ucOSII系统及LWip协议栈建立多TCP线程服务器注意事项10-30
10kV箱型固定式高压开关柜技术规范书08-26
部编人教版三年级上册语文素材-4.古诗三首-人教(部编版)04-26
那一次,我认识到智慧的力量作文(5篇)05-06
15秋福师《学前心理学》在线作业二答案01-17
教育心理学04-01
小学美术说课稿模板02-28
邮政营业员(中级)学习资料 (1)05-11
中国农业大学教职工之家评审办法09-25
2016年7月2日托福真题回忆03-19
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 线程
- 注意事项
- 基于
- 协议
- 建立
- 服务器
- ucOSII
- 系统
- LWip
- TCP
- 浙教版七年级数学上册期末试卷 难
- 断桥铝合金门窗 施工组织设计
- 火灾应急预案演练记录 2017-3-13 - 图文
- 实验二 Word2010的图文混排
- 幼儿园教研活动方案
- 技术经济学知识点汇总
- 规划展览馆讲解稿
- 生产安全事故应急能力评估报告 - 图文
- 如何归档文书电子文件120428
- 最新英语四级词汇乱表
- 实验名称 4PSK通信系统的蒙特卡洛仿真
- 2017年黑龙江期货从业基础知识资料:美国期货市场考试试卷
- 立思辰留学360:2017丹麦留学经历
- 能源管理规定(2012)
- 2018朝阳区高三二模化学试题及答案
- 2017年六年级数学上册思维训练题及答案
- 三年级上英语unit2+colours单元测试及答案(含听力材料)
- 新审定人教五年级数学下册第4单元《分数的意义和性质》教学设计(1) - 图文
- 成都市旅游资源分类、调查与评价
- 服装材料学试题 - 王革辉