eep*_*pty 5 c embedded network-programming rtos lwip
当调用LwIP netconn_accept()或netconn_recv()函数时,如果我们使用RTOS,它将阻塞线程并等待连接直到超时或永远,取决于设置LWIP_SO_RCVTIME0.超时持续时间等于SYS_ARCH_TIMEOUT.
在SYS_ARCH_TIMEOUT被定义为0xffffffff的核心包括了LwIP堆栈的一部分,所以我想是不是有望得到改变.
实际上,我希望它检查是否建立了连接,如果没有,则继续该线程.但是,如果我调用netconn_accept()它,它将只是阻塞线程并在那里永远等待(或很长时间)...我不想jsut更改定义值SYS_ARCH_TIMEOUT因为我需要在不同的情况下不同的超时...
这样做的好方法是什么?谢谢.
轮询TCP连接(或接受)通常是一种不好的做法.考虑生成一个专门用于阻塞netconn_accept()调用的新线程.
我理解使用RTOS的局限性,但只产生一个具有最小堆栈空间的辅助线程应该不是主要问题.
我认为实施经典的生产者 - 消费者问题的解决方案并不那么难.
如果您正在谈论FreeRTOS,它拥有所需的所有工具 - 信号量和线程.
根本不要使用阻止API.lwIP堆栈提供了一个本机的,非阻塞的,事件驱动的API,它比阻塞更有效,并且不需要阻塞RTOS.YouTube视频显示(http://youtu.be/MBk5wJ_8jEc)显示了如何在基于QP状态机框架的实时系统中使用此API.