英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が登録されているかを見て、存在しないなら初期設定を書き込む。