GCC: Array soll im SRAM abgelegt werden

#3777443
Lesenswert?

Servus allerseits

- STM32F407
- Em::Blocks mit arm-none-eabi v4.7.3

Ich habe in einer Datei folgendes Array:
1
static char *delay_items[] =
2
{
3
        (char *)"HC596 Reset (    ",
4
        (char *)"HC595 Clock (    ",
5
        (char *)"HC595 Latch (    ",
6
        (char *)"HC595 Next Bit (    ",
7
        (char *)"HC4051 Input (    ",
8
        (char *)"Sample Time 1x (  ",
9
        (char *)"Sample Time 8x (  "
10
};

Für die einzelnen delay_items[] werden die Werte ermittelt, ins Array 
eingefügt und erst dann auf dem LCD angezeigt.
Sieht dann so aus:

HC495 Reset (5)
HC495 Clock (2)
usw.

Soweit zur Theorie. In der Praxis werden die Array-Elemente im Flash 
abgelegt, weshalb meine Inserts nur dann funktionieren, wenn ich als 
Target SRAM waehle.

Kein Problem, dachte ich mir und habe fleissig mit
1
__attribute__ ((section(".ram")))
'geübt'.
Klassische Variable werden korrekt in dieser Sektion alloziert.
Aber obiges Array: entweder es compiliert nicht, es linkt nicht oder - 
als ich dachte "Hurra, jedes blinde Huhn findet hin und wieder ein 
Korn!" - das Array wird überhaupt nicht erstellt.

Irgendjemand, der mir die Zauberformel verraten taete? :)

MfG
Gast #3777516
Lesenswert?

Du hast ein Array mit Zeigern angelegt, die auf (konstante) 
String-Literale zeigen. Die darfst Du nicht verändern.

Du musst entweder jeden einzelnen String als eigenes Array anlegen und 
dann ein Array mit den Zeigern oder ein zweidimensionales Array:
1
static char delay_items[][21] =
2
{
3
  "HC596 Reset (    ",
4
  "HC595 Clock (    ",
5
  "HC595 Latch (    ",
6
  "HC595 Next Bit (    ",
7
  "HC4051 Input (    ",
8
  "Sample Time 1x (  ",
9
  "Sample Time 8x (  "
10
};
#3777594
Lesenswert?

Hans schrieb:
> Du hast ein Array mit Zeigern angelegt, die auf (konstante)
> String-Literale zeigen. Die darfst Du nicht verändern.

Allerdings. Der Compiler geht davon aus, daß die sich nicht ändern. Der 
Cast auf char* ist in C leider zulässig, aber den String ändern darf man 
auch über so einen Zeiger nicht.

Hans schrieb:
> Du musst entweder jeden einzelnen String als eigenes Array anlegen und
> dann ein Array mit den Zeigern

Also ungefähr so:
1
static char text1[] = "HC596 Reset (    ";
2
static char text2[] = "HC595 Clock (    ";
3
...
4

5
static char* delay_items[] =
6
{
7
    text1,
8
    text2,
9
    ...
10
};

Etwas mehr Schreibarbeit, aber dafür sauber und ISO-C-konform.

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