Forum: Compiler & IDEs Compile-Datum als numerische Werte?


von Günter R. (galileo14)


Lesenswert?

Hallo,

man kann bekanntlich z.B. mit "printf(_DATE_);" das Compile-Datum
in String-Notation der Form "SEP 01 2006" ausgeben oder sonstwie
speichern (auch im Flash, als Programm-Info oder so).

Ich möchte aber für eine bestimmte Anwendung (Programm-Info-Block)
dieses Datum gerne als numerische Werte (int's) haben.

Läßt sich aus dem Compiler- bzw. Präprozessorstring _DATE_ ein
numerisches Datum gewinnen (separiert in die drei Bestandteile), oder
kennt jemand andere Präprozessor- oder Compiler-Direktiven, die hier
das aktuelle Datum einfügen? Auch nach längerem Suchen habe ich nichts
gefunden.

Da das _DATE_ gut fixierte Feldbestandteile hat, könnte man evt. mit
Präprozessor-if-Abfragen zum Ziel kommen, wenn es eine Möglichkeit
gäbe, im Präprozessor Stringverarbeitung à la "Copy(scr,start,len)"
von Borland-Delphi zu machen. Mir ist davon nichts bekannt. Geht's
trotzdem? Weiß jemand etwas darüber?

Danke für Comments.
Günter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Deja vu?

Eine Forumsuche hätte dir weitergeholfen:

http://www.mikrocontroller.net/forum/read-2-308506.html#308511

von Günter R. (galileo14)


Lesenswert?

Hallo Jörg,

danke für diesen Hinweis. Er löst aber leider das Problem nicht. Klar
könnte man zur Laufzeit das Datum mit C-Stringverarbeitung aufdröseln
und beliebig auswerten. Bei meiner Anwendung geht's jedoch darum, daß
der Compiler zu einer Applikation einen Versionsblock in eine bestimmte
Section, die auf eine bestimmte Adresse zu linken ist, ausgeben soll (da
hast Du mir mit der Idee, eine struct zu verwenden, um die Reihenfolge
der Felder zu fixieren, schon mal geholfen - herzlichen Dank
nochmal!).

Das Datum muß somit schon zur Compilezeit feststehen, nicht erst bei
der Ausführung des Codes, denn die im Flash stehende Applikation wird
von einem speziellen Bootloader ausgelesen und weiterverarbeitet, da
läuft deren Code noch gar nicht.

Vielleicht kommst Du jetzt auf die Idee, im Versionsblock eine Adresse
einer speziellen Funktion der Applikation zu hinterlegen, die der
Bootloader aufrufen kann und dann das aufgedröselte Datum zurückbekommt
- das wäre eine Lösung. Dennoch wäre mir der Vorschlag von Patrick
Dohmen aus Deinem Link schon sympathischer - soetwas geht natürlich
immer (externes Programm oder Script erstellt irgendwelche Daten, die
per #include im Programm verarbeitet werden - das würde ggf. auch
wieder zu meiner noch älteren Anfrage führen, wie man aus dem AVR
Studio ein externes Programm aufgerufen bekommt, ohne ein externes
Makefile zu verwenden).

Ich muß also das Resumé ziehen, daß AVR-GCC hier keine Unterstützung
bieten kann und ich mir einen anderen Weg suchen muß - auch okay. Es
führen immer viele Wege zur Lösung.

Jedenfalls danke für die Beschäftigung mit diesem Thema.

Günter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Da war doch noch der wirklich coole C++-Trick.  Der funktioniert
in der Tat zur Compilezeit.

von Günter R. (galileo14)


Lesenswert?

Hallo, Jörg,

die Funktion von Rolf Magnus ist tatsächlich cool, um nicht zu sagen
genial (und ich werde sie an anderer Stelle bestimmt verwenden); sie
funktioniert aber durchaus nicht zur Compilezeit, sondern erst zur
Laufzeit; denn sie funktioniert, wie Du selbst geschrieben hast und wie
ich's getestet habe, nur bei Auto-Variablen, d.h. bei lokalen, auf dem
Stack allokierten Variablen; und solche Initialisierungen geschehen ja
nicht zur Compilezeit wie etwa bei globalen Variablen (dort wird ja
ROM-Code generiert, der per Startup-Code ins RAM kopiert wird), sondern
es sind ganz normale Zuweisungen, die logischerweise erst laufen können,
wenn die Funktion aufgerufen wird.

Somit löst's mein Problem nicht, denn ich will ja ein Datum im
ROM-Code (bzw. Flash) ansiedeln, da muß es tatsächlich zur Compilezeit
erzeugt werden und ins Hex-File wandern.

Dennoch vielen Dank für den Link, für andere Anwendungen ist er sehr
wertvoll.

Gruß, Günter

von Rolf Magnus (Gast)


Lesenswert?

Wie gesagt, in C++ geht's auch zur Compilezeit. Wenn du nicht für alles
C++ verwenden willst, kannst du das auch in eine eigene Datei schreiben
und nur diese mit dem C++-Compiler übersetzen.

von Günter R. (galileo14)


Lesenswert?

Hallo, Rolf,

ich will eigentlich kein C++-Projekt eröffnen (kenne mich mit C++ nicht
aus), außerdem wollte ich's ganz einfach im AVR Studio mit WinAVR
mitcompilieren. Oder siehst Du eine Möglichkeit, dort ein C++-Fragment
reinzubringen, das dann mitcompiliert wird und im gleichen Hex-File
landet?

Günter

von Rolf Magnus (Gast)


Lesenswert?

Das müßte schon gehen, aber ich kenne mich mit WinAVR und AVR-Studio
nicht aus und kann dir nicht sagen, wo du da schrauben mußt. Evtl.
reicht es, der Datei einen Namen zu geben, der auf .cpp endet und sie
bei den Quellen mit anzugeben.

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.