lwIP 初期化プロセスの詳細
lwIP は軽量の IP プロトコルで、主に組み込みシステムで使用されます。lwip_init
このブログでは、 lwIP ライブラリの初期化関数である関数を詳細に分析します。
1. 関数のシグネチャ
void lwip_init(void)
これはパラメータも戻り値も持たない関数です。その主なタスクは、lwIP ライブラリのさまざまなモジュールを初期化することです。
2. 機能実装
2.1 常時チェック
#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
このセクションでは、まず が定義されているかどうかを確認しますLWIP_SKIP_CONST_CAST_CHECK
。定義されていない場合は、整変数を作成しa
、マクロを使用してLWIP_UNUSED_ARG
その変数を未使用としてマークします。次に、LWIP_ASSERT
マクロを使用して、LWIP_CONST_CAST
実装が正しいかどうかを確認します。このマクロは、lwIP ライブラリが特定のハードウェア プラットフォームで正常に動作できるようにするために型変換を強制するために使用されます。
2.2 構造的なパッキングチェック
#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
このコードは、それが定義されているかどうかを確認しますLWIP_SKIP_PACKING_CHECK
。定義されていない場合は、LWIP_ASSERT
マクロを使用して、struct packed_struct_test
サイズが予想されるサイズと等しいかどうかを確認しますPACKED_STRUCT_TEST_EXPECTED_SIZE
。これは、コンパイラが構造を正しく調整していることを確認するためのもので、これはネットワーク通信でパケットを送受信する場合に非常に重要です。
2.3 モジュールの初期化
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 */
このコードは、統計モジュール、システム モジュール、メモリ モジュール、メモリ プール モジュール、プロトコル バッファ モジュール、ネットワーク インターフェイス モジュールなど、lwIP ライブラリのさまざまなモジュールを初期化します。
さらに、コンパイル時の構成に応じて、次のモジュールも初期化される場合があります。
- IPv4モジュール
- ARPモジュール
- RAWモジュール
- UDPモジュール
- TCPモジュール
- IGMPモジュール
- DNSモジュール
- PPPモジュール
- タイマーモジュール
2.4 ソケットの初期化
#if !NO_SYS
lwip_sock_init();
#endif
このコードは、非ベアメタル システム上の lwIP のソケット インターフェイスを初期化します。これは、標準の BSD ソケット API を提供するために必要です。
3. まとめ
lwip_init
この関数は lwIP ライブラリの初期化関数であり、ライブラリの通常の動作を保証するためにさまざまなモジュールを初期化する役割を果たします。この関数は、lwIP ライブラリを使用する前に呼び出す必要があります。