Hallo Leute, ich habe in System Workbench ein Projekt. Den Projektnamen würde ich gern im LCD anzeigen lassen. Natürlich könnte man das händisch erledigen, aber ich hätte das gern automatisiert. Wie komme ich in C dahin, dass der Projektname in einem String landet?
Ingo Less schrieb: > Wie komme ich in C > dahin, dass der Projektname in einem String landet? in dem du dem File den Projektnamen gibst? Dort steckt er ja in argv[0] oder _NAME
Joachim B. schrieb: > in dem du dem File den Projektnamen gibst? Kannst du das etwas näher ausführen? Ich steh aufm Schlauch.
Ingo Less schrieb: > in C steht in jedem C-Buch http://www.c-howto.de/tutorial/funktionen-teil-2/hauptfunktion/ oder bei gcc const char main_name[] PROGMEM = {__FILE__};
ja ja, steht alles im C-Buch... Da muss man schon mit Macros tricksen und der gcc ist da etwas zickig.
1 | #define STRINGIFY(x) #x
|
2 | #define TOSTRING(x) STRINGIFY(x)
|
3 | |
4 | |
5 | printf("Hello from " TOSTRING(PROJECT_NAME) "\n"); |
damit bekommt man ein define in einen String. Jetzt muss noch PROJECT_NAME (habe ich hier nur als Beispiel genommen) von der Workbench in den Compiler setttings für die übergebenen defines vorhanden sein. Eventuell gibt es sowas, oder man muss gucken ob es eine Envrionmentvariable gibt die man in ein entsprechendes define packen kann. Und da es hier wohl um Cortex-M geht gibt es auch kein PROGMEM. Also nicht unbeding das erste Kapitel im C-Buch.
Lass einfach vom Makefile einen Header erzeugen der all diese Sachen als Define enthält (Name, Version, Branch, Commit-ID, Compiledatum, was auch immer...)
Johannes S. schrieb: > Und da es hier wohl um Cortex-M geht gibt es auch kein PROGMEM Hellseher? vom TO liesst man das nicht ;)
Joachim B. schrieb: > Hellseher? Es ist Google, der hellsieht, wenn man "System Workbench" eingibt :)
Yalu X. schrieb: > Es ist Google, der hellsieht, wenn man "System Workbench" eingibt ach so, ja dann google hat sich ja noch nieeeee geirrt :) dachte ich bei workbench immer an Amiga.
:
Bearbeitet durch User
Joachim B. schrieb: > dachte ich bei workbench immer an Amiga. Gib mal "Workbench" in die Bildersuche ein.
Bernd K. schrieb: > Gib mal "Workbench" in die Bildersuche ein. ja ;) https://www.medien.ifi.lmu.de/fileadmin/mimuc/mmi_ws0405/uebung/essays/Tobias_Emrich/os10_2.gif
Zum Beispiel: im Makefile
1 | HOST := $(shell hostname) |
2 | USER := $(shell whoami) |
3 | TOP := $(shell dirname `pwd`) |
4 | |
5 | CFLAGS += -DHOSTNAME="\"$(HOST)\"" |
6 | CFLAGS += -DUSERNAME="\"$(USER)\"" |
7 | CFLAGS += -DBUILD_PATH="\"$(TOP)\"" |
und dann
1 | printf (" GCC %d.%d.%d (%s)\n %s@%s:%s", |
2 | __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__, __VERSION__, |
3 | USERNAME, HOSTNAME, BUILD_PATH); |
Nick M. schrieb: >> const char main_name[] PROGMEM = {__FILE__}; _FILE_ hilft nicht weiter, es gibt den Dateinamen der Sourcdatei zurück (z.B. main.c). So wie es scheint, kommt man an die Info nicht ohne Krücken über Makefile dran. Sehr schade...
Der C Compiler weiß nicht was ein "Projekt" ist und auch nicht was der Name des Projekts ist. Du kannst in Eclipse (=System Workbench) in den Projekteinstellungen Makros (dort fälschlich "Symbol" genannt) definieren und als Wert "${project_name}" setzen, das wird dann von Eclipse mit dem Projektnamen ersetzt. Das Makro kannst du dann im Code nutzen.
Nick M. schrieb: > Genau das hab ich doch geschrieben!? Nö, du hast ne Frage dazu gestellt. Programmierer schrieb: > Du kannst in Eclipse (=System Workbench) in den > Projekteinstellungen Makros (dort fälschlich "Symbol" genannt) > definieren und als Wert "${project_name}" setzen, Ich habs an verschiedenen Stellen versucht. Wo genau soll ich das Symbol erstellen?
Ich habe nun in Settings -> Tools -> Global compiler settins -> #defines _SW_VERSION_ "${TARGET_OUTPUT_BASENAME}" erzeugt. Ich bekomme als Fehlermeldung: 1V9 No such file or directory 1V9, so heisst das Projekt
Ingo Less schrieb: >> Genau das hab ich doch geschrieben!? > Nö, du hast ne Frage dazu gestellt. https://de.wikipedia.org/wiki/Rhetorische_Frage
Ingo Less schrieb: > Ich habe nun in Settings -> Tools -> Global compiler settins -> #defines > SW_VERSION "${TARGET_OUTPUT_BASENAME}" erzeugt. Das sind die globalen Settings, also völlig falsch. Hab Grad kein Eclipse zu Hand und kanns nicht nachgucken. Rechte Maustaste auf das Projekt, Properties, C/C++ General -> Paths and Symbols -> Symbols, oder so ähnlich. https://armstrap-documentation.readthedocs.io/en/latest/_images/Eclipse-Project-Properties.png https://help.eclipse.org/2019-12/topic/org.eclipse.cdt.doc.user/images/prop_symb.png
Danke für die Hilfe, aber ich glaube man hat hier das EmBitz zu weit von Eclipse verfremdet. Die Menüeinträge gibts garnicht. Habe es aber woanders gefunden: Unter den BuildOptions kann ich dieses #define erzeugen: SW_VERSION="${TARGET_OUTPUT_BASENAME}" Im Programm mache ich dann folgendes:
1 | const char TimeStampBuildTime[] = SW_VERSION; |
Das wirft aber die Fehlermeldung "invalid suffix "V9" on integer constant". Das heisst, er erzeugt ein #define, welches einen String statt einer Zahl erhält. Damit kommt er nicht klar. Irgendwo habe ich noch n Fehler in der Syntax offensichtlich. Aber einen String als #define is sowieso schwierig oder? Kannst du mir da noch n Tip geben wo der Hase begraben liegt?
Ingo Less schrieb: > SW_VERSION="${TARGET_OUTPUT_BASENAME}" SW_VERSION="\"${TARGET_OUTPUT_BASENAME}\""
Ingo Less schrieb: > Danke für die Hilfe, aber ich glaube man hat hier das EmBitz zu weit von > Eclipse verfremdet. EmBitz? Ich dachte es geht um System Workbench? Ingo Less schrieb: > Das heisst, er erzeugt ein #define, welches einen String statt einer > Zahl erhält Genau umgekehrt. Ingo Less schrieb: > Aber einen String als #define is sowieso schwierig oder? Nö, da müssen nur Anführungsstriche drum, wie von Bauform B. gezeigt.
Bauform B. schrieb: > SW_VERSION="\"${TARGET_OUTPUT_BASENAME}\"" Astrein! Das war die Lösung! Vielen Dank euch beiden!
Ingo Less schrieb: > Unter den BuildOptions kann ich dieses #define erzeugen: > SW_VERSION="${TARGET_OUTPUT_BASENAME} Das klingt stark nach Code::Blocks, also doch EmBitz. Da helfen die Hinweise zu Eclipse natürlich überhaupt nicht. Aber warum war dann zu Anfang die Rede von System Workbench?
Programmierer schrieb: > Das klingt stark nach Code::Blocks, also doch EmBitz Verdammte Axt, du hast natürlich völlig Recht, es ging hier um EmBitz! Normalerweise arbeite ich mit System Workbench, habe aber noch ein altes Projekt aus EmBitz wieder beleben müssen, da habe ich mich anfangs gleich vertan -.-
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.