next up previous contents
: バッチの登録プログラム : バッチ処理 : Flash EEPROM   目次

仕様

バッチ処理を実行させるには、バッチがFlashメモリのどの領域に保存されているかを記憶しておかなければならない。よって、Flashメモリの先頭部分をヘッダーとして、バッチの先頭と、後述する空き領域のリストの先頭ページアドレスを保持するために使用する。バッチ処理単体が必要とするページサイズとFlashメモリ全体のサイズの兼ね合いから、登録できるバッチは15個までとした。また、ヘッダーの構成は表7.1のように決定した。


表 7.1: Flashメモリのヘッダーが保持する先頭ページアドレス
ページアドレス 機能
EDATA1 EDATA2 EDATA3 EDATA4
00H 空白リスト バッチ1 バッチ2 バッチ3
01H バッチ4 バッチ5 バッチ6 バッチ7
02H バッチ8 バッチ9 バッチ10 バッチ11
03H バッチ12 バッチ13 バッチ14 バッチ15

Squeakのタイルスクリプティング機能は、タイルを並べて作ったスクリプトプログラムを原則としてループ実行させるため、バッチ処理の実行もそれに倣い、基本的にループする仕様にした。ただし、ループしない実行命令も用意した。また、バッチ処理が他のバッチ処理を呼び出せるようにするため、バッチの処理中のアドレスをスタッキングする機能も設けた。スタックサイズは8で固定としたが、ユーザメモリの許す限り増やす事も可能である。さらに、スタッキングを行わない実行命令も用意した。これは、スタックにバッチが存在しない時、ループするバッチを変更することができるようにするためである。

終了判定および領域サイズの計算を行うため、バッチ処理の末尾にはターミネータ(Terminator)を必ず置くものとし、バッチを意図的に途中で終了させるコマンドはリターン(Return)として別に用意した。

バッチの登録に用いるメモリ割り当てアルゴリズムは、プログラムが簡単、実行速度が速いなどの理由から初適合を採用した。初適合とは、目的のサイズのデータを十分格納できるメモリをアドレス順に探し、最初に見つかった場所に格納するものである。また、Flashメモリは登録と消去を繰り返すと断片化する。よって、メモリ全体の空き領域は足りているが、断片化のためにバッチが格納できないと確認された時点でデフラグを行うプログラムを実装した。ただし、デフラグには非常に時間がかかり、Flashメモリに負荷をかけることにもなるため、登録済みのバッチを消しても良いならばメモリの全消去を行うべきである。

メモリの割り当てを行うには、メモリ中の空き領域を保持しておく必要があるが、これにはリスト方式を採用した。リスト方式とは、空き領域の先頭部に、連続する空き領域のサイズと、次の空き領域のアドレスを格納することで、空き領域を辿ることができるようにするものである。

よって、Flashメモリ内部は例として図7.4のようなイメージで構成される。

図 7.4: Flashメモリ内部のイメージ図
\includegraphics[scale=1.0]{images/flashMemoryImage.eps}



Deguchi Lab. 平成20年3月4日