Hallo,
ich habe ein STM32 und möchte in einer Funktion den aktuellen Pegel des
Portpins auf dem Display ausgeben. Die Funktion wird an vielen Stellen
aufgerufen und soll den Quellcode an den Stellen übersichtlicher machen
(jeweils nur 1 Quellcodezeile).
Mit der Funktionsdeklaration habe ich gewisse Probleme. Es funktioniert
zwar, aber der Compiler meckert, wenn ich die Datei über *.h einbinde.
1
void pinpegel_ausgeben(GPIO_TypeDef* Port, uint16_t uiPin, unsigned int uiX, unsigned int uiY)
Du hast vergessen, die Fehlermeldung zu zitieren.
Bei solchen Sachen solltest du auch immer mit angeben, welchen Compiler
und welche Libraries (incl. Versionsnummern) du verwendet hast.
Holger schrieb:> Mit der Funktionsdeklaration habe ich gewisse Probleme. Es funktioniert> zwar, aber der Compiler meckert, wenn ich die Datei über *.h einbinde.
Falls du Funktionen über *.h Dateien einbindest ist das
grundsätzlich der falsche Weg.
Funktionen werden in *.c Dateien geschrieben und deren Prototypen
in *.h Dateien für andere bekannt gemacht.
Wenn ich die Funktion in diagnose.h deklariere, kommt folgende Meldung:
unknown type name 'GPIO_TypeDef' in diagnose.h
Gebe ich nichts in diagnose.h an, so kommt in der *.c die folgende
Warnung:
implicit declaration of function 'pinpegel_ausgeben'; did you mean
'statsbilder_neu_ausgeben'? [-Wimplicit-function-declaration]
Ich verwende Segger V4.16
Holger schrieb:> Wenn ich die Funktion in diagnose.h deklariere, kommt folgende Meldung:> unknown type name 'GPIO_TypeDef' in diagnose.h
Du musst in der Datei diagnose.h die *.h Datei inkludieren, in der die
Register definiert sind.
Ungebildeter schrieb:> Falls du Funktionen über *.h Dateien einbindest ist das> grundsätzlich der falsche Weg.>> Funktionen werden in *.c Dateien geschrieben und deren Prototypen> in *.h Dateien für andere bekannt gemacht.
In diagnose.c ist diese mit Funktion mit "void
pinpegel_ausgeben(GPIO_TypeDef* Port, uint16_t uiPin, unsigned int uiX,
unsigned int uiY)" definiert.
In diagnose.h das selbe, nur mit Strichpunkt hinten dran. Wie erwähnt,
geht das Ganze nicht, wenn ich die Bekanntmachung in diagnose.h mache.
Holger schrieb:> Wenn ich die Funktion in diagnose.h deklariere, kommt folgende Meldung:> unknown type name 'GPIO_TypeDef' in diagnose.h
Du brauchst dann noch die Bezüge aus gpio.h.
Also alle *.c Dateien die diagnose.h inkludieren sollten vorher
noch z.B. stm32f4xx_gpio.h (kommt drauf an welchen STM du
verwendest) inkludieren.
Holger schrieb:> Aber ob es sinnvoll ist, in einer *.h-Datei eine andere> *.h anzugeben?
Wenn du da Zweifel hast, dann werfe doch einfach mal einen Blick in die
*.h Dateien von Profis. Du hast ja reichlich davon vorliegen.
Holger schrieb:> Bisher habe ich dies immer in *.c gemacht.
Und das ist auch richtig.
Sekundär-Includes sind zu vermeiden.
Also so:
Ungebildeter schrieb:> Also alle *.c Dateien die diagnose.h inkludieren sollten vorher> noch z.B. stm32f4xx_gpio.h (kommt drauf an welchen STM du> verwendest) inkludieren.
Die Betonung liegt auf vor
Ungebildeter schrieb:> Die Betonung liegt auf vor
Danke für den Hinweis, hatte ich übersehen. Nun geht es auch ohne die
Nennung der Datei in *.h.
Vielen Dank!
Gruß Holger