不揮発メモリ保存の設計
半導体で使われるメモリは大きく2種類あり、揮発性メモリと不揮発性メモリにわかれます。揮発性のメモリはRAMと呼び、電源が供給されなくなると、記録した内容は失われます。不揮発性のメモリはROMと呼び、電源供給が止まった場合でも記録した内容は失われません。これらRAMとROMのそれぞれに、さらに細かな構造や特性の違いによる種類が存在し、用途に応じて使い分けられています。この記事では不揮発性メモリに焦点を当て、それぞれの性質や設計時の注意点を解説します。
代表的な不揮発メモリ
代表的な不揮発メモリは3種類です。
EEPROM
電圧を印加することで、電気的にデータを消去または再書き込みができる不揮発メモリです。一度しか書き込めないPROMとは異なり、何度でも書き換えが可能です。1バイト単位で消去と再書き込みができるのが特徴で、設定値の保存やカウンタ値の記録など、比較的小さなデータの保持に使用されます。頻繁に書き換えられるデータであっても、相当の書き込み回数に耐えられるため、一般的な用途であれば十分に対応できます。他のメモリと比較して書き込み速度が遅くなる場合もありますが、一度に書き込む情報量を減らすことで対策が可能です。
フラッシュメモリ
電気的に消去および再書き込みができる点ではEEPROMと変わりません。EEPROMと異なり、消去、書き込みの最小単位となる消去ブロック単位で処理をおこなうのが特徴です。大量データを速く効率よく書き込むことに向いています。バイト単位での消去はできませんが、構造を簡易化でき全体にコストを抑えることが可能です。マイコンの実行プログラムを格納するROMとしても良く使用されます。また、小型で軽量化されたものが多く衝撃にも強いので、持ち運び用のUSBメモリや、デジタルカメラのSDカードなどに使われます。
なお、フラッシュメモリは並列にデータを転送するパラレルフラッシュメモリと、1ビットずつ順次転送するシリアルフラッシュメモリの2種類があります。パラレルフラッシュメモリは、複数の信号線を使って高速な転送を実現しますが、その分、配線が増えます。シリアルフラッシュメモリでは少数の信号線で転送をおこなうため、小型化やコストを下げることに優位性があります。最近ではQuadSPIなど高速なシリアルフラッシュメモリも出てきたため、フラッシュメモリはシリアル転送のものが主流となっています。
EEPROMエミュレーション
フラッシュメモリを使用してEEPROMをエミュレートすることをEEPROMエミュレーションと呼びます。これは、フラッシュメモリ内の特定の領域を専用に確保し、擬似的にEEPROMとして機能させる仕組みです。EEPROMは1バイトごとに読み出し、書き込みが必要なため、エミュレートしたいEEPROMのワード長を指定して予約した上で、専用エリアを使用します。
このEEPROMエミュレーション機能を用いることでEEPROM自体が不要になるため、部品数を削減して設計を簡素化することが可能です。
メモリの書き換え寿命
メモリは消去と書き込みを繰り返すことによって寿命を迎えます。上限の書き換え回数は製品によって異なりますが、かりに1秒に1回、データを書き換えるプログラムがあるとすると、1秒ごとに消去と書き込みがおこなわれます。書き換え回数の上限が1万回だったとしても3時間程度で達してしまう計算です。カウンタやタイマーの役割を果たす変数など、頻繁に更新される変数は、通常ROM上には配置せず、RAM上に配置されます。
同一の領域に書き込みが集中するとメモリが寿命を迎えるのも早くなります。そこでウェアレベリングを実施し、特定のアドレスに書き換えが集中するのを防ぎます。ウェアレベリングはメモリの書き込み位置を指定するコントローラに工夫が施されており、各ブロックの消去回数が平均化できるように、アドレスを再配置していきます。
瞬断時のデータ保持
データの書き込みや消去をおこなっている途中に電源断が発生すると、データが破壊され不整合を起こす原因となります。電源断の際に障害を引き起こさないように、ハード面とソフト面の両方から対応が必要です。
ハード面は完全にパワーロスする直前にわずかでも電力を供給し、メモリが未完了の操作や途中の転送を完了させる時間を稼げる設計が必要です。
ソフト面は定期的にファイルシステムを保存するジャーナリングファイルシステムが有効です。ジャーナルを元に戻せば少し前の正常な状態までロールバックできます。通常の操作では書き換えられることがないブートローダーの領域を確保しておけば、新しく書き込まれたものが動作しなかった場合、前にロールバックすることも可能です。
どちらで対応しても緊急回避策に近いため、そもそも電源断を防ぐための予備バッテリーを設ける仕組みも用意しておくと安心です。
電源断後の復旧設計
電源断時に書き込み途中のデータが存在しないように、未完了の場合はトランザクションをロールバックする仕組みを入れておくのも有効です。復旧後、データの完全性を保証するためにチェックサムやCRCを用いてデータを確認する仕組みとあわせて使うとスムーズです。誤り検知の仕組みとしては堅牢ではありませんが、改ざんや不正アクセスのケースとは異なり、データの破損を検出するだけなので十分です。電源が復旧した後、データもあわせて復旧できる仕組みを組み込んでおきましょう。


