Proceso de inicialización de lwIP detallado
lwIP es un protocolo IP ligero, utilizado principalmente en sistemas integrados. En este blog, analizaremos lwip_init
la función en detalle, que es la función de inicialización de la biblioteca lwIP.
1. Firma de función
void lwip_init(void)
Esta es una función sin parámetros ni valor de retorno. Su tarea principal es inicializar los distintos módulos de la biblioteca lwIP.
2. Implementación de funciones
2.1 Control 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
En esta sección, primero verifique si está definido LWIP_SKIP_CONST_CAST_CHECK
. Si no está definido, crea una variable entera a
y luego usa una macro LWIP_UNUSED_ARG
para marcar la variable como no utilizada. A continuación, utilice LWIP_ASSERT
una macro para comprobar LWIP_CONST_CAST
la implementación correcta. Esta macro se utiliza para forzar la conversión de tipos y garantizar que la biblioteca lwIP pueda funcionar normalmente en una plataforma de hardware específica.
2.2 Verificación del embalaje estructural
#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
Este código comprueba si está definido LWIP_SKIP_PACKING_CHECK
. Si no está definido, utilizará LWIP_ASSERT
macros para confirmar struct packed_struct_test
que el tamaño es igual al tamaño esperado PACKED_STRUCT_TEST_EXPECTED_SIZE
. Esto es para verificar que el compilador haya alineado la estructura correctamente, lo cual es muy importante para enviar y recibir paquetes en la comunicación de red.
2.3 Inicialización del módulo
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 */
Este código inicializa varios módulos de la biblioteca lwIP, incluido el módulo de estadísticas, el módulo del sistema, el módulo de memoria, el módulo de grupo de memoria, el módulo de búfer de protocolo y el módulo de interfaz de red.
Además, según la configuración en tiempo de compilación, también se pueden inicializar los siguientes módulos:
- módulo IPv4
- módulo ARP
- módulo crudo
- módulo UDP
- módulo TCP
- módulo IGMP
- módulo DNS
- módulo APP
- módulo temporizador
2.4 Inicialización del socket
#if !NO_SYS
lwip_sock_init();
#endif
Este código inicializa la interfaz de socket de lwIP en sistemas no básicos. Esto es necesario para proporcionar la API de socket BSD estándar.
3. Resumen
lwip_init
La función es la función de inicialización de la biblioteca lwIP, que es responsable de inicializar varios módulos para garantizar el funcionamiento normal de la biblioteca. Esta función debe llamarse antes de usar la biblioteca lwIP.