XLINKで RAM code セグメントをオーバーレイする
テクニカル・ノート 62554
アーキテクチャ:
All
コンポーネント:
linker
更新日:
2018/08/13 8:32
はじめに
本テキストでは、異なるセグメントからRAM上の同じアドレスにROMのコンテンツをコピーし、同じRAM上で異なるコードを異なるタイミングで実行する方法について説明します。
ROMからRAMにコンテンツをコピーする方法の基本については、テクニカルノート80460を参照してください。
対象
本テクニカルノートは、IAR XLINKリンカを使用するバージョンに適用されます。
基本
複数のコードセグメントをRAMにオーバーレイするには、以下のステップを実行します。
- 各「ロードユニット」をオリジナルのセグメントに配置します。
- -Qリンカオプションを使用して、各セグメントのイニシャライザセグメントを作成します。
- オリジナルのセグメントをRAMにオーバーレイします。
- イニシャライザセグメントをROMに配置します。
- 各セグメントを使用する前に、各セグメントのイニシャライザセグメントから値をコピーします。
- オーバーレイされたセグメントが他のオーバーレイされたセグメントを参照していないか確認します。
1.コンテンツをセグメントに配置する
テクニカルノート80460を参照してください。
「組み込み」キーワード(__ramfuncなど)を使用しても、複数のセグメントにあるコンテンツを正しく配置できません。この場合、#pragmaを使用する必要があります。
2.イニシャライザセグメントを作成する
テクニカルノート80460を参照してください。
-QRAMCODE1=RAMCODE1_ID
-QRAMCODE2=RAMCODE2_ID
3.セグメントをRAMにオーバーレイする
IAR XLINKリンカには、セグメント配置コマンド@用の配置修飾子-Zが用意されており、この修飾子を使用すると、その配置範囲に先に配置されたコンテンツが無視されます。
-Z@(DATA)CODE_A,CONST_A,DATA_A=RAM_OVERLAY_START-RAM_OVERLAY_END
-Z@コマンドは、-Zに関するその他のすべての規則に従いますが、その範囲に先に配置されたコンテンツを無視する点だけが異なります。このセグメントは、指定した順序でRAM_OVERLAY_STARTから始まるアドレスに配置されます。
次に、同じアドレスに次のオーバーレイを配置します。
-Z@(DATA)CODE_B,CONST_B,DATA_B=RAM_OVERLAY_START-RAM_OVERLAY_END
このコマンドによって、指定した*_B-segmentsが、*_A segmentsで使用されたのと同じアドレスに配置されます。これにより意図的にオーバーラップが作成され、複数のRAMセグメントが同じアドレスに配置されます。
IAR XLINKリンカは、セグメントのオーバーラップを検出してエラーを出力します。オーバーラップに関するエラーは、オフにするか、警告に変えることができます。しかし、このエラーをオフにすると、本当のオーバーラップも無視されてしまうという問題が生じます。また、エラーを警告に変えると、プログラムをリンクするたびに警告がいくつも発生してしまいます。リンカオプション--disable_overlap_checkが用意されています。このオプションを使用すると、指定したセグメントオーバーレイのオーバーラップエラーをオフにできます。
このオプションを以下のように使用すると、指定したセグメント間のオーバーラップエラーをオフにできます。
--disable_overlap_check=CODE_A,CONST_A,DATA_A,CODE_B,CONST_B,DATA_B
これにより、指定したセグメント間のオーバーラップエラーをオフにできますが、このエラーがオフになるのは、あくまでここで指定したセグメント間でオーバーラップしている場合に限ります。CODE_Aおよびここで指定されていないセグメント(他の--disable_overlap_check optionで指定されてる場合も含む)とのオーバーラップは依然として報告されます。
4.イニシャライザセグメントをROMに配置する
テクニカルノート80460を参照してください。
-Z(CONST)CODE_A_ID,CONST_A_ID=ROMSTART-ROMEND
-Z(CONST)CODE_B_ID,CONST_B_ID=ROMSTART-ROMEND
5.セグメントのイニシャライザセグメントから対象セグメントに値をコピーします。
テクニカルノート80460を参照してください。
6.オーバーレイされたセグメントの参照関係をチェックする
オーバーレイされたRAMCODEセグメントの場合、単一のRAMCODEセグメントの場合と比べて状況が非常に複雑となります。以下に、最も重要なポイントを挙げます。
- オーバーレイされたセグメント同士は同時には使用できません。また、各セグメントへの参照は、参照先のセグメントが「アクティブ」である場合に限り行うことができます。これらについては、すべてユーザが対処する必要があります。コンパイラやリンカはそのような状況を検出できません。アクティブでないセグメントを参照すると、予期せぬ動作を引き起こします。
- オーバーレイされたセグメント同士は同時にアクティブにはならないため、オーバーレイされたあるセグメントからオーバーレイされた他のセグメントのコンテンツを参照することはできません。現在、コンパイルもリンカもそのような参照を検出することはできません。2つのRAMCODEセグメントが同時にアクティブになるようなオーバーレイを作成することはできません(例えば、あるセグメントが0x2000~0x23FFにあり、もう一つのセグメントが0x2400~0x2FFFにあるとき、別のセグメントによって0x2000~0x2FFFが使用される場合、この2つのセグメントは相互にオーバーレイできません)。ただし、そのような状況はすべてプログラマが対処する必要があります。
- RAMの一部がデバッグ情報で埋められるため(同じアドレスにオーバーレイされたすべてのセグメントのデバッグ情報で埋められるため)、RAMエリアのデバッグ情報の品質は通常より低くなります。デバッガは正常な判断ができなくなり、正しく機能しているように見えたとしても使い物にならない可能性があります。コードは期待どおりに動作しますが、アセンブラレベルでデバッグするのでない限りデバッグは難しくなります。
- 各「ロードユニット」が別々のファイルに格納されるようにコードが構成されている場合、デバッグ情報なしでモジュールをコンパイルできます。デバッグしたいロードユニットが格納されているモジュールにのみデバッグ情報が含まれている場合は、デバッガを使用してより効率よくデバッグを行うことができます。
- 十分なRAM空間がある場合、デバッグしたいロードユニットをオリジナルのメモリ空間に置くことができます。この場合、正しいデバッグ情報が得られます。
全ての製品名は、それぞれの所有者の商標または登録商標です。