esp-open-rtosを使ってみる

SPIFFS

esp-open-rtosでもSPIFFSを使うことができます。
SPIFFSを使うためにこちらのライブラ リが組み込まれています。
SPIFFSの利用方法として、2つの方法が提供されています。

@コンパイル時にSPIFFSを配置するBASEアドレスと、SPIFFSのサイズを指定する(SPIFFS_SINGLETON == 1)
これらはMakefileの中で指定します。
この場合、ビルドと同時にカレントフォルダーのファイルを、SPIFFS領域にアップロードすることができます。

A実行時にSPIFFSを配置するBASEアドレスと、SPIFFSのサイズを指定する(SPIFFS_SINGLETON == 0)
これらはesp_spiffs_init()で指定します。

デフォルト設定はSPIFFS_SINGLETON == 1です。



esp-open-rtosのデフォルトのFlashサイズは16Mbit(2MByte)です。


Makefileの中で以下の様にFlashサイズを指定することができます。
FLASH_SIZE = 32
この指定を行うことでFlashサイズを32Mbit(4MByte)に変更することができますが、
変更するとWiFiの接続ができなくなるときが有ります。

WiFiに接続したときの情報(モードやSSIDなど)はNVS領域に記録されますが、
Flashサイズが16Mbit(2MByte)の時のNVS領域のアドレスと、
Flashサイズが32Mbit(4MByte)の時のNVS領域のアドレスが違うので、
この様なことが起こります。
Flash領域を一旦すべて消去(ERASE)することで回避することができます。




SPIFFSを使う場合、MakefileにFLASH_SIZE=32を指定します。
これでFlashサイズを32MBit(4MByte)と認識します。
また、コンパイル時にSPIFFSを配置する場合、こ ちらに書かれているように、
SPIFFSを配置するBASEアドレスに0x200000を指定します。
これ以下のアドレスを指定できるのかどうか、よくわかりません。
FLASHの末尾36KはNVS領域として使われるので、SPIFFSとして使える最大のサイズは
0x200000から0x3f7000の1F7000バイト(2012K)となります

# spiffs configuration
SPIFFS_BASE_ADDR = 0x200000
SPIFFS_SIZE = 0x1F7000
#0x1F7000=2012KByte=2,060,288Byte



SPIFFSのAPIや定数はこ ちらに公開されていますが、全てのAPIが使えるのかどうかは未確認です。
APIの使い方はこちらに あるtest_bugreports.c や test_hydrogen.c を見れば分かります。
基本的にLinuxの低水準入出力関数と同じ使い方ができますが、定数や変数の型が変わります。

<Linuxの低水準入出力関数>
file fd;
fd = open("example.txt", O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE);
read(fd, buffer, 10);
write(fd, buffer, 10);
close(fd);

<SPIFFSの入出力関数>
spiffs_file fd;
fd = SPIFFS_open(&fs,"example.txt", SPIFFS_O_RDWR|SPIFFS_O_CREAT|SPIFFS_O_TRUNC, 0);
SPIFFS_read(&fs, fd, buffer, 10);
SPIFFS_write(&fs, fd, buffer, 10);
SPIFFS_close(&fs, fd);



examples/spiffsにサンプルが公開されていますが、非常にあっさりとしたサンプルです。
そこで、SPIFFS上にあるファイルをリモートで書き換えるサンプルを作ってみました。
結構大きなコードになったので、こちらに 公開しています。



最初に以下のUDP受信処理(Pythonコード)を別の端末で実行しておきます。
ポート番号=8200からUDPメッセージを受信するコードです。
このコードは、examples/ds18b20_broadcaster/README.md から借用しました。
import select, socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('<broadcast>', 8200))
s.setblocking(0)

while True:
    result = select.select([s],[],[])
    msg = result[0][0].recv(1024)
    print msg.strip()


ファームを書き込んで起動したら、以下の様にIPアドレスが表示されます。
これはESP8266がUDPを使ってブロードキャストしたメッセージで、定期的に送信しています。
DHCPから払い出されたESP8266のIPアドレスを知ることができます。




次に新しい端末で、以下のコマンドを使って、SPIFFS上にあるinit.jsonの内容を表示します。
IPアドレスはESP8266のIPアドレスを指定します。
init.jsonの初期値は、filesディレクトリの下に有ります。


parseを指定するとJSONファイルをパースして表示します。




次に以下のコマンドで、SPIFFS上にあるinit.jsonの内容を、new.jsonの内容に書き換えます。




再度、以下のコマンドを使って、SPIFFS上にあるinit.jsonの内容を表示します。
ファイルの中身が書き換わっています。






以下のコマンドで、現在のSPIFFSの使用状況とディレクトリリストを表示することができきます。


続く....