6

小さな ARM (実際には Cortex) ターゲットである LPC1114 用にコンパイルします。RAM は ROM よりもはるかに制限されています。最新の Mentor (CodeBenchLite) GCC コンパイラ (GCC 4.6.3) を使用しています。ROMに入れたい定数オブジェクトがいくつかあります。私が理解している限り、以下のコードの ffx オブジェクトは ROM (コード) になるはずですが、代わりに DATA に配置されます。

class flop {
    public:
       int x;
       constexpr flop( int x ) : x(x){}
};

 extern constexpr flop ffx( 1 );

オブジェクトを事前に計算して ROM に配置するようにコンパイラを説得するにはどうすればよいですか?

または多分私は尋ねる必要があります:

  • どうにかして、G++ コンパイラが ffx の ROMable データを生成することを期待できますか?
  • もしそうなら、私のコードはこれに対して正しいですか
  • もしそうなら、これがサポートされている G++ バージョンはどれですか (私は 4.6 を使用していますが、おそらく 4.7 が必要ですか?)

=======================================

このバグジラ エントリc++/49673は、私の既知の問題であり、おそらく GCC 4.7 で修正されていることを示しているようです。残念ながら、私は Mentor/CodeSourcery ビルドを使用することを好みますが、これはまだ 4.6.3 です。そのため、当分の間、バグに悩まされていると思います。:(

4

2 に答える 2

1

アップデート#2:gcc4.7.0でのテスト結果

これは確かにgcc4.7.0で修正されています。コードは次のアセンブラ出力を生成します。

    .file   "constexpr.cpp"
    .globl  _ffx
    .section .rdata,"dr"
    .align 4
_ffx:
    .long   1

これはおそらくあなたが望むものです。アップグレードしますか?

これには、プラットフォーム固有のソリューションが必要だと思います。メモリ内のコードとデータの検索(スキャッターローディング)を参照してください。

スキャッタロードを使用すると、アプリケーションを、アドレスマップ全体に広がる多数の個別のコードおよびデータ領域に分割できます。これらの領域の場所は、ロード時間と実行時間で異なる場合があります。

  1. ロード領域には、電源投入時/ロード時にアプリケーションが使用するアプリケーションコードやデータ(通常はROM)が含まれます。

gccだけに頼るのではなく、armlink上記のリンクで提案されているように利用してみてください。

更新:あなたが指摘したgccのバグを見ました。LLVM/MinGWも同様に絶望的です。ただし、私はGCC 4.6で遊んでいますが、次のことが役立つと思います。

struct Data
{
    int i;    
};
constexpr Data getData() { return Data{1}; }

ctorを使用する代わりにconstexpr関数を使用して、アセンブラー出力を生成しようとすると、通常、出力は空になります(.dataセクションはありません)。そして、これを使用して、以下のように(グローバルスコープで)いくつかの変数を初期化する場合:

const Data foo = getData();

次のようにアセンブリを取得します。

    .file   "constexpr.cpp"
    .section .rdata,"dr"
    .align 4
__ZL3foo:
    .long   1

(これはg++ -std=c++0x -Sコマンドラインを使用します)。それはあなたのために働きますか?

于 2012-06-11T14:53:10.630 に答える
0

私の経験では、constデータは読み取り専用セクションに配置されるため、このセクションのすべてのデータを ROM に格納できます (またはフラッシュにプログラムできます)。

GCC リンカー命令ファイル (*.ld) は、異なるセクションにアドレスを割り当てることができます。

もう 1 つの方法は、大きなデータ構造 (フォントなど) をアセンブリ言語に配置することです。アセンブリ言語は、C または C++ 言語よりも簡単にデータをセグメントに配置できます。

次の目標の 1 つは、実行可能ファイルからデータを分離することです。これにより、実行可能ファイルが短くなり、実行可能ファイルのテスト時間が短縮されます。

于 2012-06-11T15:19:28.420 に答える