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
#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 に答える
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 に答える