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
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.
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
Wenn du in C ein string literal indizierst, entsteht daraus formal keine Konstante. In C++ ist das anders.
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
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. :-)
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" |
@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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.