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.