📋
EEPROM の読み書き方法
EEPROM とは?
- 不揮発性メモリ
- ATmega328 に内蔵している
- 1K 持っている
- 種類によって容量が異なる
- 書き込みに 3.3 ms かかる
-
10万回書き込むと死ぬ
- 約5分に1回書き込むと1年で寿命がくる
(60 * 24 * 365) / 100000 = 5.256
- 一般的な EEPROM の寿命がそうらしい
- 今までに何回書き込んだか知る方法はない
- 約5分に1回書き込むと1年で寿命がくる
- ファイルシステムの概念はない
- 読み書きする場所は自分で管理する
ライブラリ
Arduino IDE に含まれている。
ドキュメント
文章を読むよりヘッダファイルを見た方が早い。
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