特別なタイプのフラッシュ メモリを搭載した Cortex M3 パーツがあります。パーツはこの FLASH で起動しますが、FLASH の速度を最適化する機能を実行する必要があります。これを行う唯一の方法は、RAM にジャンプしてそこでこれらの機能を実行することです (最適化中の FLASH で実行すると機能がクラッシュするため)。
ARM ではスキャッタ ローディングが可能です。これは、関数をRAMに配置して、メインに到達したら実行できるためのソリューションです。しかし、最適化されていない FLASH ですべてのスキャッター ロードを実行したくはありません。そのため、メインの前に関数を実行したいと思います。つまり、リセット ハンドラーから、または SystemInit (リセット ハンドラーから呼び出される) から実行します。
ROMに配置されているいくつかのアセンブリ関数を作成しました。起動時に、作成した Relocate 関数を呼び出します。これにより、他の関数が RAM にコピーされ、それらにジャンプします。これは機能しています。
私の質問は次のとおりです。
- これはクレイジーに聞こえますか?これを達成する簡単な方法はありますか (スキャッターロードを待たずに)?
.s ファイルには、再配置する関数があります。これらの再配置された関数を使用するには、PROC ラベルをロードしてから、(FLASH - RAM) のオフセットを減算します。これは移植性を感じません。再配置された関数の正しい PROC アドレスを計算する別の方法はありますか? 例えば:
foo PROC ... ... ENDP
foo は ROM の 0x24000000 から始まり、RAM の 0x8000 に移動する必要があります。ROMに保存する必要があるにもかかわらず、fooが0x8000にあると宣言する方法はありますか? または、foo_reloc が 0x8000 にあると宣言する方法はありますか? foo は 0x24000001 で開始し、0x8001 で呼び出す必要があるため、これは THUMB コードにも適用されます。
ありがとう、ナチュム