Forum: PC-Programmierung Convert __DATE__ into const char variable


von Moschdi (Gast)


Lesenswert?

Hallo zusammen,

Ich würde gerne den Inhalt des Makros _DATE_ (Datum)das vom Compiler 
kommt zur Compilerlaufzeit in eine Konstante z.B const char var 
überführen. Ich verwende einen WinRiver Compiler Diab 5.2.1. hat 
irgendjemand von Euch eine Ahnung wie sowas zur Compilerlaufzeit 
funktioniert?
Wäre um Hilfe sehr Dankbar!!

Liebe Grüße
Moschdi

von Stefan B. (stefan) Benutzerseite


Lesenswert?

const char *var = _DATE_;

von Moschdi (Gast)


Lesenswert?

Hallo Stefan,

vielen Dank für Deine Antwort! jetzt hab ich zwar einen Pointer auf 
_DATE_, wie bekomme ich aber zur Compilerlaufzeit den Wert  aus 
_DATE_
in eine Konstant?

Liebe Grüße
Moschdi

von Stefan B. (stefan) Benutzerseite


Lesenswert?

In welche Konstante?

Der Inhalt von _DATE_, welcher an sich ein String ist, ist doch 
konstant (fix) vorhanden z.B. in deinem Flash. Und der als 
unveränderlich gekennzeichnete Zeiger var zeigt auf diesen Inhalt.

Was brauchst du mehr? Wenn du lieber ein Array möchtest, um z.B. über 
dessen Laufindex an die einzelnen Buchstaben/Zahlen ranzukommen, geht 
auch:

const char var[] = _DATE_;

Siehe auch
http://www.dclc-faq.de/kap2.htm#2.2

von Moschdi (Gast)


Lesenswert?

Hallo Stefan,

so weit war ich auch schon mit:
const char [] = _DATE_;

leider funktioniert es aber so nicht, da bekomme ich einen 
Compilerfehler.

Mir wäre auch schon geholfen, wenn ich wüsste, wo genau der Compiler das 
Makro _Date_ genau ablegt. In meinem *.map File ist davon nichts zu 
finden. Aber irgendwo muss er es ja im Flash ablegen.

Hintergrund der Fragerei ist:

Meinem Board kommuniziert mit einem anderen System das Daten zu meinem 
Controller runterladen kann. Um sicher zu stellen, dass das System mit 
der richtigen Version kommuniziert wird zuvor ein CodeCheck auf beiden 
Seiten durchgeführt. Dazu soll ein Code Check pattern auf einen 
bekannten Speicherbereich gelegt werden, der von meinem Controller, 
sowie von dem System gelesen werden kann. Genau in diesen 
Speicherbereich möchte ich gerne das Datum und die Uhrzeit des 
Compilvorgangs ablegen. In einem ersten Schritt benötige ich dazu den 
Inhalt aus _DATE_ in einer einfachen Konstante. Dies Konstante muss 
aber während der Copilerlaufzeit beschrieben werden!

Liebe Grüße
Moschdi

von Rolf Magnus (Gast)


Lesenswert?

> so weit war ich auch schon mit:
> const char [] = _DATE_;

Das kann ja auch nicht gehen. Deine Variable hat nämlich keinen Namen.

> leider funktioniert es aber so nicht, da bekomme ich einen
> Compilerfehler.

Sollen wir raten, welchen, oder verrätst du es uns freiwillig?

von Karl H. (kbuchegg)


Lesenswert?

Stell dir einfach den String

  "12/03/07"

vor. (Ob der jetzt so aufgebaut ist oder anders, weiss ich
nicht auswändig. Wahrscheinlich aber anders)

Überall dort, wo du den verwenden kannst, kannst du auch _DATE_
einsetzen. _DATE_ ist nichts anderes als so ein String, nur
dass er
  * vom Compiler bereitgestellt wird, also immer das aktuelle
    Datum hat
  * einen Namen bekommen hat

Das ganze ist so, als ob du selbst ein

#define DATE "06/28/07"

machen würdest, nur das das halt der Compiler für dich macht.
Aber ansonsten ist das ein ganz normaler String, so wie jeder
andere String auch.

von Karl H. (kbuchegg)


Lesenswert?

> In einem ersten Schritt benötige ich dazu den
> Inhalt aus _DATE_ in einer einfachen Konstante. Dies Konstante muss
> aber während der Copilerlaufzeit beschrieben werden!

Du hast schon eine Konstante dafür.
_DATE_ ist die Konstante
1
void foo( const char* arg )
2
{
3
  char c = arg[0];
4
}
5
6
int main()
7
{
8
  printf( "%s", __DATE__ );
9
  printf( __DATE__ );
10
  foo( __DATE__ );
11
12
  // das unterscheidet sich in nichts von
13
  printf( "%s", "06/28/07" );
14
  printf( "06/28/07" );
15
  foo( "06/28/07" );
16
17
  // oder wenn man so will, von
18
#define ABC "06/28/07"
19
  printf( "%s", ABC );
20
  printf( ABC );
21
  foo( ABC );
22
}


