Wie initialisiert man sowas korrekt?

Gast #4382232
Lesenswert?

Ich habe zwei Zeichenketten im Flash, die zufällig identisch sind. Lässt 
sich nicht vermeiden (hat mit verschiedenen Sprachen zu tun). Ich habe 
das Ganze mal zu einem Minimalbeispiel zusammengedampft, das nur das 
Wesentliche enthält:
1
#include <inttypes.h>
2
#include <avr/io.h>
3

4
const __flash char TEST1[] = "test";
5
const __flash char TEST2[] = "test";
6

7
static void use(const __flash char *data) {
8
  char c;
9
  while ((c = *data++) != '\0') GPIOR1 = c;
10
}
11

12
int __attribute__((OS_main)) main(void) {
13
  use(TEST1);
14
  use(TEST2);
15
  while (1);
16
}

Kompiliert wird das Ganze mit avr-gcc 5.2.1 mit u.a. dem Parameter 
-fmerge-all-constants, der in solchen Fällen Platz spart. Nun ist es so, 
dass folgende Warnung erscheint:
1
test.c: In function 'main':
2
test.c:5:20: warning: uninitialized variable 'TEST2' put into program memory area [-Wuninitialized]
3
 const __flash char TEST2[] = "test";

Warum passiert das? Und wie kann ich die Warnung verhindern (ich kann 
nicht auf -Wuninitialized oder -fmerge-all-constants verzichten)?
Persönliche Seite #4382754
Lesenswert?

Okay, damit kann ich's nachvollziehen.  Wenn du nen PR anlegst dann 
bitte ohne Header, z.B.
1
const __flash char test1[] = "test";
2
const __flash char test2[] = "test";
3

4
char func (unsigned char c)
5
{
6
  return test1[c] + test2[c];
7
}
Die Warnung wird warscheinlich zu spät ausgegeben; sie zu früh 
auszugeben bringt hingegen PR34734 :-)  Bislang wurde das Problem 
wahrscheinlich durch PR57597 maskiert.

Bis das behoben ist kannst du ja -Wuninitialized deaktivieren oder 
rausfiltern falls "progmem memory area" drin vorkommt (ohne NLS, das man 
eh deaktivieren sollte).

Allerdings wüsste ich nicht, dass momentan jemand Zeit in avr-gcc 
investiert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren