Forum: Compiler & IDEs GCC: Array soll im SRAM abgelegt werden


von Mehmet K. (mkmk)


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

von sebi707 (Gast)


Lesenswert?

Magst du uns die Fehlermeldungen beim Compilieren oder Linken mitteilen? 
Im übrigen kann man sich den Cast mit (char *) vor jedem Eintrag im 
Array auch sparen.

von Hans (Gast)


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
};

von Rolf M. (rmagnus)


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.

von Mehmet K. (mkmk)


Lesenswert?

Herzlichen Dank!

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.