この節では,組み込み向けアプリケーションで必要となる,ROMイメージの作成について説明します。
アプリケーション中で外部変数や静的変数を定義すると,それらの変数はRAM上のセクションに配置されます。変数が初期値を持つ場合,アプリケーションの開始時にはRAMに初期値が存在している必要があります。
一方で,ハードウェアの起動時やリセット時はRAMの値は不定です。従って,リセットからアプリケーションの起動までの間に,RAMに変数の初期値を格納する必要があります。
CC-RLでは,プログラム本体と初期値データをROMに配置した,ROMだけのプログラムイメージを作成することができます。このプログラムを実行すると,スタートアップ・ルーチン内で,ROMに準備した初期値データをRAMにコピーしてRAMの初期化を行います。
セルフ・プログラミングのために,プログラム・コードをRAM上に配置することがあります。この場合も同様に,スタートアップ・ルーチン内で,ROMに準備したプログラム・コードをRAMに配置します。
ROMからRAMへデータを配置するには,最適化リンカの-romオプションを使用します。
リンカでセクションの自動配置機能を指定しない場合は,初期値データセクション,初期化先セクションのアドレスをそれぞれ-startオプションで指定する必要があります。リンカでセクションの自動配置機能を指定する場合は,-startオプションでのアドレス指定は不要です。
ユーザ・プログラム中にセクション.text,.textf,.RLIB,.SLIB,.const,.constf,.data,.sdata,.bss,.sbssがあるとします。実行時に.textを0x100番地に,.constを0x2000番地に,再配置属性DATA,BSSのセクションを0xfe000 番地に,再配置属性SDATA,SBSS のセクションを0xffe20 番地に配置したい場合,次のように記述します。
-start=.text/100 -start=.const,.RLIB,.SLIB,.textf,.constf,.data,.sdata/2000 -start=.dataR,.bss/FE000 -start=.sdataR,.sbss/FFE20 -rom=.data=.dataR,.sdata=.sdataR |
コピー先のセクション名.dataR,.sdataRは別名でも構いませんが,スタートアップ内の記述と合わせる必要があります。実行時には,.dataから.dataR,.sdataから.sdataRにデータがコピーされ,.bss,.sbssを初期化して使用します。