PlatformIOでESP8266を開発する

SPIFFS領域


NodeMCUもWeMosもESP12が実装されているので、4MのFLASHを持っています。
Arduino-IDEではSPIFFSのサイズをメニューのToolsオプションで選択することができますが、
platformioでSPIFFSのサイズを指定するためには、以下の様にiniファイルのboard_build.ldscriptに Flash Sizeを示す文字列を指定します。

指定できる文字列はこ ちらに公開されています。
文字列の意味は以下のようなルールです。
eagle.flash.4m.ld 4MFlashのモデル、SPIFFSを確保しない
eagle.flash.4m1m.ld 4MFlashのモデル、SPIFFSを1M確保する
eagle.flash.4m2m.ld 4MFlashのモデル、SPIFFSを2M確保する
eagle.flash.4m3m.ld 4MFlashのモデル、SPIFFSを3M確保する

古いバージョンのPatformIOでは、以下の様にbuild_flagsでSPIFFSのサイズを指定しましたが、最新の PlatformIOではワーニングになります。
build_flags = '-D PIOENV="$PIOENV"' -Wl,-Teagle.flash.4m3m.ld
Warning! '-Wl,-T' option for specifying linker scripts is deprecated. Please use 'board_build.ldscript' option in your 'platformio.ini' file.

[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
build_flags = '-D PIOENV="$PIOENV"'

[env:nodemcuv2-4m]
platform = espressif8266
board = nodemcuv2
framework = arduino
;build_flags = '-D PIOENV="$PIOENV"' -Wl,-Teagle.flash.4m.ld
build_flags = '-D PIOENV="$PIOENV"'
board_build.ldscript = eagle.flash.4m.ld

[env:nodemcuv2-4m1m]
platform = espressif8266
board = nodemcuv2
framework = arduino
;build_flags = '-D PIOENV="$PIOENV"' -Wl,-Teagle.flash.4m1m.ld
build_flags = '-D PIOENV="$PIOENV"'
board_build.ldscript = eagle.flash.4m1m.ld

[env:nodemcuv2-4m2m]
platform = espressif8266
board = nodemcuv2
framework = arduino
;build_flags = '-D PIOENV="$PIOENV"' -Wl,-Teagle.flash.4m2m.ld
build_flags = '-D PIOENV="$PIOENV"'
board_build.ldscript = eagle.flash.4m2m.ld

[env:nodemcuv2-4m3m]
platform = espressif8266
board = nodemcuv2
framework = arduino
;build_flags = '-D PIOENV="$PIOENV"' -Wl,-Teagle.flash.4m3m.ld
build_flags = '-D PIOENV="$PIOENV"'
board_build.ldscript = eagle.flash.4m3m.ld

以下のコードで生成されるSPIFFSサイズを調べてみました。
#include "Arduino.h"
#include "FS.h" // SPIFFS is declared

void setup() {
  delay(2000);
  Serial.begin(115200);
  Serial.print("PIOENV=");
  Serial.println(PIOENV);
  if (SPIFFS.begin() ) {
    // Next lines have to be done ONLY ONCE!!!!!When SPIFFS is formatted ONCE you can comment these lines out!!
    Serial.println("Please wait 30 secs for SPIFFS to be formatted");
    SPIFFS.format();
    Serial.println("SPIFFS formatted");
    FSInfo fs_info;
    SPIFFS.info(fs_info);
    Serial.println("totalBytes:" + String(fs_info.totalBytes));
    Serial.println("usedBytes:" + String(fs_info.usedBytes));
    Serial.println("blockSize:" + String(fs_info.blockSize));
    Serial.println("pageSize:" + String(fs_info.pageSize));
    Serial.println("maxOpenFiles:" + String(fs_info.maxOpenFiles));
    Serial.println("maxPathLength:" + String(fs_info.maxPathLength));
  } else {
    Serial.println("SPIFFS failed!");
  }
}

void loop() {

}

SPIFFSサイズを明示しないと1Mの領域が確保されます。
$ pio run -t upload -e nodemcuv2 && pio device monitor -b 115200

PIOENV=nodemcuv2
Please wait 30 secs for SPIFFS to be formatted
SPIFFS formatted
totalBytes:957314
usedBytes:0
blockSize:8192
pageSize:256
maxOpenFiles:5
maxPathLength:32

これはエラーになりました。
$ pio run -t upload -e nodemcuv2-4m && pio device monitor -b 115200

PIOENV=nodemcuv2-4m
SPIFFS failed!

$ pio run -t upload -e nodemcuv2-4m1m && pio device monitor -b 115200

PIOENV=nodemcuv2-4m1m
Please wait 30 secs for SPIFFS to be formatted
SPIFFS formatted
totalBytes:957314
usedBytes:0
blockSize:8192
pageSize:256
maxOpenFiles:5
maxPathLength:32

$ pio run -t upload -e nodemcuv2-4m2m && pio device monitor -b 115200

PIOENV=nodemcuv2-4m2m
Please wait 30 secs for SPIFFS to be formatted
SPIFFS formatted
totalBytes:1953282
usedBytes:0
blockSize:8192
pageSize:256
maxOpenFiles:5
maxPathLength:32

$ pio run -t upload -e nodemcuv2-4m3m && pio device monitor -b 115200

PIOENV=nodemcuv2-4m3m
Please wait 30 secs for SPIFFS to be formatted
SPIFFS formatted
totalBytes:2949250
usedBytes:0
blockSize:8192
pageSize:256
maxOpenFiles:5
maxPathLength:32



Arduino-IDEではSPIFFS ファイルシステムアップローダーを使って、事前にファイルをSPIFFS領域にアップロードしておくことができます。
platformioでも以下の手順で、事前にファイルをSPIFFS領域にアップロードしておくことができます。

srcディレクトリと同じ並びにdataディレクトリを作る
dataディレクトリにアップロードしたいファイルを置く
-t uploadfsのオプションでpioを実行する
複数の環境が定義されているときは環境名を指定しないと、全ての環境でアップロードが実行されます。
(例)
pio run -e nodemcuv2 -t uploadfs

今回はtest1.txt と test2.txt の2つのファイルをdataディレクトリに置きました。
$ tree --charset=C
.
|-- data
|   |-- test1.txt
|   `-- test2.txt
|-- include
|   `-- README
|-- lib
|   `-- README
|-- platformio.ini
|-- src
|   `-- test.cpp
`-- test
    `-- README

ディレクトリ情報を表示するソースを書いて、以下の2つのコマンドを実行しました。
$ pio run -e nodemcuv2 -t uploadfs
$ pio run -e nodemcuv2 -t upload && pio device monitor -b 9600

ちゃんとアップロードされています。
PIOENV=nodemcuv2
<test2.txt> size=33
<test1.txt> size=33

続く....