Aruduino IDEだとBLEとWi-Fiを同時に使うアプリを書くと メモリ不足でビルドできない。 BLEをスキャンしてWi-Fiでhttp postするsketchは"大きすぎる"エラーになる。

===error ||| Sketch too big; \
  see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing it. ||| []
終了ステータスは1。

参考資料らしきURLを表示するのはよいのだが内容は「16KBメモリで実行したい」 「がんばるよ」とあるだけで、1.7MBのELFに関する話とはけた違いで役に立たない。

このパーティション設定で動いたというコメントがある。

Arduino IDEのarduino-builderが使う ~/Arduino/hardware/espressif/esp32/tools/partitions/default.csvを書き換える。

# Name,   Type, SubType, Offset,   Size, Flags
nvs,      data, nvs,     0x9000,   0x5000,
otadata,  data, ota,     0xe000,   0x2000,
app0,     app,  ota_0,   0x10000,  0x340000,
eeprom,   data, 0x99,    0x350000, 0x1000,
spiffs,   data, spiffs,  0x351000, 0xAF000,

~/Arduino/hardware/espressif/esp32/boards.txtの次の行を修正。

esp32.upload.maximum_size=3407872
arduino-builderのオプションにある"--flash_size "4MB"は「何かの勘違い」程度の意味しかないかもしれない。

確かにこのパーティション設定だと、 BLEをスキャンしてWi-Fiでhttp postするsketchがとりあえず動いた。ただしWi-Fiはつながっていない。これでwpa_supplicantが動くのだからすごいのだけれど。

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x17 (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:1
load:0x3fff0018,len:4
load:0x3fff001c,len:956
load:0x40078000,len:0
load:0x40078000,len:13256
entry 0x40078a90
E (8) wifi: esp_wifi_stop 820 wifi is not init
ESP32 BLE Scanner
Start BLE scan for 30 seconds...
                                Advertised Device: Name: ThingyDfu, Address: xx:xx:xx:xx:xx:xx serviceUUID: xxxxx-...
                                                            Advertised Device: Name: , Address: xx:xx:xx:xx:xx:xx manufacturer data: xxxx...
                     Advertised Device: Name: changed-iii, Address: xx:xx:xx:xx:xx:xx manufacturer data: xxxx...
                                               Advertised Device: Name: MCA, Address: xx:xx:xx:xx:xx:xx manufacturer data: xxxx, serviceUUID: xxxxx-...
        Scan done!
started
E (42974) wifi: esp_wifi_scan_start 967 wifi not start
Waiting count: 1
                started
Waiting count: 2
                started
Waiting count: 3
                started
Waiting count: 4
                started
Waiting count: 5
                started
Waiting count: 6
                started
Enter deep sleep for 300 seconds...

上のパーティション設定の場合の問題として、実行しながらファームウェアを更新するためのOTAが使えなくなるらしい。partitionのapp1がなくなっている。

BLEとWi-Fiを使うバイナリを作ると大きくなるが、Aruino IDEではそういうテストはほとんどしていないらしい。 アプリケーションの最大メモリサイズの修正もあるのだが、「A機能とB機能は確かにありますが同時に使おうなんて甘いんですよ!」的なよくある落とし穴か。Arduino IDEだとArduino coreという必須のソフトウェアがあり、アプリケーションのサイズを圧迫している。ESP-IDFで直接バイナリを作るとどうなるかは、確認していない。