7
votes

LWIP + RTOS - Comment éviter NetConn bloquer le fil pour toujours?

Lorsque le LWIP NETCONN_ACCEPT () ou NETCONN_RECV () La fonction est appelée, si nous utilisons un RTO, il bloquera le thread. et attendez une connexion jusqu'à l'heure ou pour toujours, dépend du paramètre de lwip_so_rcvtime0 . La durée du délai d'attente est égale au sys_arch_timeout .

Le sys_arch_timeout est défini comme 0xffffffff dans le noyau incluent une partie de la pile LWIP, donc je pense que cela ne devrait pas être changé.

En réalité, je veux que cela vérifie si une connexion est faite, sinon elle continue le fil. Cependant, si j'appelle netconn_accept () , il bloquera simplement le thread et attendra là-bas pour toujours (ou très longtemps) ... je ne veux pas que Jsut modifie la valeur définie de SYS_ARCH_TIMEOUT parce que j'ai besoin d'un délai différent dans différentes situations ...

Quel est le bon moyen de faire ça? Merci.


4 commentaires

Je ne connais pas les spécificités de LwIP, mais il a-t-il un concept de prises non bloquantes ou d'une fonction SELECT -ILE?


La mise en œuvre des sockets BSD en LWIP utilise vraiment un espace supplémentaire que OP pourrait ne pas être capable de se permettre. 64kb de RAM n'est pas un grand espace pour tout.


@ViktorLatTypov Comment savez-vous que je n'ai que 64kb RAM ?? Je vous connais...?


Je doute que, j'en ai juste assez de Freertos moi-même :)))


4 Réponses :


8
votes

Le sondage pour la connexion TCP (ou l'acceptation) est généralement une mauvaise pratique. Envisagez de reproduire un nouveau fil dédié exclusivement à l'appel NetConn_Accept () Blocking.

Je comprends les limites d'utiliser des rtoses, mais le frai d'un seul fil d'assistance avec un espace de pile minimal ne devrait pas être un problème majeur.

Je crois que la mise en œuvre d'une solution à la classique Producteur-consommateur Problème n'est pas que dur.

Si vous parlez de Freertos, il a tous les outils nécessaires - Semaphores et threads.


0 commentaires

3
votes

Faire un nouveau fil essayant de faire cette connexion. Tant qu'il n'est pas connecté, placez le fil en veille pendant quelque temps afin que les RTO puissent faire un commutateur de contexte! (Passez à une autre tâche)


0 commentaires

5
votes

N'utilisez pas du tout l'API de blocage. La pile LWIP fournit une API indigène, non bloquante, entraînée par des événements, qui est plus efficace que le blocage et ne nécessite pas de RTO de blocage. Affiche une vidéo YouTube (à http://youtu.be/mbk5wj_8jec ) montre comment cette API a été utilisée dans un Système en temps réel basé sur la framework de la machine d'état QP.


0 commentaires

2
votes

Vous pouvez utiliser la fonction netconn_set_recvtimeout pour définir le délai d'attente sur le socket d'écoute sur quelque chose de petit, par exemple 1ms.

par exemple. (Erreur de manipulation laissée sur Nouveau, lier, écouter de simplicité) xxx

puis appelle à accepter sera retarder le maximum de 1 ms: xxx < / p>


0 commentaires