アプリケーション全体を RAMへダウンロードし動作させる ( Cortex-M3)
テクニカル・ノート 73964
アーキテクチャ:
ARM
コンポーネント:
general
更新日:
2018/01/25 8:20
はじめに
アプリケーション全体をRAM で動かす必要がある場合
制限
この提案は、C-SPYデバッガでダウンロードする場合のみ機能します。
スタンドアロンでRAM 実行したい場合は、Technical Note 11578を参照してください。
背景:
以下は、アプリケーション全体をRAMに配置し、RAM上で期待通り動作させるために必要なステップです。
- データ(リード/ライトと定数)とリンクされたコードをRAMに配置します。
- ベクタテーブルをRAMに配置します。(少なくともCortex-Mデザインによって強制されるアライメントで)
- Cスタートアップ時にVTOR をベクターテーブルの先頭にセットします。
推奨のソリューション:
問題を解決するにはいくつかの方法があります(これらの提案は一例です)。
CODEとDATAをRAMに配置
- プロジェクト > オプション > リンカ > 設定 で "編集"ボタンをクリックすると "リンカ設定ファイルエディタ"ウィンドウが開きます。
- "memory regions" タブを選択- RAM/start の値をコピーして、この値をROM/start にペーストします。 - 次に RAM/end の値をコピーし、ROM/end にペーストします。
CODE、DATA、ベクタが RAM に配置されているかを確認
プロジェクトをビルドします。
- ベクタテーブル (シンボル名 __vector_table )が RAM 内の 2^7にアラインされたアドレスに配置されていることを(.map ファイル内で) 確認してください。
- 変更の必要があれば プロジェクト > オプション > リンカ > 設定 > 編集で "Vector table" タブを開いてください。
- RAM 内の 2^7 にアラインされたアドレス(推奨は0x20000000番地)に変更します。
VTOR を RAM に設定
VTOR ("Vector Table Offset Register") をRAM内のvector table(シンボル名__vector_table)を示すように変更します。
- \arm\src\lib\low_level_init.c をコピーして、プロジェクトに追加します。(ファイルが書き込み禁止になっている場合は書き込み禁止を解除してください。
- 使用するデバイスの#include文を追加します。 (レジスタVTORの定義を取得します。)
- ベクタテーブルの宣言 extern int __vector_table[]; を追加します。
- __low_level_init 関数内で VTORに__vector_tableのアドレスをセットします。 次のように記述します
VTOR = (unsigned int) & __vector_table;
テスト
- プロジェクトをビルドします。
- シミュレータにダウンロードしてください。 VTOR がRAM上のベクタテーブルのアドレスに設定されていることを確認してください。
- シミュレータからハードデバッガに変更してください。
- RAM にダウンロードし、アプリケーションを実行してください。
サンプルプロジェクト
以下リンクにSTM32F103ZE用のサンプルプロジェクトがあります。
全ての製品名は、それぞれの所有者の商標または登録商標です