MSP430: Array nicht auf den Stack schmeissen (C)

OP #400874
Lesenswert?

Hallo zusammen,

ich hab' irgendwie ein Problem mit dem Compiler der IAR Embedded
Workbench für den MSP430. Folgender Code:
1
        if (P1IN & 0x10 && ~P1Old & 0x10) {
2
            SD_Init();
3

4
            U08 Buf[128];
5
            for (int i = 0; i < 128; i++) {
6
                Buf[i] = 0;
7
            }
8

9
            SD_Read_Block(0x00000001, Buf);
10
            U16 bla = 0;
11
        }

Damit wird erstmal meine SD-Karte initialisiert und dann 128 Byte
Speicher für meinen Block reserviert. Nun wird der Speicher aber
bereits vor dem Aufruf von SD_Init() reserviert (Ist ja auch richtig
so). Soweit kein Problem, nur: Warum um alles in der Welt will der da
das komplette Array auf den Stack schmeissen? Der Speicher sollte ja
eigentlich reserviert sein, also was macht es für einen Sinn, denn
kompletten Inhalt so nebenbei nochmal zwischenzuspeichern? Mal davon
abgesehen, dass der Stack damit natürlich gleich übervoll ist.
Eigentlich sollte er da den Speicher reservieren, SD_Init() aufrufen
(Dabei wird das Array nirgenwo verändert, wird ja auch net übergeben)
und dann das Array an SD_Read_Block() übergeben, wo es gefüllt wird.
Nur will das ganze Zeug nicht so wie ich will...

Zusammenfassung:
Wie kriege ich es hin, dass ein deklariertes Array bei einem
Funktionsaufruf nicht auf den Stack geschmissen wird?

Danke schonmal im Voraus für Antworten!

PS: Ich weiss, ich hab' C nicht wirklich im Griff, kann also gut sein,
dass ich da einfach einen Denkfehler drin habe.
Persönliche Seite #400876
Lesenswert?

Das Array Buf (ich nehme an, daß Du das meinst) ist eine automatische
Variable, das ist jede Variable, die innerhalb eines Blockes (von
geschweiften Klammern umschlossener Abschnitt) deklariert wird.
Und diese werden nunmal auf dem Stack angelegt, es sei denn, Du
deklarierst sie als "static", wie "Horst-Otto" ja schon äußerst
eloquent dargelegt hat.


In diesem Falle belegen die Variablen aber auch dann Speicher, wenn die
Funktion, die die Variablen verwendet, bereits beendet ist.

Alternativ kannst Du die Variable auch außerhalb jedweder Funktion
deklarieren, dann kann sie auch von verschiedenen Funktionen verwendet
werden - die Speicherbelegung ändert sich natürlich auch dann nicht.

Also:

Entweder
1
 
2
if (P1IN & 0x10 && ~P1Old & 0x10) 
3
{
4
  SD_Init();
5
  static U08 Buf[128];
6
  // etc.pp.
7
}


oder
1
U08 Buf[128];
2

3
int meinefunktion(int bla)
4
{
5
  // etc.pp.
6
}

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