0

構造体に定義したい

typedef struct
{
    unsigned long GPFSEL[6];
    unsigned long Reserved_1;
    unsigned long GPSET[2];
    unsigned long Reserved_2;

//Ignoring the reserved and test bytes
} GPIO_REGS_;

1つの解決策はこれです

volatile  GPIO_REGS_ * const GPIO_REGS  = ((volatile GPIO_REGS_ *) 0x20200000UL);

この場合、次のようにレジスタにアクセスできます。

GPIO_REGS->GPSET[0];

しかし、次のように使用できる GPIO_REGS 変数をどのように定義すればよいですか?

GPIO_REGS.GPSET[0];

以下が機能しないのはなぜですか?

#define GPIO_REGS  (*(( GPIO_REGS_ *) 0x20200000UL));
4

2 に答える 2

1
GPIO_REGS_ my_gpio_reg;

GPIO_REGS_ * my_gpio_reg_ptr;

my_gpio_reg_ptr = &my_gpio_reg;
于 2013-11-14T20:05:54.603 に答える
1

あなたの質問のコードの問題

#define GPIO_REGS  (*(( GPIO_REGS_ *) 0x20200000UL));

末尾のセミコロンです。あなたはそれを削除する必要があります

#define GPIO_REGS  (*(( GPIO_REGS_ *) 0x20200000UL))

(ここでの本当の教訓は、何としてもマクロを避けることです。マクロは非常に扱いにくいものです。マクロを理解していると思うたびに、間違った安心感を得て、さらにバグのあるコードが書かれます!)

とにかく、マクロの元の使用法では:

GPIO_REGS.GPSET[0];

次のように展開されました。

(*(( GPIO_REGS_ *) 0x20200000UL));.GPSET[0];

セミコロンがここに収まらないことがわかりますか?

マクロは小さくしてください。;最後につけないでください。そして、常にそれらの周りにブラケットを置きます。ブラケットは最も外側に配置する必要があります。最後にセミコロンを付けないでください。(マクロに関する他の警告を 1 日中書くことができます。

于 2013-11-14T21:33:26.777 に答える