📋

EEPROM の読み書き方法

2023/01/27に公開

EEPROM とは?

  • 不揮発性メモリ
  • ATmega328 に内蔵している
    • 1K 持っている
    • 種類によって容量が異なる
  • 書き込みに 3.3 ms かかる
  • 10万回書き込むと死ぬ
    • 約5分に1回書き込むと1年で寿命がくる (60 * 24 * 365) / 100000 = 5.256
    • 一般的な EEPROM の寿命がそうらしい
    • 今までに何回書き込んだか知る方法はない
  • ファイルシステムの概念はない
    • 読み書きする場所は自分で管理する

ライブラリ

https://docs.arduino.cc/learn/built-in-libraries/eeprom

Arduino IDE に含まれている。

ドキュメント

https://github.com/arduino/ArduinoCore-avr/blob/master/libraries/EEPROM/src/EEPROM.h

文章を読むよりヘッダファイルを見た方が早い。

Singletonなメソッド

メソッド 意味
read(addr) [addr]
write(addr, value) [addr] = value (確実に寿命が減る)
update(addr, value) [addr] != value なら write
get(addr, &t) メモリに読み込む
put(addr, &t) メモリを update で書き込む
length() 容量を返す。UNO は 1024
begin() 0 (STL用)
end() length() と同じ値 (STL用)
  • read / write
    • 1バイト専用
    • [addr][addr] = value の alias がある
  • update
    • write の代わりに update を使うと長生きする
  • get / put
    • sizeof(t) バイト分を読み書きする
    • put は update で書き込む

コード

アドレス 0 に 1 を書き込んで読み出す例
#include <DebugLog.h>
#include <EEPROM.h>

void setup() {
  Serial.begin(9600);

  EEPROM.write(0, 1);
  PRINTLN(EEPROM.read(0));  // => 1
}

void loop() {}

通常の変数のように扱う方法

EERef value = EEPROM[5];
value = 2;
value *= 3;
PRINTLN(EEPROM[5]);  // => 6

通常のポインタのように扱う方法

EEPtr ptr = 5;
*ptr = 1;
ptr++;
*ptr = 2;
PRINTLN(EEPROM[5]);  // => 1
PRINTLN(EEPROM[6]);  // => 2

容量を超えて書き込むとどうなる?

EEPROM[1024] = 10;
PRINTLN(EEPROM[1024]);  // => 10
PRINTLN(EEPROM[0]);     // => 10

マスクされているらしく 1024 は 0 と同じ扱いのようだ。

Discussion