カスタマーサポートセンター

FAQ~よくある質問~ | FAQマスタ詳細表示

FAQ詳細情報

ID 10810685
FAQカテゴリ(大) その他
最終更新日 2016-01-17

質問内容

TN27158: 立ち上げ時、割り込みベクタ (ARM7コア) をフラッシュから RAM にコピーする(v.5.30+)

回答内容

EWのターゲット : ARM
EWのコンポーネント : 一般
キーワード :  .icf ファイル、CSTARTUP、flash、RAM
更新日 :March 26, 2014


期待されるふるまい
立ち上げ時、アプリケーションは割り込みベクタをフラッシュからRAMにコピーする。


注意
シミュレータを使用します。
サンプルプロジェクトはシミュレータ用にビルド、デバッグします。このテクニカルノートでは、立ち上げ時のコピーのメカニズムにフォーカスするために、シミュレータを使用します。

シミュレートされたマイコンボードのメモリマップを仮定します。

ボードには ...
フラッシュ 0x1000000 ~ 0x100FFFF

と、
RAM 0x2000000 ~ 0x2007FFF


立ち上げ時、フラッシュは
0x0000000 ~ 0x000FFFF
にミラーされ、

リマップ後、RAMは
0x0000000 ~ 0x0007FFF
にミラーされます。

リマップ (サンプルではカバーされません)
リマップは、ARMデバイスにより別の方法で行われるため、ここではカバーされません。
理論的な仮定 (このテクニカルノートとサンプルプロジェクト) は、 __low_level_init() で行われることです。つまり、初期化が行われる前です。

解決策
特別な解決策の理由

ILINKは通常,ベクターテーブルの初期化のコードを置くことはしません。
しかし、ILINKにベクターテーブルをコピーしても良いことを伝えることは可能です。


.s ファイルへの追加
以下のやるべきことを追加します。
• 2番目の、すなわちRAMにコピーされるベクターテーブルを追加します。 (サンプルプロジェクトでは、テーブルはフラッシュにある、ベクターテーブルを編集したコピーにすぎません)
• このベクターテーブルを、これ自身のセクションに配置します。 (このサンプルでは、このセクションの名前は .intvec_RAM です)
• 自身のラベルを持つベクター追加します (このサンプルでは、ラベルは __vector_RAM)
• ベクターテーブルのラベルの上の行に、特別なラベル __iar_init$$done: を追加します。(このラベルは ILINK に、このベクターテーブルを立ち上げ時にコピーして良いことを知らせます。)


.icf ファイルへの追加
.icf ファイルの変更点は、


define symbol _region_COPY_start__   = 0x00;
define symbol _region_COPY_end__     = 0x7F;
define region COPY_region   = mem:[from _region_COPY_start__   to _region_COPY_end__];


initialize by copy { section .intvec_RAM };
define block RamCode { section .intvec_RAM };
define block RamCodeInit { section .intvec_RAM_init };
place in ROM_region { block RamCodeInit };
place in COPY_region { block RamCode };


ここで、詳細は、
• 以下の行 …
define symbol _region_COPY_start__   = 0x00;
define symbol _region_COPY_end__     = 0x7F;
define region COPY_region   = mem:[from _region_COPY_start__   to _region_COPY_end__];
… は、コピー先の領域を定義します。

• 以下の行 …
initialize by copy { section .intvec_RAM };
… ILINK に、このセクションは初期化されることを知らせます。

• 以下の行 ...
define block RamCodeInit { section .intvec_RAM_init };
... の一部 (ここが興味深い) に、セクション .intvec_RAM_init があり、 ILINK に、文字列の最後に _init があることで、このブロックが .intvec_RAM のコピーを持っていることを知らせています。

• .icf ファイルの最後の修正は、 ILINK が、どのような通常データ/コードでも、最下位 0x80 バイトの RAM とフラッシュメモリーに配置しないよう修正します。これは RAM にある割り込みベクターに上書きしないためです。これで、スタートアドレスは、以下の位置に調整されます。
define symbol __ICFEDIT_region_ROM_start__   = 0x1000080;
define symbol __ICFEDIT_region_RAM_start__   = 0x2000080;


サンプルプロジェクトを使う

ビルドする
EWARM のエディタタブを閉じてプロジェクトをリビルドします。

デバッグする
C-SPYを起動すると、アプリケーションは、ラベル __iar_program_start で停止します。0x00番地とそれ以降は全て 0 であることをメモリウィンドウで確認できるようになっています。

実行する
アプリケーションは、main() で停止し、そこにはブレークポイントがあります。これで、0x00番地以降にコピーされたベクタテーブルがあることがメモリウィンドウからわかります。

参考資料URL