LoginSignup
4
6

More than 5 years have passed since last update.

EEPROMに設定値を変更に強い形で保存する

Last updated at Posted at 2016-01-29

英StackOverflow,Safely storing and accessing EEPROMより、
組み込みでEEPROM(など)に設定値を書くときのデータ構造について。

データ構造

ヘッダの後にデータを続ける。次の設定値は隙間を開けずにまた続ける。
設定値が可変長でなければ(大抵の場合固定長)、これで困らない。
(長さが変わったらそれは別のファームウェアバージョンとして、初期設定の対象になる)
設定値が可変長であるシステムはまた別の方法で実装するか、
固定長になるように考えなおす。
全体の末尾には0を付けておく。
ヘッダ,データ,ヘッダ,データ,...ヘッダ,データ,0みたいになる

ヘッダの構造はこちら:

Byte 0: Table Length (in 16-bit words)
Byte 1: Table ID (used by firmware to determine what this data is)
Byte 2: Format Version (incremented every time the format of this table changes)
Byte 3: Checksum (simple sum-to-zero checksum)

つかいかた

ある設定値を読み込むときは、アドレス0から読み込んでいき、
合致するIDとFormat Versionが現れるまでテーブルを探す。
テーブルは隙間なく詰めているので、探すときにはアドレスをTable Length分飛ばせばいい。
全体の末尾に0を書いておけば、Table Lengthが0のとき探しきったことになる。
こうしておけば、フォーマットもEEPROMの先頭に0書くだけで済む。

初期状態で0埋めされていないEEPROMの場合

初期値が0x00以外で埋められているEEPROMでこのデータ構造を使うと、
一番最初の立ち上げが未フォーマット状態になる。
初回起動時に限り手動フォーマットでもいいが、自動でやりたい場合には、

  • 先頭アドレスをフォーマット済みフラグにする。
  • 次のアドレスからテーブルを始める。
  • 起動時にフォーマット済みフラグを読む。
  • 初期値なら先頭テーブルを削除し(長さに0を書く)、フォーマット済みフラグを初期値+1なり何なりする。
  • 設定値を使う各モジュールは、自分の使うidが登録されているかを見て、存在しないなら初期設定を書き込む。

雑にですが書いてみました

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6