【空きメモリの処理】
PICのプログラムを完成させ、製品としてプログラムを書き込むとき、未使用の領域
は、通常はイレーズ状態ですから、0x3FFFと全ビット1の状態になっています。
しかし、製品では、万一プログラムが暴走したときのことを考えて、たとえば
「goto 0」などの命令で埋め尽くしておきたいということがあります。
こうしておけば、もし暴走してとんでもない番地にジャンプしたとしても、必ずすぐ
0番地に戻ってきて、再度初期化から実行し直しますから元に戻すことができます。
このように空きメモリをすべて固定値で埋め尽くす方法を説明します。
【アセンブラによる実現方法】
アセンブラでこれを実現するためには、「FILL」という擬似命令を使います。
使い方は、下記が基本書式となっています。
[<label>] FILL <expr> , <count>
これでexprという定数をcount個数だけ、この命令以下に追加します。
さらにexprには、( ) で囲んだアセンブラ命令が記述できます。実際の記述例は
下記のようになります。
FILL 0x2800, 5 ;5個の定数を追加
FILL (GOTO Reset_Vector), Next_Block − $
;GOTO 0 を現在位置からメモリブロックの最後まで埋める
FILL (GOTO 0), 04000H - $
;GOTO 0 命令を現在位置から3FFF番地まで埋め尽くす
【C言語による実現方法】
CCS社のCコンパイラの場合には、最新のバージョンで、「#fill_rom」という
プリプロセッサが追加されていますので、これを使います。
正確には、Ver3.202から使えます。
基本の書式は下記のようにします。
#fill_rom <const>
プリプロセッサですので、記述は最初か最後に追記するのが良いでしょう。
実際の記述は下記のようにします。
#fill_rom 0x2800 ;0x2800はGOTO 0 というアセンブラ命令
ここで注意が必要なことは、上記プリプロセッサの追加により、埋め込まれるのは
HEXファイルの方だけで、MPLAB上のプログラムメモリには反映されないということです。
従って、MPLABのViewでProgram Memoryを表示させても反映されませんし、そのまま
書き込んでも上記のデータは書き込まれません。
上記を反映させるためには、コンパイル後、いったんHEXファイルをインポートする
必要があります。その後は、Program Memoryも表示されますし、書込みもきちんと
実行されます。
これは、CCSコンパイラとMPLABの連携がまだできていないためだと思われます。
【MPLABの機能を使う方法】
MPLABでプロジェクトを開いているとき、View → Program Memoryでプログラムメモリ
の内容を表示しておきます。
ここで右クリックをすると下図の左側のポップアップメニューが開きますので、ここで
Fill Memoryを選択すると、下図右側のダイアログが開きます。
ここで開始アドレス、終了アドレスとデータを入力してWriteボタンを押せば、空きエリア
を埋めることができます。