0

我有大量常量数据需要存储在头文件中。由于数据的性质(如何嵌套),我决定使用由预处理器初始化的结构。

我正在尝试像这样初始化这些结构:

typedef struct s_PWM {
  uint8_t muxmode;
  char *name;
  char *path;
} PWM;

typedef struct s_PIN {
  char *name;
  uint8_t gpio;
  char *mux;
  uint8_t eeprom;
  PWM *pwm;
} PIN;

这将允许我做类似的事情

PIN p1 = P8_19;

从某种意义上说,组装一个具有适当属性的结构。

基本上,您可以将引脚发送到函数中

pinMode(P8_19, OUTPUT)

这是有问题的行

#define P8_19 ((PIN){"EHRPWM2A", 22, "gpmc_ad8", 14, (PWM*){4, "EHRPWM2A", "ehrpwm.2:0"}})

这是警告

src/gpio.c:50:2: warning: excess elements in scalar initializer
src/gpio.c:50:2: warning: (near initialization for '(anonymous)')
src/gpio.c:50:2: warning: excess elements in scalar initializer
src/gpio.c:50:2: warning: (near initialization for '(anonymous)')

有谁知道为什么会这样?我是否错误地将 PWM* 结构嵌套到 PIN 结构中?

4

3 回答 3

0

简短的回答:是的。

您应该直接使用该结构,而不是使用指针:

typedef struct s_PIN {
  char *name;
  uint8_t gpio;
  char *mux;
  uint8_t eeprom;
  PWM pwm;  /* Notice: not a pointer */
} PIN;

此外,您不需要进行铸造:

#define P8_19 {"EHRPWM2A", 22, "gpmc_ad8", 14, {4, "EHRPWM2A", "ehrpwm.2:0"}}
于 2012-08-08T18:56:01.317 回答
0
#define P8_19 ((PIN){"EHRPWM2A", 22, "gpmc_ad8", 14, (PWM*){4, "EHRPWM2A", "ehrpwm.2:0"}})
                                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

标记的部分不是指针。

于 2012-08-08T18:56:52.177 回答
0

我会稍微不同地解决这个问题;我会在他们自己的模块中定义引脚名称,如下所示。

gpio.h

typedef struct s_PWM {
  uint8_t muxmode;
  char *name;
  char *path;
} PWM;

typedef struct s_PIN {
  char *name;
  uint8_t gpio;
  char *mux;
  uint8_t eeprom;
  PWM *pwm;
} PIN;

...
extern PIN * P8_19;

gpio.c

PWM _P8_19_PWM = {4, "EHRPWM2A", "ehrpwm.2:0"};
PIN _P8_19     = {"EHRPWM2A", 22, "gpmc_ad8", 14, &_P8_19_PWM};
PIN *P8_19     = &_P8_19;

gpio.h然后您可以通过正常包含和使用 P8_19在另一个文件中引用它。

于 2012-08-10T07:29:30.937 回答