ESP8266_RTOS_SDK V3を使ってみる

APへの接続の監視


examples/wifi/getting_started/stationをビルドすると、APへの接続を行いますが、ソースを見てもどのよ うなメカニズ ムで
APへの接続を監視しているのかよく分からなかったので、あちこちにログを入れて確認してみました。
以下がログの内容ですが[ ]で囲んだ部分がコメントです。
I (520) simple wifi: ESP_WIFI_MODE_STA
[app_main()からwifi_init_sta()をCallしま す]
[wifi_init_sta()の中で、さらに esp_event_loop_init()をcallします]
[esp_event_loop_init()は components/esp8266/source/event_loop.c に有ります]

I (520) uiT: esp_event_loop_init wifi_queue_create
[esp_event_loop_init()の中でシステムタスクとの通信 用のQueueを作ります]

I (520) uiT: esp_event_loop_init wifi_task_create
[esp_event_loop_init()の中でイベント監視用タスク (esp_event_loop_task)を作ります]

mode : sta(84:0d:8e:8c:f4:00)
add if0
I (550) uiT: esp_event_loop_send call 0x2
[esp_event_loop_init()の中でQueueにイベン ト=0x2を積みます]
[esp_event_loop_init() から抜けます]

I (550) simple wifi: wifi_init_sta finished.
I (550) simple wifi: connect to ap SSID:aterm-e625c0-g password:XXXXXXXXXX
I (560) simple wifi: ESP_WIFI_MODE_STA END
[wifi_init_sta()から抜けます]

I (570) esp_event_loop_: start
[esp_event_loop_taskがWakeUpします]

I (580) esp_event_loop_: wifi_queue_recv evt.id=0x2
[esp_event_loop_taskがイベント=0x2をQueueか ら取り出し、event_handler() をcallします]

I (590) esp_event_loop_: event_id=0x2
[event_handler()が呼ばれます]

I (590) esp_event_loop_: SYSTEM_EVENT_STA_START
[esp_event_loop_taskがWakeUpしたというイベント です]

scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 1
pm open phy_2,type:2 0 0
cnt

connected with aterm-e625c0-g, channel 11

I (750) ppT: esp_event_loop_send call 0x4
[ppTタスクがQueueにイベント=0x4を積みます]

I (760) esp_event_loop_: wifi_queue_recv evt.id=0x4
[esp_event_loop_taskがイベント=0x4をQueueか ら取り出し、event_handler() をcallします]

I (760) esp_event_loop_: event_id=0x4
[event_handler()が呼ばれます]

I (760) esp_event_loop_: default
[このイベントは無視されます]

I (3760) Tmr Svc: esp_event_loop_send call 0x7
[Tmr SvcタスクがQueueにイベント=0x7を積みます]

I (3760) esp_event_loop_: wifi_queue_recv evt.id=0x7
[esp_event_loop_taskがイベント=0x7をQueueか ら取り出し、event_handler() をcallします]

I (3760) event: sta ip: 192.168.10.186, mask: 255.255.255.0, gw: 192.168.10.1
[event_handler()が呼ばれます]

I (3770) esp_event_loop_: event_id=0x7
I (3780) esp_event_loop_: got ip:192.168.10.186

event_handler()は station_example_main.c に定義されていますが、イベント監視用タスク(esp_event_loop_task)から呼び出されていることが分かりました。
結構回りくどい実装ですが、マルチタスクを前提とした実装になっています。
システムタスクが裏でハードウェアの状態を監視し、結果をイベント監視用タスク(esp_event_loop_task)にQueueを使って 通知しています。
esp_event_loop_taskは、イベントを受け取ると event_handler() を呼び出して、イベントが有ったことをアプリ側に通知します。



こ ちらにesp32のWiFi接続のサンプルが公開されています。
ESP8266のサンプルと見比べてみると、esp32もESP8266もevent_handler()でAPへの接続を監視しています。
このSDKはマルチタスクを前提としているので、このようなQueueを使ったタスク間通信と、
イベントハンドラーによる割り込み処理を多用しています。

続く....