2

MBD9F126(ARM Cortex R4)マイクロコントローラーを使用しています。その中で私はコードをROMにフラッシュし、RAMのコピー後にRAMからコードを実行しています。Greenhillsコンパイラを使用しています。RAMコピーの前に、基本的なボード初期化コードを実行しています。

    LDR r12, ADDRESS_START_PREINIT
    BLX r12
    ADDRESS_START_PREINIT:DCD Start_PreInit

Start_PreInitはボード初期化関数です。BLXの後にこのように指定すると、RAMの場所に分岐します。RAMのコピーはまだ行われていないため、不明な領域に移動します。

これの代わりに私が書いているなら

    bl Start_PreInit

コードのROMの場所に行くことは正しく動作しています。なぜコンパイラがそのような振る舞いをするのですか?
また、ADDRESS_START_PREINIT:DCDStart_PreInit。リンク中に行われますか?

4

1 に答える 1

2

分岐ターゲットが現在の( )bl Start_PreInitに対するオフセットとして命令オペコードにエンコードされているため、命令は機能します。はROMを指しているため、ターゲットは別のROMアドレスです。PCr15r15

命令はblx r12、レジスタにロードされた絶対アドレスに分岐しr12ます。

の内容をレジスタにロードするとADDRESS_START_PREINIT、取得するのは、リンカがそのアドレスに対して計算した絶対アドレスですStart_PreInit。どうやらリンカはそれをRAMの絶対アドレスに固定しているようです。

リンカ構成の問題を修正したり、分岐前にr12RAMアドレス(のような)がロードされたときに何らかの変換を実行したりすることで、問題を解決できる場合があります。(r12 - RAM_START) + ROM_STARTまたは、ターゲットアドレスが範囲内にある場合は、分岐命令にレジスタ絶対エンコーディングの代わりにpc相対エンコーディングを使用します。

于 2012-09-05T06:47:10.467 に答える