オーバレイとマニュアル初期化のサンプル

テクニカル・ノート 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に配置した場合(オーバレイ方式を使用する場合など)、このチェックを行うことはできません。

全ての製品名は、それぞれの所有者の商標または登録商標です。

申し訳ございませんが、弊社サイトではInternet Explorerをサポートしていません。サイトをより快適にご利用いただくために、Chrome、Edge、Firefoxなどの最新ブラウザをお使いいただきますようお願いいたします。