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 ライブラリを使用する前に呼び出す必要があります。

おすすめ

転載: blog.csdn.net/qq_24951479/article/details/131683905