* 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個の部分にファイルがないことを確認してください。 この部分にファイルがあった場合は、該当するファイルを消しておいてください。
初期状態では、実験用領域は完全に消去された状態(全ビット=1)でしたので、 ビットマップデータとしては真っ黒な画像と見なされます。 期待通り、真っ黒な画面が表示されています。 (以前にこの領域にファイルがあった場合は、ファイルの内容が残っている場合があります。 内容が残っていた場合、真っ黒な画面ではなくゴミが表示されますが、それも正常です) それでは、Aボタンを押して、実験用領域にデータを書き込んでみましょう。 | |
ばっちりです。 STARTボタンを押して、実験用領域の内容を消去してみます。 | |
元の状態に戻りました。 それでは、Bボタンを押して、もう一方のビットマップデータを書き込んでみましょう。 | |
今度もばっちりです。 |
先ほどの実験の最後で、Bボタンで書き込んだビットマップデータがまだ残っています。 これを消さずに、Aボタンを押して、もう一方のデータを重ね書きしてみます。 実際に書き込む値は、先ほどのルールに従って、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:黒 |