3

特別なタイプのフラッシュ メモリを搭載した Cortex M3 パーツがあります。パーツはこの FLASH で起動しますが、FLASH の速度を最適化する機能を実行する必要があります。これを行う唯一の方法は、RAM にジャンプしてそこでこれらの機能を実行することです (最適化中の FLASH で実行すると機能がクラッシュするため)。

ARM ではスキャッタ ローディングが可能です。これは、関数をRAMに配置して、メインに到達したら実行できるためのソリューションです。しかし、最適化されていない FLASH ですべてのスキャッター ロードを実行したくはありません。そのため、メインの前に関数を実行したいと思います。つまり、リセット ハンドラーから、または SystemInit (リセット ハンドラーから呼び出される) から実行します。

ROMに配置されているいくつかのアセンブリ関数を作成しました。起動時に、作成した Relocate 関数を呼び出します。これにより、他の関数が RAM にコピーされ、それらにジャンプします。これは機能しています。

私の質問は次のとおりです。

  1. これはクレイジーに聞こえますか?これを達成する簡単な方法はありますか (スキャッターロードを待たずに)?
  2. .s ファイルには、再配置する関数があります。これらの再配置された関数を使用するには、PROC ラベルをロードしてから、(FLASH - RAM) のオフセットを減算します。これは移植性を感じません。再配置された関数の正しい PROC アドレスを計算する別の方法はありますか? 例えば:

    foo     PROC
            ...
            ...
            ENDP
    

foo は ROM の 0x24000000 から始まり、RAM の 0x8000 に移動する必要があります。ROMに保存する必要があるにもかかわらず、fooが0x8000にあると宣言する方法はありますか? または、foo_reloc が 0x8000 にあると宣言する方法はありますか? foo は 0x24000001 で開始し、0x8001 で呼び出す必要があるため、これは THUMB コードにも適用されます。

ありがとう、ナチュム

4

1 に答える 1

5
  1. いいえ、クレイジーではありません。
  2. 再配置について心配する必要はありません。リンカーがすべてを処理してくれるはずです。

フラッシュ構成関数をスキャッタ ファイルの別の実行領域に配置します。次に、スキャッタ ロード コードを変更して、最初にフラッシュ構成関数の実行領域をセットアップし、それを呼び出してから、他の領域のスキャッタ ロードを続行するだけです。

次のようなスキャッタ ファイルを使用します。

LR 0x0
{
    ROM 0x0
    {
      * (+RO)
      * (+RW,+ZI)
    }

    RAM 0x18000 0x8000
    {
        foo.o (*)
    }
}

次に、次のようなもので始まる画像を取得する必要があります。

$a
!!!main
__main
    0x00000000:    eb000000    ....    BL       __scatterload ; 0x8
    0x00000004:    eb000028    (...    BL       __rt_entry ; 0xac

「Image$$RAM$$Base」などの「魔法の」リンカ シンボルを使用して独自のスキャッタローダを記述し、手動で RO、RW、および ZI のロードを実行できます (リンカ コマンド ラインで独自の「エントリ」シンボルを設定するだけです)。デフォルトのスキャッターローダーをバイパスするには)、__rt_entry を呼び出します。

Keil ツールは実際には ARM ツールであるため、詳細についてはこちらを参照してください。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0101a/armlink_chdcgbjd.htm

于 2012-11-22T00:19:08.870 に答える