Hallo Zusammen, folgendes Problem macht mich momentan Verrückt: Ich verwenden in AC6 mit einem STM32 das FreeRTOS. Für Funktionen wie osDelay() und Semaphoren ect. steht am Anfang meiner jew. C/H-Dateien "#include "cmsis_os.h"". Nach meinem bisherigen Verständnis nimmt der Compiler jede einzelnen C-Datei (Reihenfolge weis ich nicht) und erstellt daraus eine Object-Datei. Der Precompiler ersetzt vorher alle "Includes" mit dem Inhalt der jew. H-Dateien. Um zu Verhindern, dass H-Dateien in einer Endlosschleife Eingefügt werden (falls gegenseitige Abhängigkeiten existieren), gibt es die "include guards" mit der #ifdef Direktive am Anfang jeder H-Datei. Diese Defines gelten allerdings nur innerhalb einer C-Datei. D.h. wird die H-Datei in einer anderen C-Datei mit Include eingebunden, existiert dieses guard define nicht und die H-Datei wird komplett eingefügt. Und ich glaube genau im letzten Satz steckt mein Fehler. Wird z.B. in der Main.C ein H-File Includiert und in einem anderen Header welcher wiederum auch von Main.C includiert wird, sind die Symbole aus diesem Header in main.C nicht bekannt. Genau dieses Problem habe ich nun in meinem gesamten Projekt mit der "cmsis_os.h"". ich hoffe das kam halbwegs verständlich rüber... Vielen dank! Simon
Simon W. schrieb: > Und ich glaube genau im letzten Satz steckt mein Fehler. Wird z.B. in > der Main.C ein H-File Includiert und in einem anderen Header welcher > wiederum auch von Main.C includiert wird, sind die Symbole aus diesem > Header in main.C nicht bekannt. ich glaube das versteht niemand. wenn die main.c einen Header includiert dann sind auch die Symbole bekannt.
Simon W. schrieb: > Hallo Zusammen, > > folgendes Problem macht mich momentan Verrückt: > > Ich verwenden in AC6 mit einem STM32 das FreeRTOS. > Für Funktionen wie osDelay() und Semaphoren ect. steht am Anfang meiner > jew. C/H-Dateien "#include "cmsis_os.h"". > > Nach meinem bisherigen Verständnis nimmt der Compiler jede einzelnen > C-Datei (Reihenfolge weis ich nicht) und erstellt daraus eine > Object-Datei. > der Main.C Das ist eine C++ Datei, vielleicht liegt da das Problem: Mischen von C und C++.
Hallo, danke für eure Antworten! Peter II schrieb: > wenn die main.c einen Header includiert dann sind auch die Symbole > bekannt. Genau das scheint ja eben nicht der Fall zu sein. wenn der Header dank der guard defines nicht inkludiert wird, müssten ja auch alle anderen Symbole daraus bekannt sein. Inclusive der Funktionen, die ich verwenden möchten. Der Compiler spuckt aber z.B. das hier aus: "undefined reference to `osDelay'" Johann L. schrieb: > Das ist eine C++ Datei, vielleicht liegt da das Problem: Mischen von C > und C++. Wie würde ich dieses Problem beheben? Hatte bisher damit allerdings noch nie Probleme.
Simon W. schrieb: > Genau das scheint ja eben nicht der Fall zu sein. wenn der Header dank > der guard defines nicht inkludiert wird, müssten ja auch alle anderen > Symbole daraus bekannt sein. Inclusive der Funktionen, die ich verwenden > möchten. Der Compiler spuckt aber z.B. das hier aus: "undefined > reference to `osDelay'" hättest du das mal gleich gesagt. Das ist der Linker der sagt "undefined reference". Du hast vergessen die lib oder das object mit zu linke. Das ist keine Meldung vom compiler.
Johann L. schrieb: > Das ist eine C++ Datei Aber nur in besonders engstirnig konfigurierten Systemen, die nicht über den Tellerrand blicken können, und bewusst inkompatibel zum Rest der Welt sein wollen, in denen Groß- und Kleinschreibung im Dateisystem keinen Unterschied ausmacht. Wer einen Compiler auf ein Betriebssystem portiert, das nicht zwischen Groß- und Kleinschreibung im Dateisytem unterscheidet, aber trotzdem *.C anders behandelt als *.c, der hat einen Programmierfehler produziert.
Rufus Τ. F. schrieb: > Wer einen Compiler auf ein Betriebssystem portiert, das nicht zwischen > Groß- und Kleinschreibung im Dateisytem unterscheidet welchen System soll das sein? Selbst unter Windows kann mit ein großes oder kleine C schreiben. Nur nicht gleichzeitig.
Peter II schrieb: > hättest du das mal gleich gesagt. > > Das ist der Linker der sagt "undefined reference". Du hast vergessen die > lib oder das object mit zu linke. Das ist keine Meldung vom compiler. Vielen Dank! Ich habs... ich war so auf die Include Geschichte fixiert! Habe mir die Initialisierung mit CubeMX erstellt und nur, weil ich meine einzige Semaphore aus CubeMX entfernt habe, hat der schlaue Würfel wohl die CMSIS aus dem Linkerscript geworfen. Nochmal erstellt und jetzt läuft alles. Also bitte zurückspulen auf heute Morgen 8 Uhr....... Danke euch allen!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.