[嵌入式网络系统设计]

关于LWIP非阻塞函数select的用法的一些问题

[复制链接]
31764|5
手机看帖
扫描二维码
随时随地手机跟帖
suhacen|  楼主 | 2012-2-4 19:12 | 显示全部楼层 |阅读模式
近来在做LWIP,接收或者连接直接用API的函数会导致阻塞,于是想到了用select,但是问题来了:用sys_thread_new新建两个线程,分别在这两个线程里面调用select,发现优先级低的线程里面的select无法实现超时返回(就是一直阻塞)。
于是对代码进行仿真,一直跟踪到sys_timeout这个函数,这个函数一开始会timeout = memp_malloc(MEMP_SYS_TIMEOUT);
就是分配内存,我发现异常的select在这里是分配不到内存的,也就是timeout = NULL,问题就出现在这里,timeout=null,所以在sys_sem_wait()这个函数里就进了这里:sys_arch_sem_wait(sem, 0);
就一直阻塞了。
于是我改了代码:建立一个任务,任务里啥都不干,就分配内存

struct sys_timeo *ff, *ff1;


ff = memp_malloc(MEMP_SYS_TIMEOUT);

ff1 = memp_malloc(MEMP_SYS_TIMEOUT);

然后发现ff1果然是Null。
也就是说,内存不足?还是MEMP_SYS_TIMEOUT这东西不能给分两次?
我始终找不到原因,希望做过的大虾能给一点点指点,大家一起进步,一起交流。
QQ:465072659
mail:suhacen@163.com

相关帖子

suhacen|  楼主 | 2012-2-6 11:17 | 显示全部楼层
唉,真的没人回....
LWIP资料真的少得可怜,好像在中国做技术都是这样子,外面卖的模块大多这样,能跑就可以了,至于内核什么的一概不管,你抄我我抄你。。。

这个问题还是自己搞定了。
代码还是这样写:
ff = memp_malloc(MEMP_SYS_TIMEOUT);
ff1 = memp_malloc(MEMP_SYS_TIMEOUT);
仿真进入第一个memp_malloc函数,查看memp_tab []的值和传入的type的值,MEMP_SYS_TIMEOUT作为参数传进来的话,type是11,然后观察memp_tab[]里面对应的值,然后就发现程序执行到
memp_tab[type] = memp_alloc->next;
这句的时候,memp_tab[11]的值就变成了NULL,所以第二个memp_malloc(MEMP_SYS_TIMEOUT)就分配为NULL了。

于是就集中精力去弄明白memp_tab[type] = memp_alloc->next;这句话的意思了。
首先搞清楚memp_tab[]这个数组的意思,然后又要去搞清除memp这个结构的意思,最后参考到这篇**:http://wayne9746.blog.163.com/blog/static/437464472007889274393/
然后追踪到了memp_std.h里面的一个定义:
#if NO_SYS==0
LWIP_MEMPOOL(SYS_TIMEOUT,    MEMP_NUM_SYS_TIMEOUT,     sizeof(struct sys_timeo),      "SYS_TIMEOUT")
#endif /* NO_SYS==0 */

这个里面有一个用到了一个宏MEMP_NUM_SYS_TIMEOUT,然后找到这个宏定义的地方opt.h,然后就很清楚了,因为opt.h里面有关于这个宏的解释:
/**
* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts.
* (requires NO_SYS==0)
*/
#ifndef MEMP_NUM_SYS_TIMEOUT
#define MEMP_NUM_SYS_TIMEOUT            3
#endif
就是说系统允许同时存在的timeouts的个数,初始值是3,也就是我只能这样memp_malloc(MEMP_SYS_TIMEOUT);
一次,
我把这个宏改成4,
memp_malloc(MEMP_SYS_TIMEOUT);就能用两次了,依次类推。

至于初始值3的时候,有2个timeouts被哪里用掉了,我也没时间去弄了,等把项目搞完,再慢慢研究罢。

使用特权

评论回复
www.5comcn.com| | 2012-12-7 14:43 | 显示全部楼层
我始终找不到原因,希望做过的大虾能给一点点指点,大家一起进步,一起交流。

使用特权

评论回复
song19881218| | 2014-10-13 09:55 | 显示全部楼层
默认为三个ARP,IP.TCP分别占一个,DHCP需要两个,DNS需要1个,IGMP也要一个,根据这些增加

使用特权

评论回复
okgogogogo| | 2018-5-9 17:15 | 显示全部楼层
#define MEMP_NUM_SYS_TIMEOUT            (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + (PPP_SUPPORT*6*MEMP_NUM_PPP_PCB) + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0))

使用特权

评论回复
xuanchenzhu| | 2020-8-10 18:18 | 显示全部楼层
高手,感谢告知

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

0

粉丝