Forum: Mikrocontroller und Digitale Elektronik MSP430: Array nicht auf den Stack schmeissen (C)


von Philipp B. (philipp_burch)


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.

von Horst-Otto (Gast)


Lesenswert?

Mussu deklarire alse static.

von Rufus Τ. F. (rufus) Benutzerseite


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
}

von Horst-Otto (Gast)


Lesenswert?

selber eloquent

von Philipp B. (philipp_burch)


Lesenswert?

Danke euch, daran wird's wohl liegen (kanns grade noch nicht testen).
Ach, wie schön ist doch ASM, da weiss man was passiert...

von Horst-Otto (Gast)


Lesenswert?

bei c weiss man auch was passiert wenn man nicht gerade doof ist

von Philipp B. (philipp_burch)


Lesenswert?

Na danke für die Blumen. Ich mag C nunmal nicht, da hab' ich mich noch
nie wirklich mit beschäftigt, daher bin ich damit auch noch net so
recht fit... Naja, wird schon noch werden, tut jetzt jedenfalls.
Zumindest was das o.g. Problem angeht.

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.