c network-programming embedded rtos lwip

LWIP+RTOS: ¿cómo evitar que netconn bloquee el hilo para siempre?



network-programming embedded (4)

El sondeo de la conexión TCP (o aceptación) suele ser una mala práctica. Considere generar un nuevo hilo dedicado exclusivamente a la llamada netconn_accept () de bloqueo.

Entiendo las limitaciones del uso de RTOS, pero generar solo un hilo de ayuda con un espacio de pila mínimo no debería ser un problema importante.

Creo que implementar una solución al clásico problema Productor-Consumidor no es tan difícil.

Si habla de FreeRTOS, tiene todas las herramientas necesarias: semáforos e hilos.

Cuando se llama a la función netconn_accept() o netconn_recv() , si estamos utilizando un RTOS, bloqueará el hilo y esperará una conexión hasta el tiempo de espera o para siempre, dependiendo de la configuración de LWIP_SO_RCVTIME0 . La duración del tiempo de espera es igual a SYS_ARCH_TIMEOUT .

SYS_ARCH_TIMEOUT se define como 0xffffffff en el núcleo incluye parte de la pila LwIP, por lo que creo que no se espera que se modifique.

En realidad, quiero que compruebe si se establece una conexión, si no, continúa el hilo. Sin embargo, si llamo a netconn_accept() , simplemente bloqueará el hilo y esperará allí para siempre (o durante mucho tiempo) ... No quiero simplemente cambiar el valor de SYS_ARCH_TIMEOUT de SYS_ARCH_TIMEOUT porque necesito un tiempo de espera diferente en una situación diferente ...

¿Cuál es la mejor manera de hacer eso? Gracias.


Haz un nuevo hilo tratando de hacer esa conexión. ¡Siempre y cuando no esté conectado, pon el hilo en reposo por algún tiempo para que el RTOS pueda hacer un cambio de contexto! (cambiar a otra tarea)


No use la API de bloqueo en absoluto. La pila lwIP proporciona una API nativa, sin bloqueos, impulsada por eventos, que es más eficiente que el bloqueo y no requiere un RTOS de bloqueo. Un video de YouTube muestra (en http://youtu.be/MBk5wJ_8jEc ) muestra cómo esta API se ha utilizado en un sistema en tiempo real basado en el marco de máquina de estado de QP.


Puede usar la función netconn_set_recvtimeout para establecer el tiempo de espera en el socket de escucha en algo pequeño, por ejemplo, 1 ms.

P.ej. (Error al manejar nuevo, vincular, escuchar por simplicidad)

struct netconn *conn = netconn_new(NETCONN_TCP); if (conn) { if (netconn_bind(conn, IP_ADDR_ANY, 1025/*PORT_NUMBER*/) != ERR_OK) { return; } if (netconn_listen(conn) != ERR_OK) { return; } netconn_set_recvtimeout(conn, 1); }

Luego, las llamadas para aceptar retrasarán el máximo de 1 ms:

struct netconn *newConn; err_t result = netconn_accept(conn, &newConn); if (result == ERR_OK) { // Handle the connected netconn here } else if (result == ERR_TIMEOUT) { // No pending connections } else { // A problem with the listen socket accepting the connection }