ESP32 で SPIFFS を使う

# 環境

- Arduino 1.8.13
- esp32 by Espressif Systes バージョン1.0.4

# コード


## プログラム開始時に data1,data2,data3 値を読み込み

 ```

//   init filesystem

  TFTDisplayOut(notifyInitializing );
  bool res = SPIFFS.begin(true); // FORMAT_SPIFFS_IF_FAILED
  Serial.print("SPIFFS.begining...");
  if (!res) {
    Serial.println("fail");
    handleFatalError("ファイルシステムを開始できません");
  }
  Serial.println("OK");

  // set file read
  File fp = SPIFFS.open(recordfile, "r");
  if (!fp) {
    SPIFFS.format();
    Serial.println("Spiffs formatted");
    File fp = SPIFFS.open(recordfile, "w");
    if (!fp) {
      Serial.println("Write Opening recordfile failed");
      handleFatalError("ファイルに記録できません");
    } else {
      fp.println(data1);
      fp.println(data2);
      fp.println(data3);
      fp.close();
      File fp = SPIFFS.open(recordfile, "r");
    }
  }
  if (!fp) {
    Serial.println("Opening recordfile failed");
      handleFatalError("ファイルに記録できません");
  } else {
    int temp;
    temp = fp.readStringUntil('\n').toInt(); if ( 0 != temp ) data1 = temp;
    temp = fp.readStringUntil('\n').toInt(); if ( 0 != temp ) data2 = temp;
    temp = fp.readStringUntil('\n').toInt(); if ( 0 != temp ) data3 = temp;

    Serial.print("data1:");
    Serial.println(data1);
    Serial.print("data2:");
    Serial.println(data2);
    Serial.print("data3:");
    Serial.println(data3);
    fp.close();
  }
  TFTDisplayOut(notifyInitializeEnd );


```

## データ更新時に data1,data2,data3 値を書き込み

```

  Serial.println("SPIFFS record");
  File fp = SPIFFS.open(recordfile, "w");
  if (!fp) {
    Serial.println("Opening recordfile failed");
    handleFatalError("ファイルに記録できません");
} else {
    fp.println(data1);
    fp.println(data2);
    fp.println(data3);
    fp.close();
  }

```

# 実行

最初に実行すると、

```

  bool res = SPIFFS.begin(true); // FORMAT_SPIFFS_IF_FAILED
```

が実行された時点で

```

E (470) SPIFFS: mount failed, -10025
```

がシリアルモニタに出力され、フォーマットが行われる。フォーマットに必要な時間は数十秒あるため、あらかじめ

```

  TFTDisplayOut(notifyInitializing );
```
として液晶ディスプレイに初期化表示を出しておく。

念の為

```

  File fp = SPIFFS.open(recordfile, "r");
  if (!fp) {
    SPIFFS.format();
    ...
```

ともしたが、ここは必要ないかな？

# エラー


Guru Meditation Error が発生する

```

Guru Meditation Error: Core  1 panic'ed (Cache disabled but cached memory region accessed)
Core 1 register dump:
PC      : 0x400dc5b8  PS      : 0x00060034  A0      : 0x80081724  A1      : 0x3ffbe790  
A2      : 0x00000009  A3      : 0x20000000  A4      : 0x00000400  A5      : 0x3ffc0c54  
A6      : 0x00000000  A7      : 0x3ffb1a8c  A8      : 0x800811b7  A9      : 0x00000000  
A10     : 0x3ffc0c64  A11     : 0x3f400fb8  A12     : 0x00000000  A13     : 0x3ffb1a30  
A14     : 0x00000000  A15     : 0x00000005  SAR     : 0x00000011  EXCCAUSE: 0x00000007  
EXCVADDR: 0x00000000  LBEG    : 0x4000c2e0  LEND    : 0x4000c2f6  LCOUNT  : 0x00000000  
Core 1 was running in ISR context:
EPC1    : 0x4008e090  EPC2    : 0x00000000  EPC3    : 0x00000000  EPC4    : 0x400dc5b8

Backtrace: 0x400dc5b8:0x3ffbe790 0x40081721:0x3ffbe7b0 0x40084ba9:0x3ffbe7d0 0x4008e08d:0x3ffb1ab0 0x4008e91d:0x3ffb1ad0 0x40087648:0x3ffb1af0 0x400f9cb3:0x3ffb1b60 0x400e2491:0x3ffb1b90 0x400e26c7:0x3ffb1bc0 0x400e3c33:0x3ffb1bf0 0x400e57ae:0x3ffb1c30 0x400e207c:0x3ffb1c70 0x400e0dc4:0x3ffb1ca0 0x400e952d:0x3ffb1d00 0x4000bcc5:0x3ffb1d20 0x400ea889:0x3ffb1d40 0x400d9e9f:0x3ffb1d60 0x400da1ef:0x3ffb1d90 0x400da4c9:0x3ffb1dd0 0x400d9baf:0x3ffb1e50 0x400d6102:0x3ffb1e80 0x400dc6fb:0x3ffb1fb0 0x40088a3d:0x3ffb1fd0

Rebooting...
```

これはタイマー割り込みを設定していた時に発生した。以下のような20ミリ秒ごとのタイマー割り込みを SPIFFS を操作する前に書いていたが、 SPIFFS を操作する後に記述するように変更。

```
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 20000, true);  // 20m sec
  timerAlarmEnable(timer);

```

また、データ更新処理においては以下のように timer をストップしてから SPIFFS 処理をしたあと、 timer を再開する。

```

  timerAlarmDisable(timer);    // stop alarm
  timerDetachInterrupt(timer);  // detach interrupt
  timerEnd(timer);      // end timer
  Serial.println("tiner stop");
   
/*
  ~ SPIFFS 処理をここに書く ~
*/

  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 20000, true);  // 20m sec
  timerAlarmEnable(timer);
  Serial.println("tiner setted again");
```