www.mikrocontroller.net

Forum: Compiler & IDEs __DATE__ ins Flash


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde gerne das Build-Datum an eine entsprechende Stelle im Flash 
schreiben lassen. Dazu hab ich folgendes gemacht (beispielhaft):

#define TEST __attribute__((section(".testaddr")))

uint8_t TEST test[2] =
{
    __DATE__[0], __DATE__[1]
};

Für die Section .testaddr hab ich eine entsprechende Adresse definiert. 
Leider bekommt beim kompilieren:

error: initializer element is not constant

Wie macht man das denn richtig ? Danke.

Hans

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist damit:
char TEST test[] = __DATE__;
Sind natürlich ein paar Bytes mehr.

Solltest aber sicherstellen, dass Compiler/Linker es nicht mangels 
Benutzung gleich wieder rauswerfen. Attribut "used" oder so.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

und warum tut das ? Wenn ich nun

char FLASH_FOR_APPLICATION test2 = __DATE__[0];

mache tuts wieder nicht, error: initializer element is not constant

Gruss
Hans

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bzw. halt

char TEST test2 = __DATE__[0];

um im Beispiel zu bleiben

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

Bewertung
0 lesenswert
nicht lesenswert
Wenn du in C ein string literal indizierst, entsteht daraus formal
keine Konstante.  In C++ ist das anders.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, danke. Aber da _DATE_ ja konstant ist, müsste ich doch daraus 
auch wieder anderen konstante Werte ableiten können, oder ? Im Prinzip 
möchte ich sowas in der Art von

(__DATE__[0] * 10) + __DATE__[1]

als Konstante im Flash ablegen. Geht das irgendwie ? Wenn ja, wie ?

Danke...

Hans

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

Bewertung
0 lesenswert
nicht lesenswert
Nein, man kann (in C) daraus so nichts ableiten, da ein string literal
syntaktisch keine Konstante ist.  (Ein konstantes Array darf man
trotzdem damit initialisieren, weil dies wiederum explizit gestattet
ist.)  Wie gesagt, in C++ geht das, da ist ein string literal wirklich
eine Konstante, die auch beim Indizieren wiederum Konstanten ergibt.

Was in C geht ist sowas:
char foo[2] = __DATE__;

Gibt natürlich eine Warnung ;-), aber es funktioniert.  Allerdings
kann ich dem Standard gerade nicht entnehmen, dass das auch wirklich
definiertes Verhalten ist. :-)

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir geht's so
const char DATE1[] __attribute__((section (".foo"))) = __DATE__;
// oder 
const char DATE2[] PROGMEM = __DATE__;

Für Section .foo muss man natürlich noch ld-Skript etc. anpassen.

Johann
.global  DATE1
  .section  .foo,"a",@progbits
  .type  DATE1, @object
  .size  DATE1, 12
DATE1:
  .string  "Oct 16 2009"

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg: Okay, aber damit bekomme ich dann zum Beispiel
(__DATE__[3] * 10) + __DATE__[4]

nicht hin :-( Du schreibst aber:

string literal -> konstantes Array geht in Ordnung, da explizit 
gestattet
kann ich dann aus dem konstanten Array wieder teilen ? Also:
char TEST test[] = __DATE__;
char TEST test2 = test[0];



@Johann: Oben hatte ich ja geschrieben, dass
char TEST test[] = __DATE__;

funktionier, aber folgendes
char TEST test2 = __DATE__[0];

nicht. Da wusste ich nicht, dass wenn ich das _DATE_ indizier, kein 
const mehr rauskommt.

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

Bewertung
0 lesenswert
nicht lesenswert
Hans schrieb:

> kann ich dann aus dem konstanten Array wieder teilen ?

Nein, das ist keine Konstante mehr.  Selbst der qualifier "const"
begründet in C keine Konstante, sondern nur eine Variable, deren
Änderung verboten ist.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist :-)

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.