32

RealView ARM C コンパイラは、 variable 属性を使用して、特定のメモリ アドレスに変数を配置することをサポートat(address)しています。

int var __attribute__((at(0x40001000)));
var = 4;   // changes the memory located at 0x40001000

GCC には同様の変数属性がありますか?

4

7 に答える 7

26

わかりませんが、次のような回避策を簡単に作成できます。

int *var = (int*)0x40001000;
*var = 4;

まったく同じというわけではありませんが、ほとんどの場合、完璧な代替品です。GCCだけでなく、どのコンパイラでも動作します。

GCC を使用している場合は、GNU ldも使用していると思います(もちろん、確実ではありません)。ld は、必要な場所に変数を配置することをサポートしています

リンカーにその仕事をさせるのはかなり一般的だと思います。

@ribの回答に触発されて、絶対アドレスが何らかの制御レジスタ用である場合はvolatile、ポインター定義に追加することを追加します。RAMだけなら問題ありません。

于 2010-11-01T09:40:33.123 に答える
19

セクション属性と ldリンカ スクリプトを使用して、そのセクションに必要なアドレスを定義できます。これはおそらく代替案よりも厄介ですが、オプションです。

于 2010-11-02T19:54:05.227 に答える
11

あなたはあなたの質問に答えました、それの上のあなたのリンクでそれは述べます:

GNU GCCコンパイラでは、絶対メモリ位置にアクセスするためにポインタ定義のみを使用できます。例えば:

#define IOPIN0         (*((volatile unsigned long *) 0xE0028000))
IOPIN0 = 0x4;

ところでhttp://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Variable-Attributes.html#Variable%20Attributes

于 2010-11-01T09:52:57.607 に答える
4
    extern const uint8_t dev_serial[12];
    asm(".equ dev_serial, 0x1FFFF7E8");
/* or    asm("dev_serial = 0x1FFFF7E8"); */
    ...

    for (i = 0 ; i < sizeof(dev_serial); i++)
        printf((char *)"%02x ", dev_serial[i]);
于 2016-06-01T12:00:46.343 に答える