
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。
