Wie initialisiert man sowas korrekt?

Gast #4382232
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)?
Gast #4382703
Warum Optionen raten? Könnt ihr es nicht mit dem Code nachvollziehen? 
Dann muss ich später nochmal gucken, ob ich eine spezielle weitere 
Option verwende.
Gast #4382725
Übrigens ist es sehr positiv, dass die Konstanten "gemergt" werden und 
so Flash frei wird. Ohne diese Option würden wir unsere Software nämlich 
nicht in den Chip reinkriegen.
Persönliche Seite #4382754
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.