操作系统:ecos, lwip 版本:1.1.1(ecos\packages\net\lwip_tcpip\v3_0\ChangeLog
以TCP为例:
1. open命令操作包括:netconn_new()\netconn_bind(),创建task,在其中netconn_connect(),然后循环中netconn_recv();
2. close 命令:netconn_delete(),删除open时的task,清除相关保存con的信息。
3. read命令,write命令。
问题主要在open和close。由于lwip对多任务支持不好,1.1.1版本的netconn_recv()一直阻塞在那里,碰到一些问题。
a. 当反复open, close时,一段时间后(测试open第64次时出错),netconn_recv(),但buf为null,conn->err不为OK,出现了tcp conn is error,error为-1。查看lwip代码,-1为ERR_MEM:out of memory error。出现该问题后,无法恢复,open一直是这个错误。lwip netconn_recv()代码中会memp_malloc(),这里个数为64个,所以open 64次后调memp_malloc()失败。
为了能够恢复,在出错时调用memp_inint(),测试可以恢复。
b. 当open命令后紧接着close,会出现无法响应命令。发现只要close发生在open中的netconn_recv之前,就会出现。原因是close后再netconn_recv(),这时阻塞住了。---lwip用于多任务时需注意。为了规避,在open时,等到netconn_recv()时再返回结果,要求只有等open返回结果才能调用close命令。这种情况测试udp时没有出现,原因netconn_connect()在tcp中建立连接会占用一定时间,不是立刻返回,可能导致close发生在netconn_recv之前。
c. tcp在建立连接时,对端不存在,需等一段时间才能返回错误。tcp需建立连接。
udp这种情况立即返回ok。不需建立连接。虽然都调用了netconn_connect()。
下了lwip 1.3.2版本,支持netconn_recv()超时退出,修复了一些bug,后续有时间改为该版本调试。