【メモリレイアウトと#ORG】
ミッドレンジシリーズのPICはプログラム用メモリが2kW毎の「ページ」に
分割されています。
通常、アセンブラ言語でプログラムを作るときには、このページを意識して
プログラムを配置しなければならないのですが、C言語の場合には、
コンパイラが自動的に最適レイアウトに配置してくれるので気にする必要は
ありません。
逆にコンパイル結果でプログラムのサイズがどの程度になるか決まって
いませんので、あらかじめプログラムの配置を決めるのは難しいことになり
ます。
しかし、それでも特別にメモリ配置を指定したい場合があります。例えば、
プログラムメモリ中にテーブルデータを格納したいときとか、固定データだけ
別に特定のページに配置したいとかいう場合です。
そのようなときのためにプログラムメモリの配置を指定できる「#org」という
プリプロセッサがあります。
ハイエンドのPIC18シリーズではプログラムメモリにページ分割はありません
から、任意の位置に配置ができます。逆にあえてメモリ配置を決める必要
がありませんから#orgを使うことはありません。
ただし、複数のプログラムに分割して開発するような場合には、各々の
モジュールの開始番地をあらかじめ固定的に決めておいて、それぞれの
開発デバッグがしやすいようにすることができます。
【#ORGプリプロセッサの使い方】
#orgプリプロセッサの書式は、下表のようになっています。
No 書 式 機能内容 1 #org start, end これ以降の関数やデータをアドレスstartから格納し、アドレスendまで使用する。 2 #org segment 前に定義した#orgのstartアドレス以降の同じページ内のどこかに配置する。 3 #org start, end {} アドレスstartからendまでの間のメモリを使用禁止とするようコンパイラに指示 4 #org start, end auto=0 RAMエリアがmainのデータと重なって、関数から戻ってこない時にauto=0を追加する。
この#orgプリプロセッサを使えば、指定関数を、特定のメモリアドレスに配置
することができます。
具体的な例は下記リストのようにします。
まずページ0では0x05番地から0x200番地まで領域確保されたため、
main関数が0x201番地から配置されます。
関数myfunc1()は指定どおり0xB00番地から配置されます。
次の関数myfunc2()は、myfunc1()と同じページ内ですが、そのどこ
かに配置されます
次の関数myfunc3()は0x300番地から配置されます。
このように確かにメモリレイアウトを指定の位置にすることが
出来ます。
0番地にはmain関数にジャンプするようジャンプ命令が配置されます。