P/ECE研究室〜S1C33分室



* Tue Jul 30 04:30:00 JST 2002 Naoyuki Sawa




フラッシュメモリの話題も四回目、今回は消去・書き込みを実験します。




実験に入る前に、フラッシュメモリの消去・書き込みの仕組みを調べてみました。 フラッシュメモリ#1の回にご紹介いたしました、シャープさんのフラッシュメモリ関連ページの中にある、 「フラッシュメモリのセル構造」の説明がわかりやすいと思います。 ・・・いや、個々の用語はさっぱりわかりませんが、なんとなくわかった気分になります(^^; この説明を読むまで僕は、フラッシュメモリの各ビット(セル)は、次のような状態を遷移するものだと思っていました。       +−−−−−−−−−−+       | 消去された状態  |   +−−→|読み出しデータ=不定|←−−+   |   +−+−−−−−−+−+   |   |     |      |     |   |    0|      |1    |   |    を|      |を    |  消|    書|      |書    |消  去|    き|      |き    |去   |    込|      |込    |   |    む|      |む    |   |     ↓      ↓     | +−+−−−−−−−+  +−−−−−−−+−+ |書き込まれた状態 |  |書き込まれた状態 | |読み出しデータ=0|  |読み出しデータ=1| +−−−−−−−+−+  +−+−−−−−−−+   ↑     |      |     |   +−−−−−+      +−−−−−+ 0または1を書き込む    0または1を書き込む    (無意味)        (無意味) しかし、この認識は間違っていました。正しくはこうです。       +−−−−−−−−−+       | 消去された状態 |   +−−→|読み出しデータ=1|←+   |   +−+−−−−−+−+ |   |     |     |   |   |    0|     +−−−+   |    を|    1を書き込む  消|    書|     (無意味)  去|    き|   |    込|   |    む|   |     ↓ +−+−−−−−−−+        +−−−−−−−−−−+ |書き込まれた状態 +−−−−−−−→|  未定義状態   | |読み出しデータ=0| 1を書き込む |読み出しデータ=不定| +−+−−−−−−−+  (不可)  +−−−−−−−−−−+   |     ↑          ※未定義状態の存在は、   +−−−−−+           実験結果からの推測です。   0を書き込む    (無意味) 無意味な動作や、やってはいけない動作を省くと、次のようになります。 +−−−−−−−−−+ | 消去された状態 | |読み出しデータ=1| +−−−−−−−+−+   ↑     |   |    0|   |    を|  消|    書|  去|    き|   |    込|   |    む|   |     ↓ +−+−−−−−−−+ |書き込まれた状態 | |読み出しデータ=0| +−−−−−−−−−+ すなわち、次のように言い換えることができます。 ・あるビットの値を1に変更するのが「消去」です。 ・あるビットの値を0に変更するのが「書き込み」です。
では、実験です。 今回のプログラムは、フラッシュメモリの末尾64キロバイト(0xc70000〜0xc7ffff)の部分を実験用領域として使い、内容を書き換えます。 もしも実験用領域にファイルがあると、ファイルの内容が壊れてしまいます。 まず、実験用領域にファイルがないことを確認しましょう。 拙作・P/ECEファイルシステムビューアが、めずらしく役に立ちます。 P/ECEファイルシステムビューアを実行し、有効なセクタのうち、末尾の16個の部分にファイルがないことを確認してください。 この部分にファイルがあった場合は、該当するファイルを消しておいてください。
今回の実験プログラムは、フラッシュメモリ上の実験用領域に置いたビットマップデータを、画面全体に表示します。 P/ECEのビットマップデータは、ビットマップ情報の部分(PIECE_BMP構造体)と、データ本体(PIECE_BMP.bufが指す領域)に分かれています。 このうち、ビットマップ情報(PIECE_BMP)の部分はSRAM上に置くことにします。 ビットマップ情報の中で、データ本体のアドレス(PIECE_BMP.buf)を、フラッシュメモリ上の実験用領域(0xc70000)に設定しておきます。 それから、実験用領域にビットマップデータ本体を書き込んだり、消去したりします。 正しい画像が表示されたら、フラッシュメモリが書き換えられたことが確認できます。 また、画像が消えたら、フラッシュメモリが消去されたことが確認できます。 ビットマップデータは二種類用意しておき、どちらのビットマップデータ本体をフラッシュメモリに書き込むかによって、 二種類の画像を表示できるようにしてみました。       SRAM p   +−−−−−−−−−+ c   |         | e−−→+−−−−−−−−−+ L   |PIECE_BMP|         フラッシュメモリ C   |.header  |        +−−−−−−−−−+0xc00000 D   |.buf−−−−−−−+      |         | S   |.mask    | |      |  カーネルや  | e   +−−−−−−−−−+ |      |  ファイル等  | t   |         | | ポイント |         | O   +−−−−−−−−−+ +−−−−−→+−−−−−−−−−+0xc70000 b   |ビットマップデータ+−−−−−−−→|  実 験 用  | j   |  本体 #1  |書き込み+−−→|   領 域   | e   +−−−−−−−−−+    |   +−−−−−−−−−+0xc7ffff c   |ビットマップデータ+−−−−+ t   |  本体 #2  |書き込み で   +−−−−−−−−−+ 描   |         | 画   +−−−−−−−−−+ 実験プログラムのソースはこちら
実験結果の画面をご覧下さい。
初期状態では、実験用領域は完全に消去された状態(全ビット=1)でしたので、
ビットマップデータとしては真っ黒な画像と見なされます。
期待通り、真っ黒な画面が表示されています。
(以前にこの領域にファイルがあった場合は、ファイルの内容が残っている場合があります。
 内容が残っていた場合、真っ黒な画面ではなくゴミが表示されますが、それも正常です)
