0

I would like to define to the struct

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_;

One solution would be this

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

In this case I can reach the register as follow:

GPIO_REGS->GPSET[0];

But how should I define the GPIO_REGS variable that I can use as follow

GPIO_REGS.GPSET[0];

Why the following won't work?

#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];

看到分号不适合这里吗?

保持宏小。不要放在;最后。并且总是在它们周围加上括号。括号应该是最外面的东西 - 不要在末尾放分号。(我们可以整天写其他关于宏的警告。

于 2013-11-14T21:33:26.777 回答