Forum: Mikrocontroller und Digitale Elektronik typedef wird nicht erkannt


von stefanius (Gast)


Lesenswert?

Im main.c habe ich folgendes definiert:
1
struct gpioTime
2
{
3
  GPIO_TypeDef * port;
4
  const uint16_t pin;
5
  uint16_t zeit;
6
7
}; 
8
9
typedef struct gpioTime GPIO_t;
10
11
GPIO_t time[] = {    
12
  {GPIOA, GPIO_PIN_6, 4},   // Pin, Pulszeit, Totzeit
13
  {GPIOA, GPIO_PIN_7, 3},
14
  {GPIOA, GPIO_PIN_8, 6}
15
};

time[] möchte ich nach aussen zugänglich machen.
Dazu schreibe ich im main.h
1
extern GPIO_t time[];

dann folgt "unknown type name"
Warum funktioniert das nicht?

von A. S. (rava)


Lesenswert?

struct definition und typedef in main.h schieben?

von Mark B. (markbrandis)


Lesenswert?

stefanius schrieb:
> Dazu schreibe ich im main.h
>
>
1
> 
2
> extern GPIO_t time[];
3
> 
4
>
>
> dann folgt "unknown type name"
> Warum funktioniert das nicht?

Weil an der Stelle halt bekannt sein muss, was ein GPIO_t denn 
eigentlich ist, um damit ein Array deklarieren zu können. Ist es aber 
nicht.

Schreib doch die Deklaration in eine eigene Header-Datei. Die kannst Du 
überall inkludieren wo sie gebraucht wird, auch in main.c.

Übrigens ist es unüblich, dass es eine main.h gibt in der man eigene 
Datentypen definiert.

von A. S. (Gast)


Lesenswert?

Du könntest sowas ähnliches ohne Internas verwenden, nämlich Pointer auf 
eine Struktur.
Für Kapselung (information hiding)
Kommt aber drauf an, was Du erreichen willst.

von W.S. (Gast)


Lesenswert?

stefanius schrieb:
> Im main.c habe ich folgendes definiert:
> struct gpioTime
> {
>   GPIO_TypeDef * port;
>   const uint16_t pin;
>   uint16_t zeit;
>
> };
>
> typedef struct gpioTime GPIO_t;
>
> GPIO_t time[] = {
>   {GPIOA, GPIO_PIN_6, 4},   // Pin, Pulszeit, Totzeit
>   {GPIOA, GPIO_PIN_7, 3},
>   {GPIOA, GPIO_PIN_8, 6}
> };
>
> time[] möchte ich nach aussen zugänglich machen.
> Dazu schreibe ich im main.h
>
> extern GPIO_t time[];

Ähemm...

Erstmal was formelles: Du hast im Struct port+pin+zeit und im obigen 
Kommentar Pin+Pulszeit+Totzeit. Das paßt nicht zusammen.

Als nächstes sehe ich noch keine wirkliche Verwendungsmöglichkeit für 
dein gesamtes Konstrukt - und leserlich ist das auch nicht. Sol das mal 
eine Art Ablaufsteuerung werden? Wenn ja, dann ist Totzeit wohl falsch 
und es müßte das Ganze eher so aussehen:
1
struct ZeitElement
2
{ int  idSignalname;   // nicht Portname, sondern Signalbezeichner
3
  long Startzeitpunkt; // in Millisekunden
4
  long Dauer;          // in Millisekunden
5
  bool invertiert;     // ob HI-Puls oder LO-Puls
6
}

und dazu dann sowas für idSignalname:
#define idGeblaese   1
#define idGasventil  2
#define idZuendTrafo 3
#define idIoniSonde  4

usw.

Als nächstes ist es so, daß alles, was Speicherplatz kostet, also aller 
Code und alle Variablen und typisierten Konstanten in eine .c kommt. 
Typdeklarationen hingegen kommen entweder in diejenige .c, wo sie intern 
verwendet werden oder (falls die Typdeklaration auch woanders nötig ist) 
kommt sie in die zugehörige .h hinein.

Also nicht struct xyz {..}; in main.c, sondern in die .h des zugehörigen 
Lowlevel-Treibers (und NICHT in irgend eine .h eines benutzenden 
Programmteiles).

Der Grund ist, daß der LL-Treiber, der die Funktionen enthält, die aus 
den Struct-Elementen irgend eine Reaktion der Hardware machen sollen, 
selber den Struct kennen muß - aber er kann prinzipiell NICHT wissen, 
welche sonstigen Programmteile ihn zu benutzen gedenken. Also all diese 
Sachen in den LL-treiber und dessen .h hineinschreiben.

Die den LL-treiber benutzenden Teile deiner Firmware können dann ganz 
easy dessen .h inkludieren und wissen dann auch, was sie wissen müssen. 
Also so herum.

Und typedef kann man sich sparen, sofern man jedesmal das "struct" 
dazuschreibt. Dein extern GPIO_t time[] funktioniert also nur dann, wenn 
du alles, also sowohl das typedef als auch das zugrundeliegende struct 
gpioTime dazu in die .h schreibst.

W.S.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.