ESP32でWiFiとBluetoothを同時に使うとCore panicするのはRAM不足が原因?

投稿者: | 2022年8月30日

WiFi と Bluetooth はどちらも巨大なライブラリです

以前から、ESP32 devkit C で WiFi と Bluetooth / BLE を同時に使うと、スケッチを保存するフラッシュ領域が足りないという事例がありました。実際に、以下のように WiFi と BluetoothSerial を同時に begin するコードを書きこむと、すでにフラッシュの 99 % が使用済みになってしまいました。

#include <WiFi.h>
#include <BluetoothSerial.h>

const char* BT_NAME = "ESP32-BTSerial";  // Bluetoothデバイス名
const char* WIFI_SSID = "your_ssid";
const char* WIFI_PASS = "your_password";

BluetoothSerial SerialBT;

void setup() { 
  Serial.begin(115200);
  
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
  Serial.println(WiFi.localIP());

  SerialBT.begin(BT_NAME);
}

void loop() {
  Serial.println("loop");
  delay(1000);
}
上のコードを書きこんだときの、Arduino IDE で見たメモリ使用状況

さて、この問題の解決策は、ツール > Partition Scheme の設定変更です。「Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)」を、「No OTA (2MB APP / 2MB SPIFFS)」などの APP に割り当てられたフラッシュ領域がより多いものに変えるとよいです。

RAMも足りなくなることがあるらしい

ところが、少し規模の大きいプロジェクトで、下記のようなエラーメッセージが出ました。※Core Debug Level を Debug に設定しています

WiFi を先に begin してから SerialBT を begin した場合

WiFi 接続を完了した直後、Core 0 panic’ed (StoreProhibited) が発生しています。

[D][WiFiGeneric.cpp:374] _eventCallback(): Event: 0 - WIFI_READY
[D][WiFiGeneric.cpp:374] _eventCallback(): Event: 2 - STA_START
Connecting to WiFi..
Connecting to WiFi..
[D][WiFiGeneric.cpp:374] _eventCallback(): Event: 7 - STA_GOT_IP
[D][WiFiGeneric.cpp:419] _eventCallback(): STA IP: 192.168.137.192, MASK: 255.255.255.0, GW: 192.168.137.1
[D][WiFiGeneric.cpp:374] _eventCallback(): Event: 7 - STA_GOT_IP
[D][WiFiGeneric.cpp:419] _eventCallback(): STA IP: 192.168.137.192, MASK: 255.255.255.0, GW: 192.168.137.1
Connecting to WiFi..
192.168.137.192
Guru Meditation Error: Core  0 panic'ed (StoreProhibited). Exception was unhandled.
Core 0 register dump:
PC      : 0x40092b47  PS      : 0x00060230  A0      : 0x80152c64  A1      : 0x3fff6fd0  
A2      : 0x00000000  A3      : 0x00000000  A4      : 0x00000130  A5      : 0x00000000  
A6      : 0x3f40c558  A7      : 0x00000013  A8      : 0x80082674  A9      : 0x3fff6f70  
A10     : 0x00000000  A11     : 0x00001800  A12     : 0x00000000  A13     : 0x00000003  
A14     : 0x3ffc99c0  A15     : 0x3ffc24d0  SAR     : 0x00000010  EXCCAUSE: 0x0000001d  
EXCVADDR: 0x00000000  LBEG    : 0x400929b0  LEND    : 0x400929cc  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000

Backtrace: 0x40092b47:0x3fff6fd0 0x40152c61:0x3fff6fe0 0x40127551:0x3fff7000 0x4012758b:0x3fff7020 0x40095996:0x3fff7050

SerialBT を 先に begin してから WiFi を begin した場合

Core panic こそ起きないものの、WiFi.begin が失敗し、WiFiに接続できません。

[I][BluetoothSerial.cpp:572] _init_bt(): device name set
[I][BluetoothSerial.cpp:243] esp_spp_cb(): ESP_SPP_INIT_EVT
E (5783) wifi:Expected to init 16 rx buffer, actual is 7
[I][BluetoothSerial.cpp:246] esp_spp_cb(): ESP_SPP_INIT_EVT: slave: start
[E][WiFiGeneric.cpp:137] wifiLowLevelInit(): esp_wifi_init 257
E (5791) wifi:create wif[I][Bi task: failed to crluetoothSeate task
erial.cpp:347] esp_spp_cb(): ESP_SPP_START_EVT
[E][WiFiGeneric.cpp:137] wifiLowLevelInit(): esp_wifi_init 257
[E][WiFiSTA.cpp:120] begin(): STA enable failed!
( 以下、ずっとWiFiにつながらない )

いずれにせよ、ログを見てもぱっと見では理由が分かりません。色々調べたところ、おそらく RAM の不足に起因すると思われます。WiFi も Bluetooth も多くの RAM を消費するため、2つ同時に使うと動的に確保する分が足りなくなってしまうのかな……。あまり詳しくはないので推測ですが。

解決策は?

一応、Arduino がインストールされているフォルダ(Windows であれば C:/Users/user/AppData/Local/Arduino)に保存されている、packages/esp32/hardware/esp32/x.x.x/tools/sdk/include/config/sdkconfig.h(x.x.x はボードマネージャのバージョン名)の

  • CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM 16
  • CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM 32
  • CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM 32

を、より小さい数値にすることで解決したという事例がありました。ただ、私の手元では 16 を 6 にしても同じ箇所で abort() が起きて解決しませんでした。大人しく WiFi の使用をやめて、Bluetooth だけにしようと思います。

参考

コメントを残す

メールアドレスが公開されることはありません。