Forum: Compiler & IDEs __DATE__ ins Flash


von Hans (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

Was ist damit:
1
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.

von Hans (Gast)


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

von Hans (Gast)


Lesenswert?

bzw. halt

char TEST test2 = __DATE__[0];

um im Beispiel zu bleiben

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


Lesenswert?

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

von Hans (Gast)


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

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


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:
1
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. :-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Bei mir geht's so
1
const char DATE1[] __attribute__((section (".foo"))) = __DATE__;
2
// oder 
3
const char DATE2[] PROGMEM = __DATE__;

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

Johann
1
.global  DATE1
2
  .section  .foo,"a",@progbits
3
  .type  DATE1, @object
4
  .size  DATE1, 12
5
DATE1:
6
  .string  "Oct 16 2009"

von Hans (Gast)


Lesenswert?

@Jörg: Okay, aber damit bekomme ich dann zum Beispiel
1
(__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:
1
char TEST test[] = __DATE__;
2
char TEST test2 = test[0];



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

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

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

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


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.

von Hans (Gast)


Lesenswert?

Mist :-)

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.