ESP8266 > ファイルスコープstatic変数のメモリ制限に遭遇 > .bss / Flash Sizeと関連


動作確認
ESP-WROOM-02

関連 esp8266_160220_BYOP @ github

以下の構造体を作成

// Message structure
typedef struct tag_message_t {
  String senderSerial; // serial number of the sender
  String senderName; // name of the sender
  String receiverName; // name of the receiver
  String message;
  bool isSecret; // sercret message or normal message
} message_t;

それをファイルスコープstatic変数に定義しようとした。

esp8266_160221_msgStorageLib.ino
...
static const int kMaxnum_MessageCount = 1000; 

static message_t s_messageList[kMaxnum_MessageCount];
...

以下のエラーが出る。
kMaxnum_MessageCount を500にすると問題ない。
ファイルスコープstaticのメモリ制限があるのだろうか。
Flashの4Mのうち、どれくらいを使えるのだろうか。

Arduino:1.6.6 (Windows 8.1), マイコンボード:"Generic ESP8266 Module, Serial, 80 MHz, 40MHz, DIO, 115200, 512K (64K SPIFFS), ck, Disabled, None"

c:/users/xxx/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: address 0x3fffcc18 of C:\Users\xxx\AppData\Local\Temp\builda1ccef97ce44419182068709a04c30dc.tmp/esp8266_160220_BYOP.ino.elf section `.bss' is not within region `dram0_0_seg'

c:/users/xxx/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: address 0x3fffcc18 of C:\Users\xxx\AppData\Local\Temp\builda1ccef97ce44419182068709a04c30dc.tmp/esp8266_160220_BYOP.ino.elf section `.bss' is not within region `dram0_0_seg'

collect2.exe: error: ld returned 1 exit status

exit status 1
コンパイル時にエラーが発生しました。

  This report would have more information with
  "コンパイル中の詳細な出力を表示する"
  enabled in File > Preferences.

section .bss' is not within regiondram0_0_seg'

.bssセクション関連っぽい。

https://en.wikipedia.org/wiki/.bss
https://en.wikipedia.org/wiki/Code_segment

Arduino IDE で Flash Size を増やせば回避できる。でも、(将来の自分も含めた)ソース利用者に「設定をXXしてください」といちいち説明しないといけなくなるので、512Kで動くようにしておく(メッセージ上限数を500未満にしておく)。

そのうち 512K ではどうしてもできないことが出てくるかもしれない。その時は仕方ない。



kMaxnum_MessageCount 500 だと watchdog が発動してしまうという別の問題が出てきた。