von Moschdi (Gast)


Lesenswert?

Hallo zusammen,

alles schön und gut, das _DATE_ bereits meine Konstante ist, ist mir 
klar, ich sollte nur wissen an welcher Adresse im Flash der Inhalt von 
_DATE_ liegt. Wie schon gesagt, greift nicht nur mein Controller auf 
den _DATE_ Inhalt zu, sondern auch mein System. Um einen code check 
durchzuführen muss dass System genau den Speicherplatz (Adresse) von 
_Date_ kennen, um selbst einen code check durchführen zu können.

1. Möglichkeit: ich bekomme irgendwie heraus wo der Compiler _DATE_ im 
Flash ablegt. Somit wäre der Speicherort bekannt und ich könnte diesen 
Speicherort dem System mitteilen oder:

2. Möglichkeit: ich lade den Inhalt von _DATE_ zur Compilierzeit in 
eine Konstante um, dessen Speicherbereich mir bekannt ist und könnte 
dann somit den Speicherbereich der von mir erzeugten Konstante dem 
System mitteilen.

Danke für Eure Antworten!!

Ich hoffe ich kann mein Problemchen mit diesem Eintrag noch näher 
beschreiben. Letztenendes liegt der Schlüssel zu meinen Überlegungen 
darin, dass ich die Adresse wissen sollte wo _DATE_ im Flash abgelegt 
wird. Da ich das bis jetzt noch nicht rausgefunden habe, kam mir die 
Idee, den Inhalt von _DATE_ einfach zur Compilierzeit in eine mir 
bekannte Konstane zu überführen. Leider ist das auch nicht so einfach 
möglch!

Eine weitere Möglichkeit wäre noch während meines Make Prozesses ein 
Perl Skript aufzurufen, dass sich die Systemzeit des Rechners holt und 
mir dann ein Header file generiert, welches wiederum eine mir bekannte 
Konstante beinhaltet und dem ich dann den Datum- und Zeitstempel 
verpassen kann.

Liebe Grüße
Moschdi

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die erste Möglichkeit kannst du beim GCC durch Ansehen des MAP Files 
bzw. bzw. der Ausgabe des nm Tools realisieren. Dort steht drin, welche 
Daten, Funktionen welche Adressen usw. haben. Dein System kann an diesen 
dir als Programmierer bekannten Adressen nachsehen.

Nachteil: Die Adresse wird sich beim Hinzufügen weiterer Variablen und 
weiterem Code ändern. Dann musst du deine Systemsoftware neu 
kompilieren, wenn sich die µC Software ändert.

Die zweite Möglichkeit ist ja oben angegeben. Einmal als Zeigerlösung 
und einmal als Arraylösung. Den Fehler bei deinem Übersetzungsversuch 
kannst du beheben, wenn du einen Variablennamen benutzt z.B. var wie in 
meinen Beispielen. Dein System könnte die Adresse oder den Inhalt vom µC 
abfragen und darauf reagieren.

Möglicherweise gibt es bei deinem Compiler eine Erweiterung, um zu 
verhindern, dass Konstanten ins RAM kopiert werden. Beim AVR-GCC wäre 
das das PROGMEM Keyword 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29). 
In diesem Fall würde der Zeiger oben direkt ins ROM zeigen, bingo...

Vorteil: Die Abfrage kann komplett flexibel gestaltet werden. 
Systemsoftware und µC Software sind unabhängig (bis auf gemeinsamen 
Datenaustausch). Nachteil: Tja halt die erforderliche Kommunikation. 
Einfaches Nachsehen von einer Seite aus ist problematisch.

Eine dritte Möglichkeit wäre, eine Sektion im Flash mit bekannter 
Adresse zu definieren und eine Konstante, die mit _DATE_ initialisiert 
ist, gezielt in diese Sektion abzuspeichern. Das würde man bei GCC 
basierten Compilern im Quellcode mit dem _attribute_ section zusammen 
mit dem passenden Linkercontrolscript machen. Dein System kann an den 
dir als Programmierer bekannten Adressen nachsehen.

Vorteil: Die Adressen bleiben solange konstant, wie das 
Linkercontrolscript nicht geändert wird und keine Variablen (Konstanten) 
vor die DATE-Konstante in die gleiche Sektion eingefügt werden. Eine 
etwas bessere Variante der ersten Lösung...

von Moschdi (Gast)


Lesenswert?

Hallo Stefan,

ich werde Deine angegebenen Möglichkeiten mal überprüfen und schauen, ob 
ich da weiter komme!

Vielen Vielen Dank für Deine Hilfe!!!!

Hab mir gerade noch die Möglichkeit mit dem perl script gestrickt und 
damit funktioniert es einwandfrei! Die Komfortablere Lösung wäre jedoch 
deine Möglichkeiten!

Liebe Grüße
Moschdi

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.