RealView ARM C コンパイラは、 variable 属性を使用して、特定のメモリ アドレスに変数を配置することをサポートat(address)
しています。
int var __attribute__((at(0x40001000)));
var = 4; // changes the memory located at 0x40001000
GCC には同様の変数属性がありますか?
わかりませんが、次のような回避策を簡単に作成できます。
int *var = (int*)0x40001000;
*var = 4;
まったく同じというわけではありませんが、ほとんどの場合、完璧な代替品です。GCCだけでなく、どのコンパイラでも動作します。
GCC を使用している場合は、GNU ldも使用していると思います(もちろん、確実ではありません)。ld は、必要な場所に変数を配置することをサポートしています。
リンカーにその仕事をさせるのはかなり一般的だと思います。
@ribの回答に触発されて、絶対アドレスが何らかの制御レジスタ用である場合はvolatile
、ポインター定義に追加することを追加します。RAMだけなら問題ありません。
あなたはあなたの質問に答えました、それの上のあなたのリンクでそれは述べます:
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
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]);