バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-network-backnumber/
はじめに
lwIPの初期化について。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
lwIPの初期化
じゃー今回からlwIPの利用方法についての説明にはいるよー。
おー。
まず最初にやることは、
lwIPの初期化。
- lwIP自身の初期化 ← これ
- ネットワークインターフェースの追加
- マルチキャストグループの参加
- ネットワークインターフェースの初期化
- リンクアップ
- UDP Socket生成
- IPアドレス、ポートへのBind
- UDP受信待ち
- EthnertFrameの疑似受信
とりあえず初期化関数呼べばOK的な感じだとありがたい。
まぁlwip_initって関数呼ぶだけだねー。
まじか!!
引数もないの?
引数も無い。
じゃ、この話はこれまでってことで。
そういうわけにも行かないんだよねぇ。
(相変わらず回りくどいな・・・。)
lwIPの初期化の具体的な内容
とりあえず、lwip_init関数の中身を見てみよう。
/**
* @ingroup lwip_nosys
* Initialize all modules.
* Use this in NO_SYS mode. Use tcpip_init() otherwise.
*/
void
lwip_init(void)
{
#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
#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
/* Modules initialization */
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 */
}
ん?
なんかいろいろ#if~#endifが多いね?
そうそう。
そこがlwip_initのポイントになる。
これって、どっかでdefine定義されてるところがあるってことだよね?
うん。
これらは以下で定義されている。
include/lwip/opt.h
ということは、
そこの定義によって、lwip_initの初期化の内容が変わるってことだね?
うん。
今回はデフォルトのままだけど、
組み込み用途だと、可能な限りROM/RAM使用量を減らしたいって動機があるんで、
define定義を弄って、不要なものは無効にする。
って運用を想定してるっぽい。
なるほどー。
たしかに、DNSとかPPPとか不要だったら無効にした方がよさそうだねー。
まとめ
まとめだよ。
- lwIPの初期化関数はlwip_init。
- lwip_initの内部は#if~#endifで必要最低限の初期化が可能。
- include/lwip/opt.hで使用する機能の有効/無効の切り替えができる。
バックナンバーはこちら。
コメント