Processus d'initialisation détaillé de lwIP
lwIP est un protocole IP léger, principalement utilisé dans les systèmes embarqués. Dans ce blog, nous analyserons lwip_init
en détail la fonction, qui est la fonction d'initialisation de la bibliothèque lwIP.
1. Signature de fonction
void lwip_init(void)
Il s'agit d'une fonction sans paramètres ni valeur de retour. Sa tâche principale est d'initialiser les différents modules de la bibliothèque lwIP.
2. Implémentation des fonctions
2.1 Vérification constante
#ifndef LWIP_SKIP_CONST_CHECK
int a = 0;
LWIP_UNUSED_ARG(a);
LWIP_ASSERT("LWIP_CONST_CAST not implemented correctly. Check your lwIP port.", LWIP_CONST_CAST(void *, &a) == &a);
#endif
Dans cette section, vérifiez d'abord si est défini LWIP_SKIP_CONST_CAST_CHECK
. S'il n'est pas défini, il crée une variable entière a
, puis utilise une macro LWIP_UNUSED_ARG
pour marquer la variable comme inutilisée. Ensuite, utilisez LWIP_ASSERT
une macro pour vérifier LWIP_CONST_CAST
la bonne implémentation. Cette macro est utilisée pour forcer la conversion de type afin de garantir que la bibliothèque lwIP peut fonctionner normalement sur une plate-forme matérielle spécifique.
2.2 Vérification de l'emballage structurel
#ifndef LWIP_SKIP_PACKING_CHECK
LWIP_ASSERT("Struct packing not implemented correctly. Check your lwIP port.", sizeof(struct packed_struct_test) == PACKED_STRUCT_TEST_EXPECTED_SIZE);
#endif
Ce code vérifie s'il est défini LWIP_SKIP_PACKING_CHECK
. Si elle n'est pas définie, il utilisera LWIP_ASSERT
des macros pour confirmer struct packed_struct_test
que la taille est égale à la taille attendue PACKED_STRUCT_TEST_EXPECTED_SIZE
. Il s'agit de vérifier que le compilateur a correctement aligné la structure, ce qui est très important pour l'envoi et la réception de paquets dans la communication réseau.
2.3 Initialisation des modules
stats_init();
#if !NO_SYS
sys_init();
#endif /* !NO_SYS */
mem_init();
memp_init();
pbuf_init();
netif_init();
#if LWIP_IPV4
ip_init();
#if LWIP_ARP
etharp_init();
#endif /* LWIP_ARP */
#endif /* LWIP_IPV4 */
#if LWIP_RAW
raw_init();
#endif /* LWIP_RAW */
#if LWIP_UDP
udp_init();
#endif /* LWIP_UDP */
#if LWIP_TCP
tcp_init();
#endif /* LWIP_TCP */
#if LWIP_IGMP
igmp_init();
#endif /* LWIP_IGMP */
#if LWIP_DNS
dns_init();
#endif /* LWIP_DNS */
#if PPP_SUPPORT
ppp_init();
#endif
#if LWIP_TIMERS
sys_timeouts_init();
#endif /* LWIP_TIMERS */
Ce code initialise divers modules de la bibliothèque lwIP, notamment le module de statistiques, le module système, le module de mémoire, le module de pool de mémoire, le module de tampon de protocole et le module d'interface réseau.
De plus, en fonction de la configuration au moment de la compilation, les modules suivants peuvent également être initialisés :
- Module IPv4
- Module ARP
- Module RAW
- Module UDP
- Module TCP
- Module IGMP
- module DNS
- Module PPP
- module de minuterie
2.4 Initialisation du socket
#if !NO_SYS
lwip_sock_init();
#endif
Ce code initialise l'interface socket de lwIP sur les systèmes non nus. Ceci est nécessaire pour fournir l’API de socket BSD standard.
3. Résumé
lwip_init
La fonction est la fonction d'initialisation de la bibliothèque lwIP, qui est chargée d'initialiser divers modules pour assurer le fonctionnement normal de la bibliothèque. Cette fonction doit être appelée avant d'utiliser la bibliothèque lwIP.