近来在做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 |