3

リンカーに変数の一部をメモリ内の特定の場所に配置させるにはどうすればよいですか。たとえば、0x8100000に整数名を割り当てたいとします。理解を見逃していなければ、次を使用できます。

int name __attribute__ ((section ("name_of_section")));

次に、リンカー スクリプトで次のように指定します。

 SECTIONS
 {
   ...
   . = 0x8100000;
   .data : { name_of_section }
   ...
 }

uCポートをマップするために似たようなものを使いたいです。しかし、何かが一致せず、どこを間違えたのかわかりません。(私はリンカー スクリプトを使用したことがないので、非常にばかげたことを書いていたら申し訳ありません)。

4

3 に答える 3

3

通常、これはリンカー スクリプトなしで実行されます。

int volatile * const portA = 0x8100000;  //portA is a constant pointer to a volatile int
...

*portA = 53;  //write value 53 to output port

リンカー スクリプトを使用する必要がある場合は、コンパイラやチップ固有のものになります。使用しているチップとツールチェーンを教えてください。

于 2012-01-06T13:09:17.500 に答える
2

アドバイスありがとうございます!今それは働いています。.ldファイル:

SECTIONS
{
...
   .data: {
   ...
   }
   ...
   var_name = 0x40010CA0;
}

.cファイル:

extern volatile int var_name;

上でリンクしたドキュメント(入力セクションの例)を調べた後、次のようなものも試しました:.ldファイル:

.hrd_map 0x40010CA0 : 
{       
    main.o(.b_section)  
}

ここで、.b_sectionは属性を持つグローバル変数でした:

int b __attribute__((section(".b_section")));

しかし、それは機能しません、私はこの種のエラーを受け取りました:`main'の複数の定義。これは、以前の.ldファイルに次のような他の割り当てがあるためだと思います:.data:{...}.bss.text。たぶん誰かがこれを修正する方法、またはセクション属性を使用せずにいくつかの変数に到達する方法を知っています。main.oファイルで変数のシンボルを検索しようとしましたが、セクション属性とその他(デフォルトで作成された?).data .bssを使用して作成した.b_sectionを除いて、変数のシンボル名のようなものは表示されませんでした。テキストなど。

@ダンあなたは正しいです私は学習のためにこれをやっています、そして私はあなたに同意します。しかし一方で、すべてのチップには.ldとスタートアップファイルが必要であり、ポートの定義もライブラリに含まれているため、このコードは非常に移植性が高いと思います。

于 2012-01-06T22:29:34.980 に答える