0

リンカー スクリプト ファイルを memory.ld として作成しました –</p>

MEMORY
{
        MYMEMORY(rw)   : ORIGIN = 0x0041c620 ,  LENGTH = 30
}

.myvars (NOLOAD) :
{
  *(.myvarloc)

} > MYMEMORY


In my c program :
__attribute__((section(".myvarloc")))
   uint8 measurements[30];

Linux rtos で Eclipse IDE を使用しています。プロジェクトに –T memory.ld を追加しました – プロパティ – リンカー – ライブラリ – eclipse のその他 これを作成する理由: 0x0041c620 から始まるサイズ 30 の変数測定用の固定メモリ アドレスが必要です。

私の質問:これは正しい方法ですか?? 上記のようにすると、エラーが発生します–リンカー入力ファイルが使用されておらず、リンクが完了していません。

注:質問を再投稿しています。

4

2 に答える 2

0

プログラムが非常に単純でない限り、リンカー スクリプトには、自分のプログラムよりもはるかに多くの内容を含める必要がある可能性があります。通常、.text (コード、通常は読み取り専用)、.data (r/w、初期化済み)、.bss (r/w、ゼロで埋められた) に加えて、ツールチェーンが生成するものと RTOS に応じて、いくつかのファイルがあります。 ' ランタイムが期待します。

要するに、ゼロからの開始は、自分が何をしているのかを既に知っている場合、またはプロジェクトが本当に単純な場合にのみ機能するということです。

あなたの場合、リンカーがデフォルトで使用するリンカースクリプトから始めて、必要な部分だけを調整します。

gcc-for-your-platform some-file.c -Wl,-verboseまたはを実行すると、デフォルトのリンカー スクリプトを取得できますld-for-your-platform -verbose

于 2014-02-13T01:43:57.047 に答える
0

これは、Eclipse がリンカーを直接呼び出さないためと考えられます。代わりにgcc(またはg++) をラッパーとして使用し、ラッパーはデフォルトのリンカー スクリプトでリンカーを呼び出します。

メモリが固定されている特定のターゲット用にクロスコンパイルする場合、リンカーを直接呼び出す独自の makefile を作成することをお勧めします。

クロスコンパイルではなく、たとえば Windows や Linux 用にビルドしている場合は、実行していることを実行しないでください。リンカースクリプトにある仮想アドレスが実際に利用できるかどうかはわかりません。また、プロセス間でメモリを共有するために使用することはできません。あるプロセスの仮想アドレスは、実際には別のプロセスの同じ仮想アドレスと同じではない可能性があるためです (両方のプロセスが同じ実行可能ファイルから作成された場合でも)。代わりに、共有メモリまたはその他のプロセス間通信方法について読んでください。

于 2014-02-05T08:37:34.030 に答える