我想定义结构
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_;
一个解决方案就是这个
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));
答案 0 :(得分:1)
GPIO_REGS_ my_gpio_reg;
GPIO_REGS_ * my_gpio_reg_ptr;
my_gpio_reg_ptr = &my_gpio_reg;
答案 1 :(得分:1)
问题中代码的问题
#define GPIO_REGS (*(( GPIO_REGS_ *) 0x20200000UL));
结尾是分号。你应该删除它
#define GPIO_REGS (*(( GPIO_REGS_ *) 0x20200000UL))
(这里真正的教训是不惜一切代价避免使用宏。它们非常棘手。每当你认为你理解它们时,你就会得到一种虚假的安全感,然后会写出更多错误的代码!)
无论如何,原来使用宏:
GPIO_REGS.GPSET[0];
它被扩展为:
(*(( GPIO_REGS_ *) 0x20200000UL));.GPSET[0];
看到分号不适合这里?
保持宏小。不要将;
放在最后。并且总是在它们周围加上括号。括号应该是最外层的 - 不要在末尾加上分号。 (我们可以整天写关于宏的其他警告。