オーバレイとマニュアル初期化のサンプル
テクニカル・ノート 36546
アーキテクチャ:
ARM
コンポーネント:
linker
更新日:
2018/08/13 1:08
はじめに
『ARM用IAR C/C++開発ガイド』の「手動で初期化する」の章に記載されているオーバレイ機能は理解するのが難しいため、本テクニカルノートでは、簡単なサンプルを用いてこの機能について詳しく説明します。
例
Overlay example project.zipのリンクから、サンプルプロジェクトをダウンロードして開いてください。
説明:
ROMにある2つのセクション(MYOVERLAY1_initおよびMYOVERLAY2_init)のデータを使用して、test1()とtest2()の2つの関数が初期化されます。 ICFファイルには以下の内容が保存されています。
define overlay MyOverlay { section MYOVERLAY1 };
define overlay MyOverlay { section MYOVERLAY2 };
initialize manually { section MYOVERLAY1, section MYOVERLAY2 };
最初に、main関数によって、RAMにあるMyOverlayセクションがMYOVERLAY1_initのデータ(すなわちtest1()関数)で初期化されます(このとき、memcpyが使用されます)。次に、main関数によって、「MyOverlay」のアドレスにある関数が呼び出されます。すると、test1()関数によって1が返されます。
その後、main関数によって、RAMにあるMyOverlayセクションがMYOVERLAY2_initのデータ(すなわちtest2()関数)で初期化されます。次に、main関数によってtest2()関数が呼び出されます(これは、test1()関数が実行されるのと同じアドレスにあります)。すると、test2()関数によって2が返されます。
goverlay_test.mapというファイルを見ると、これら2つの関数が同じアドレスにリンクされているのが分かります。
上記の例は、オーバレイの基本について説明しています。このサンプルは、C-SPYシミュレータを使用して実行できます。
注意!
RAMからコードを実行する場合、ROMのデータと関数にアクセスしないよう注意してください。一方、__ramfuncキーワードを使用すると、すべてのアクセスが問題ないかチェックされ、以下の警告が表示されます。
"Warning[Ta022]: Possible rom access (romvar) from within a __ramfunc function".
関数を手動でRAMに配置した場合(オーバレイ方式を使用する場合など)、このチェックを行うことはできません。
全ての製品名は、それぞれの所有者の商標または登録商標です。