mruby-esp32 / mruby-esp32-wifi

Wi-Fi library for mruby-esp32.
7 stars 5 forks source link

Make ESP32::WiFi#connect and ESP32::WiFi#disconnect synchronous. #5

Closed yuuu closed 1 year ago

yuuu commented 1 year ago

ESP32::WiFi#connect and ESP32::WiFi#disconnect are currently asynchronous methods. Therefore, the post-completion processing code must be written in ESP32::WiFi#on_connected and ESP32::WiFi#on_disconnected.

ESP32::WiFi#on_connected and ESP32::WiFi#on_disconnected are called by system tasks. Therefore, the stack is not very large and can easily overflow.

For example, writing a program like the following will cause a stack overflow.

wifi = ESP32::WiFi.new

wifi.on_connected do
  puts 'test1'
  test_object.yield_from_c do
    puts 'test2'
  end
end
Connecting to wifi
I (1624) wifi:wifi driver task: 3ffd8384, prio:23, stack:6656, core=0
I (1624) system_api: Base MAC address is not set
I (1624) system_api: read default base MAC address from EFUSE
I (1634) wifi:wifi firmware version: ca38a19
I (1634) wifi:wifi certification version: v7.0
I (1634) wifi:config NVS flash: enabled
I (1634) wifi:config nano formating: disabled
I (1644) wifi:Init data frame dynamic rx buffer num: 32
I (1644) wifi:Init management frame dynamic rx buffer num: 32
I (1654) wifi:Init management short buffer num: 32
I (1654) wifi:Init dynamic tx buffer num: 32
I (1664) wifi:Init static rx buffer size: 1600
I (1664) wifi:Init static rx buffer num: 10
I (1674) wifi:Init dynamic rx buffer num: 32
I (1674) wifi_init: rx ba win: 6
I (1674) wifi_init: tcpip mbox: 32
I (1684) wifi_init: udp mbox: 6
I (1684) wifi_init: tcp mbox: 6
I (1694) wifi_init: tcp tx win: 5744
I (1694) wifi_init: tcp rx win: 5744
I (1694) wifi_init: tcp mss: 1440
I (1704) wifi_init: WiFi IRAM OP enabled
I (1704) wifi_init: WiFi RX IRAM OP enabled
I (1714) phy_init: phy_version 4670,719f9f6,Feb 18 2021,17:07:07
I (1814) wifi:mode : sta (xx:xx:xx:xx:xx:xx)
I (1814) wifi:enable tsf
I (2194) wifi:new:<4,0>, old:<1,0>, ap:<255,255>, sta:<4,0>, prof:1
I (2874) wifi:state: init -> auth (b0)
I (2874) wifi:state: auth -> assoc (0)
I (2884) wifi:state: assoc -> run (10)
I (2914) wifi:connected with ssid, aid = 20, channel 4, BW20, bssid = xx:xx:xx:xx:xx:xx
I (2914) wifi:security: WPA2-PSK, phy: bgn, rssi: -57
I (2914) wifi:pm start, type: 1

I (2934) wifi:<ba-add>idx:0 (ifx:0, xx:xx:xx:xx:xx:xx), tid:6, ssn:1, winSize:64
I (3224) wifi:AP's beacon interval = 102400 us, DTIM period = 1
I (3924) esp_netif_handlers: sta ip: 192.168.xxx.xxx, mask: 255.255.255.0, gw: 192.168.xxx.xxx
test1
test2
***ERROR*** A stack overflow in task sys_evt has been detected.

Backtrace: 0x40081eda:0x3ffc8b60 0x400898d5:0x3ffc8b80 0x4008cece:0x3ffc8ba0 0x4008b7c3:0x3ffc8c20 0x400899d0:0x3ffc8c40 0x40089982:0xba2c5aba |<-CORRUPTED
0x40081eda: panic_abort at /Users/yuhei/ghq/github.com/espressif/esp-idf/components/esp_system/panic.c:423

0x400898d5: esp_system_abort at /Users/yuhei/ghq/github.com/espressif/esp-idf/components/esp_system/esp_system.c:144

0x4008cece: vApplicationStackOverflowHook at /Users/yuhei/ghq/github.com/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:391

0x4008b7c3: vTaskSwitchContext at /Users/yuhei/ghq/github.com/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/tasks.c:3647

0x400899d0: _frxt_dispatch at /Users/yuhei/ghq/github.com/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/portasm.S:418

0x40089982: _frxt_int_exit at /Users/yuhei/ghq/github.com/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/portasm.S:213

ELF file SHA256: a745f17555419909

Rebooting...
ets Jul 29 2019 12:21:46

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:7008
load:0x40078000,len:15408
load:0x40080400,len:3840
0x40080400: _init at ??:?

To solve this problem, I made ESP32::WiFi#connect and ESP32::WiFi#disconnect synchronous methods. I can now write programs intuitively without using ESP32::WiFi#on_connected and ESP32::WiFi#on_disconnected.