多くの組み込みシステムでは、アプリケーションのためのコードやデータを起動時に実行できるようにROMやFlashといった不揮発性メモリに恒久的に保持させます。
一般的には上記の形をとりますが、コードやデータの一部(例えば 割り込みハンドラ、グローバル変数)をアプリケーションを正しく実行させるために、不揮発性メモリから揮発性のRAMへコピーする必要がある場合があります。 ADSやそれ以降のツールでは、リンカのscatter-loading機能を使ってこの動作を実現します。
scatter-loadingは、アプリケーションを複数のコードやデータのリージョンとしてアドレスマップ上に配置することができます。 これらのリージョンは、ロード時とランタイムで異なった配置を行うことができます:
- ロードリージョンは起動直後のロード時にアプリケーションによって使用される アプリケーションコードと、データ(必要に応じて)を含みます。 (一般的にはROMに配置されます)
- 実行リージョンはアプリケーションの実行中に使用されます。
scatter-loadingを用いるアプリケーションで使用されるメモリマップはarmlinkにパラメータとして渡されるscatter定義ファイルで記述します。 scatter定義ファイルの利点は、デバイスのためのアドレスは全て(ターゲット固有の)絶対アドレスで定義され、コードおよびデータは1ファイルで配置が行われるため、管理が容易である点です。 メモリマップの変更が必要な場合(例えば ペリフェラルの移動)は、既存のプロジェクトを完全にリビルドする必要はなく、既存のオブジェクトを再リンクするだけでかまいません。
scatter定義ファイル中では、ロードリージョンは一番外側の中括弧によって表わされ、複数の実行リージョン(内側の中括弧で定義)を含みます。 実行リージョンは、ルートリージョン(ロード時と同じアドレスで実行)または、ノンルートリージョン(ランタイムにコピーが行われる)として定義することができます。
以下に典型的な例を示します:
LOAD_FLASH 0x04000000 0x80000 ; start address and length { EXE_FLASH 0x04000000 0x80000 { init.o (Init, +First) ; Put this area first in region * (+RO) ; wildcard to collect all other RO } 32bitRAM 0x0000 0x2000 { vectors.o (Vect, +First) ; Put this area first in region int_handler.o (+RO) } 16bitRAM 0x2000 0x80000 { * (+RW,+ZI) ; wildcard to collect RW & ZI } }
この定義は、1つのロードリージョン(LOAD_FLASH)と3つの実行リージョン(EXEC_FLASH, 32bitRAM, 16bitRAM)からなります:
- 例外ベクタ(vectors.s)と例外ハンドラ(int_handler.c)は、アドレス0の32bit RAMに再配置されます(速度の為)
- RW変数は、Flashからアドレス0x2000の16bit RAMにコピーされます
- ZIデータは、16bit RAM中のRWデータの直後に配置されます
- その他のコード(init、メインプログラム、ライブラリ等)はFlashから直接実行されるため再配置の必要がありません
scatterファイルで定義したオブジェクトの順番は、出力イメージ内に配置される順番に影響しないことに注意してください。 それぞれのリージョン内で、リンカは同じ属性(RO、RWあるいはZI)を持つ入力セクションをまとめます。 リージョン内のセクションの基本配置ルールは、RO > RW > ZI となります
上記の配置ルールを元に、さらに以下の順にセクションが配置されます:
- 属性(例えば RO-Code before RO-Data)順
- 名前順
- armlinkのコマンドラインで指定された順
セクションは、+FIRSTおよび+LASTのキーワードを用いて実行リージョン内の先頭または末尾に配置することができます(ただし、上記の配置の基本ルールを破らない範囲で)。 これは、たとえばチェックサムをリージョンの末尾に配置したい場合などに役立ちます。
システムがROM/RAMのリマップを行う場合(すなわち リセット時はROMが0番地にエイリアスされており、通常の実行時はRAMが0番地に存在する場合)、記述ファイルにはリマップ後のメモリマップを記述しておく必要があることに注意してください。
scatter-loadingのさらなる詳細については、以下を参照してください。
- 使用するツールチェーンの、Linker and Utilities GuideおよびDeveloper Guide
http://www.arm.com/documentation/Software_Development_Tools/index.html - アプリケーションノート 107: "Embedded SW Development"
https://developer.arm.com/documentation/dai0107/a/
*ARM社より提供されている上記Application Noteは、ADS v1.2向けに記述されておりますが、RVCT でも利用することができます。
日本語版マニュアルおよび、アプリケーションノートについては、 日本語で書かれたマニュアルを入手できますか をご参照下さい。