mikrocontroller.net

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


Autor: Günter R. (galileo14)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deja vu?

Eine Forumsuche hätte dir weitergeholfen:

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

Autor: Günter R. (galileo14)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Günter R. (galileo14)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Günter R. (galileo14)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.