9

ARM Cortex-R4をプログラミングしていますが、パフォーマンスの向上が十分かどうかを確認するために、TCRAMから実行したいバイナリファイルがいくつかあります。

バイナリをRAMにコピーする関数を作成する必要があることはわかっています(これは、リンカースクリプトを使用して実行でき、バイナリのサイズを知ることができます)。しかし、彼らはどのように走りますか?

これを想像してみてください。最初のバイナリには、func1()、func2()、func3()、およびfunc4()があります。モジュール全体をTCRAMにコピーし、そこで関数を呼び出すにはどうすればよいですか?その特定の関数への関数ポインターを使用する必要がありますか?そして、func4()がfunc2()とfunc3()を呼び出す場合はどうなりますか?私が間違っていなければ、彼らはフラッシュにあるコードの一部を指しているでしょう。それは私がそれらの機能を書き直さなければならないことを意味しますか?完全に関数ポインタを使用しますか?リンカスクリプトだけでこれらすべてを実行できると言われ、何も心配する必要はありませんが、それがどのように機能するかはまだわかりません。

4

3 に答える 3

11

GCCの場合:関数を.dataセクションに配置するだけです。

__attribute__( ( section(".data") ) )

スタートアップコードによって、初期化された残りの変数とともにコピーされます(リンカーsciptをいじる必要はありません)。関数がRAMに配置された後、コードの残りの部分から「遠く」離れてしまう場合にも、「long_call」オプションが必要になる場合があります。

__attribute__( ( long_call, section(".data") ) )

例:

__attribute__( ( long_call, section(".data") ) ) void ram_foobar (void) { ... }

安全に無視できるコンパイラ警告が表示される場合があります。

Warning: ignoring changed section attributes for .data
于 2014-08-28T19:59:31.953 に答える
6

2つのオプションがあります。

  1. あなたが提案するようにそれらをコピーし、でコンパイルしpc relativeます。
  2. ロード/実行アドレスが異なるリンカーファイルを使用してください。

単純なコピーは、ルーチンが絶対アドレスを使用しない場合にのみ機能します。標準のRAMにコピーを残そうとしているので、絶対アドレスを使用しても問題ないかもしれません。ただし、これではのメリットを十分に享受できない場合がありTCMます。

LOADリンカスクリプトを使用すると、別の場所を指定できますRUN

sections {
 .text { *(.text); } >FLASH
 .tcm {
       *(.tcm);
  } >TCM_MEM AT>FLASH
  .data { *(.data); } > RAM
  .bss : NOLOAD { *(.bss); } > RAM
}

特に注意してくださいAT>FLASH

参照:gnuリンカーマップファイル...およびstackoverflowに関するその他の多く。Gnu Ldのマニュアルには、LMAセクション(LOADアドレ​​ス)に関する情報があります。あなたLMAフラッシュになりますが、VMARUNアドレス)はTCMになります。上記の手動リンクには、コピー方法も示されています。、、、およびはRAM、ボードのアドレスに応じて、ldMEMORY情報で定義されます。これらはすべてファイルに記録されます。必ずファイルを生成し、アドレスを調べてスクリプトを再確認してください。FLASHTCM_MEMMAPMAPld

2番目のケースもコピーが必要です(起動時または少なくとも最初のTCM関数の使用前)。ただし、コンパイラは絶対アドレスを使用でき、それらはTCMメモリ内にあります。また、メイン内の任意の関数が関数を直接DRAM呼び出すことができます。TCM最初のケースでは、関数ポインタを使用してTCMコードを呼び出す必要があります。グローバル変数をこのメモリに配置する場合は、属性を使用してそれらを別のセクションに配置し、gnuldを使用し適切に配置できます。ITCMあると思いますDTCMか?したがって、これは当てはまらないか、2つのセクションが必要な場合があります。

リンカスクリプトはより一般的であり、複雑な機能をに配置すると最適に機能しますTCM。、などを使用し-fpicてコピーするだけで、特に関数が1つしかない場合は、すぐに機能する可能性がありpureます。

于 2013-02-28T17:51:13.143 に答える
3

最近(当時も?)、マクロを使用するか__RAM_FUNC__RAMFUNC_EXT(bank, name)または__RAMFUNC(bank)

于 2018-08-20T06:09:56.807 に答える