それでは、Aボタンを押して、実験用領域にデータを書き込んでみましょう。
ばっちりです。
STARTボタンを押して、実験用領域の内容を消去してみます。
元の状態に戻りました。
それでは、Bボタンを押して、もう一方のビットマップデータを書き込んでみましょう。
今度もばっちりです。
フラッシュメモリの書き換えを正しく行えることが確認できました。
フラッシュメモリの内容が消去された状態(全ビット1)で、データを書き込めることは確認できました。 それでは、内容が消去されていない状態(0のビットがある)で、別のデータを書き込むとどうなるのでしょうか? 先ほどの状態遷移図の、書き込み処理の部分をもう一度見てみます。 +−−−−−−−−−+ | 消去された状態 | |読み出しデータ=1|←+ +−+−−−−−+−+ |   |     |   |  0|     +−−−+  を|    1を書き込む  書|     (無意味)  き|  込|  む|   ↓ +−−−−−−−−−+        +−−−−−−−−−−+ |書き込まれた状態 +−−−−−−−→|  未定義状態   | |読み出しデータ=0| 1を書き込む |読み出しデータ=不定| +−+−−−−−−−+  (不可)  +−−−−−−−−−−+   |     ↑   +−−−−−+   0を書き込む    (無意味) 既に0が書き込まれているビットに、1を書き込んではいけません。 既に0が書き込まれているビットに1を書き込んでも、0の状態を維持するものと予想したのですが、そうではないようです。 書き込んだ結果が不定になるか、書き込み処理が完了しないことがあるみたいなのです。 しかもこの現象が出るのはごく稀(数キロバイト書き込みで一回程度)で、ほとんどの場合は0を維持するようです。 もう少し調査が必要ですが、とりあえず、 既に0が書き込まれているビットに、1を書き込んではいけない と考えることにしました。 0のビットに0を書き込んだ場合は、予想通り0を維持します。 既存の値が1のビットに対する、0または1の書き込みは可能です。 0を書き込めば0に変化し、1を書き込めば1の状態を維持します。 以上より、消去されていないフラッシュメモリの領域に、別のデータを重ね書きする場合のルールがわかります。 (そんなことする必要があるのかと言われれば「ない」ですが、あくまで実験ですので(^^;) ・既にフラッシュメモリに書き込まれているデータをAとします。 ・別のデータをBとします。 ・A AND B の結果を C とします。 ・Aが書き込まれている領域に、Cを書き込むことができます。結果はCになります。 それでは実験してみましょう。
先ほどの実験の最後で、Bボタンで書き込んだビットマップデータがまだ残っています。
これを消さずに、Aボタンを押して、もう一方のデータを重ね書きしてみます。
実際に書き込む値は、先ほどのルールに従って、ANDした値を書き込みます。
わかりずらいですけれど、二つの画像の各ピクセルをANDした画像が、ちゃんと書き込めました。
二つの色をANDしたときの色の変化は、次のようになります。
00:白01:明10:暗11:黒
00:白00:白00:白00:白00:白
01:明00:白01:明00:白01:明
10:暗00:白00:白10:暗10:暗
11:黒00:白01:明10:暗11:黒
元の画像のうち、重ね書きした画像が黒い部分はそのまま残る、という点に注目して、実験結果の画像をもう一度見てみると、 ピースの眼の部分や、ミスターPの頭の部分の形が、なんとなく見えてくると思うのですが、いかがでしょうか? 実験プログラムの中でも、フラッシュメモリの内容が書き込んだ通りの値に変化するのを検査しています。(そうならなければハングアップします) 既存の値とのANDをとった値ならば、フラッシュメモリを消去しなくても、重ね書きできることが確認できました。
実験は、以上です。 次回は、フラッシュメモリの消去・書き込み手順を再確認します。 データシートどおりで楽勝・・・と思いきや、ちょっと落とし穴もありました。 実験プログラムのコメントにも書いておきましたが、「Toggle Bit(DQ6)」による完了待ちは使えない!という点です。 今回の実験ではいまいちすっきりしない、0のビットに対する1の書き込みのふるまいも、もう少し調査してみようと思います。 (…続きます)

nsawa@piece-me.org