www.mikrocontroller.net

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


Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

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

            U08 Buf[128];
            for (int i = 0; i < 128; i++) {
                Buf[i] = 0;
            }

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

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.

Autor: Horst-Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mussu deklarire alse static.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
 
if (P1IN & 0x10 && ~P1Old & 0x10) 
{
  SD_Init();
  static U08 Buf[128];
  // etc.pp.
} 


oder
U08 Buf[128];

int meinefunktion(int bla)
{
  // etc.pp.
}

Autor: Horst-Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
selber eloquent

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Horst-Otto (Gast)
Datum:

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

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.