关于LWIP非阻塞函数select的用法的一些问题
近来在做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 唉,真的没人回....
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 = memp_alloc->next;
这句的时候,memp_tab的值就变成了NULL,所以第二个memp_malloc(MEMP_SYS_TIMEOUT)就分配为NULL了。
于是就集中精力去弄明白memp_tab = 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被哪里用掉了,我也没时间去弄了,等把项目搞完,再慢慢研究罢。 我始终找不到原因,希望做过的大虾能给一点点指点,大家一起进步,一起交流。
默认为三个ARP,IP.TCP分别占一个,DHCP需要两个,DNS需要1个,IGMP也要一个,根据这些增加 #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))
高手,感谢告知
页:
[1]