SYS/BIOS 版本:bios_6_33_06_50
NDK版本:ndk_2_21_01_38
尝试在recv()函数阻塞这段时间,执行另一个低优先级的任务,当有数据到来时又切换回来,但是发现一旦切换到低优先级的任务后,任务始终不切换回来了?
更详细的描述:
高优先级的任务TASK HIGH,里面只包含了一个tcp客户端程序,接收来自PC端网络调试助手TCP服务端发来的数据;低优先级的任务TASK LOW是一个死循环,里面没后调用任何会引起任务切换的API;
TI工程师,recv()的特性能不能支持达到这个目的,如果能的话,我应该怎么修改程序?
通过ROV调试发现,TASK HIGH在TASK LOW执行时,一直处于阻塞状态。而且是阻塞在了一个信号量上,这个信号量是用一个16进制表示的,看不懂究竟代表的是什么意思;这个信号量是 wait forever状态,TI 工程师,这是不是代表TASK HIGH一直等待新的数据到来呢?recv()默认是没有数据到来的话会永远阻塞,当我设置套接字的接收超时时可以实现TASK HIGH和TASK LOW的相互切换了,但是这种方式明显感觉不合理?如当网络状况稍稍改变时就可能造成严重的丢包。
Andy Yin1:
我的理解,在没有数据时会pend等待信号量,此时其他任务可以抢占CPU,接收到有效数据后会释放信号量,接收recv所在任务在被调度后可以获取到信号量继续执行。你现在的情况应该是没有收到数据,信号量没有被post,所以recv一直在等待信号量,进而被block,这应该是正常的。