最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

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

来源:动视网 责编:小OO 时间:2025-10-01 19:24:35
文档

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

基于ucsOII系统及LWip协议栈建立多TCP线程服务器注意事项2014.09.12一、ucOSII与多任务相关配置1、os_cfg.h中#defineOS_MAX_EVENTS20u#defineOS_MAX_FLAGS2u#defineOS_MAX_MEM_PART5u##20u二、Lwip协议栈与多TCP连接相关配置1、lwipopts.h中#10#defineMEMP_NUM_TCP_PCB_LISTEN6注意:MEMP_NUM_TCP_SEG应设置为至少与TCP_SND_QUEUE
推荐度:
导读基于ucsOII系统及LWip协议栈建立多TCP线程服务器注意事项2014.09.12一、ucOSII与多任务相关配置1、os_cfg.h中#defineOS_MAX_EVENTS20u#defineOS_MAX_FLAGS2u#defineOS_MAX_MEM_PART5u##20u二、Lwip协议栈与多TCP连接相关配置1、lwipopts.h中#10#defineMEMP_NUM_TCP_PCB_LISTEN6注意:MEMP_NUM_TCP_SEG应设置为至少与TCP_SND_QUEUE
基于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  

#  20u  

二、Lwip协议栈与多TCP连接相关配置

1、lwipopts.h中

#  10

#define MEMP_NUM_TCP_PCB_LISTEN  6

注意:

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

2、sys_arch.h中

#   /* the number of mailboxes */

#define MAX_QUEUE_ENTRIES 20

#define LWIP_TASK_MAX (LWIP_TASK_END_PRIO - LWIP_TASK_START_PRIO + 1)

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

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

解决办法:

将下面 OS_MAX_QS 数量改大,为20,问题解决

调试过程:

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

  newconn = netconn_alloc(conn->type, conn->callback);

  if (newconn == NULL) {

  }

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

其中如下程序出错,返回了NULL

if ((conn->recvmbox =sys_mbox_new(size)) == SYS_MBOX_NULL) {

return NULL;

再细看,sys_mbox_new()函数,

其中如下程序出错,

pQDesc->pQ =OSQCreate( &(pQDesc->pvQEntries[0]), size );

 

 

 

  

 

因此,将问题锁定在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 */

 

 

 

 

 

 

 

 

#if OS_EVENT_NAME_EN > 0u

#endif

            OS_EventWaitListInit(pevent);  /*      Initalize the wait list              */

            OSEventFreeList    = pevent;

   pevent = (OS_EVENT *)0;

查看OSQFreeList定义,发现在ucos_ii.h中,有如下定义:

#if (OS_Q_EN > 0u) && (OS_MAX_QS > 0u)

O /* 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线程服务器注意事项

基于ucsOII系统及LWip协议栈建立多TCP线程服务器注意事项2014.09.12一、ucOSII与多任务相关配置1、os_cfg.h中#defineOS_MAX_EVENTS20u#defineOS_MAX_FLAGS2u#defineOS_MAX_MEM_PART5u##20u二、Lwip协议栈与多TCP连接相关配置1、lwipopts.h中#10#defineMEMP_NUM_TCP_PCB_LISTEN6注意:MEMP_NUM_TCP_SEG应设置为至少与TCP_SND_QUEUE
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top