GCC: Array soll im SRAM abgelegt werden

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.