Forum: Mikrocontroller und Digitale Elektronik MSP430 can't allocate stack


von Tilo S. (thesurfer)


Lesenswert?

Moin,

ich habe ein Problem mit dem MSP430F2013. Ich muss dazu sagen das ich 
eigentlich aus der PC - Programmierung komme und mich gerade in die µC 
geschichte reinfinden muss.

Nun zu meinem Problem :

Ich wollte auf dem F2013 einen eigenen kleinen digital Filter bauen um 
aus den SD16MEMO paar Zusatzinfo's zu bekommen.

Im Spaghetticode und alles in die mainroutine geschrieben hat er auch 
schon sauber gearbeitet. Nun wollte ich das Timing ueber den WDT regeln 
um eine wirklich saubere Samplefrequenz hinzubekommen.

Da ich die Berechneten variablen aber auch noch fuer andere Sachen 
brauch hab ich mir gedacht, mach ich sie eben global und dann entsand 
folgendes Problem.

hier nun meine Variablendeklaration :

#define counter 0x1f

short m_SD16 = 0;    // membervariable des SD16 fuer alle berechnungen
short m_VarArray[counter];  //berechnete Filterwerte fuer weitere 
Berecnung
char i = 0;
long temp = 0;   //
short X1,X2,Y1,Y2 = 0;    // Filter

wie gesagt, nur in der mainroutine laeuft es, als global kommt folgender 
Fehler :

can't allocate .stack, size 00000032 (page 0) in RAM (avail:  main.c 
turnarround  line 0

wenn ich alles zusammen rechne, erreiche ich niemals die 256 Byte RAM. 
Und ich dachte das der Ausfuehrbarecode im flash bleibt und der RAM fuer 
die Variablen da ist.

Ich wuerde mich ueber einen kleinen Denkanstoss oder Hilfestellung 
freuen.

MfG
Tilo

von Tilo S. (thesurfer)


Lesenswert?

So ich habe jetzt bisschen weiter probiert und stiess auf folgendes 
Phenomen.

bei dem 32'array folgender Fehler :

error: can't allocate .stack, size 00000032 (page 0) in RAM (avail: 
0000002a)

nehm ich 31 :

error: can't allocate .stack, size 00000032 (page 0) in RAM (avail: 
0000002c)

ab ein array von 28 geht es. Das sind Sachen die versteh ich nicht, der 
Nutzbare speicher wird groesser. oder bedeutet das "avail", jetzt noch 
nutzbar, selbst dann ist es unlogisch.

Das Problem ist, ich brauch diese 32 Werte fuer meinen Ringbuffer, den 
ich spaeter nutzen will, und 16 Werte sind zu wenig.

Achja, ich benutze den den CCE 2 von TI.

MfG
Tilo

von Christian R. (supachris)


Lesenswert?

Das m_ klingt verdächtig nach OOP. Hast du Klassen verwendet? Ich denke 
mal, es liegt nicht am RAM an sich, sondern daran, dass Variablen, die 
über Call by Value übergeben werden, durch den Stack gehn. Bau das mal 
um, dass die Variable global ist, und du lediglich die Adresse bei 
Funktionsaufrufen übergibst, also Call by reference.

Wenn du mal das komplette Programm postest, kommen wir bestimmt weiter. 
ein µC ist nun mal kein PC, mit einem riesen Stack/Heap. Das sind im 
Normalfall bloß paar Byte, die da reserviert sind.

von Tilo S. (thesurfer)


Angehängte Dateien:

Lesenswert?

Moin leider falsch, die Vergabe meiner Variablennamen ist aus alter 
Zeit, ich gewoehn mich so schlecht um, ausserdem find ich das fuehrende 
m_ gar nicht so verkehrt. Ich benutze keine Objekte und uebergebe auch 
keine Variablen.

Um das ganze zu verdeutlichen hab ich jetzt mal den source angehaengt, 
ich denke im ganzen sieht man es besser und vllt sieht ja irgendeiner 
meinen Denkfehler. Wie gesagt ich steige gerade erst in µC ein, vorher 
nur C++ und anderen Krams fuer PC gebaut.

Der Code ist noch nicht fertig, es geht momentan erstmal nur um den oben 
beschriebenen Fehler mit dem RAM, das beim Filter noch fehler sind weiss 
ich :) .

von Christian R. (supachris)


Lesenswert?

Hmmm...passiert das auch, wenn du die 31 direkt in die Deklaration 
schreibst?
Also short m_VarArray[31];

Und wieso hast du keine Prozessor-Include-Datei angegeben? Also
#include msp430x20x3.h
ma mit rein.

von Tilo S. (thesurfer)


Angehängte Dateien:

Lesenswert?

die msp430x20x3.h hab ich in der main.h drin, die wird aber erst 
gefuellt wenn ich fertig bin. hab sie trotzdem mal angehaengt.

was in meinem 2.ten post beschrieben wurde entstand durch

short m_VarArray[31];
short m_VarArray[30];
short m_VarArray[29];
short m_VarArray[28];

ab hier wuerde es dann laufen.

also durch direktes einsetzen und auskommentieren des #define

von Christian R. (supachris)


Angehängte Dateien:

Lesenswert?

Also ich habs mal im GCC probiert, klappt. Allerdings hat der x20x3 
keinen SD16A, da gibts 2 Register nicht, die du benutzt hast. Hab den 
Code mal angehängt. Kommen keine Fehler. Nur 2 Warnungen.

Größe, die erzeugt wird:

msp430-size --target=elf32-msp430 Test.elf
   text     data      bss      dec      hex  filename
    672       10       68      750      2ee  Test.elf

von Tilo S. (thesurfer)


Lesenswert?

m'kay, warum hat er kein SD16A, wenn ich es doch schon benutzt habe.

Da ich keine Pragmas nutze und du eigentlich nur das geaendert hast plus 
2 auskommentierungen hat mir deine main.c nicht wirklich weiter 
geholfen.


ich dachte das cce und mspgcc das gleiche waere, scheint aber nicht so, 
wenn du mir noch die signal.h geben koenntest, wuerde ich dann zu hause 
mal mein eclipse mit dem mspgcc fuettern und dann deinen code nochmal 
damit testen. Es kann ja am compiler liegen.

MfG
Tilo

von Christian R. (supachris)


Lesenswert?

Vielleicht ist das Header-File im mspgcc dann falsch. Da steht drin, 
dass er einen SD16_1 hat, und da gibts die Register nicht. Komisch.
Die signal.h ist für den GCC, brauchst du beim CCE nicht. Ist beim 
mspgcc Paket dabei.

cce benutzt den TI-Compiler, keinen GCC, die nehmen bloß auch die 
Eclipse Umgebung.

Kannst ja mal mit GCC ausprobieren, geht echt gut.

Die Pragmas sind da, um zwischen GCC und IAR umzuschalten, ich schreib 
meinen sämtlichen Code immer so, dass er zwischen den beiden nutzbar 
ist, ohne was zu ändern. Das signal.h müsste da eigentlich auch in so 
ein #ifdef

von szimmi (Gast)


Lesenswert?

Hiho,
ohne genauer hinzuschauen, Du hast leider nur 128 Byte RAM anstatt 
Deiner angenommenen 256 Byte. Kann es vielleicht daran liegen ? :-)

von Tilo S. (thesurfer)


Lesenswert?

hm stimmt 128 B RAM aber selbst die sind noch nicht voll.

short m_SD16 == 2 Byte
short m_VarArray[counter] == 62 Byte
char i == 1Byte
long temp == 4 Byte
short X1,X2,Y1,Y2 == 8 Byte

Summe = 77 Byte und das sind alle Variablen die ich momentan hab.

Das problem ist wie gesagt, dass es mit global nicht funktioniert also 
am RAM liegt es nicht.

Naja, ich werd mich mal am gcc mit eclipse ransetzen und ausprobrieren, 
ist zwar nicht die gewuenschte loesung aber wenns dann laeuft bin ich 
erstmal weiter.

Danke fuer die Hilfe.

von Christian R. (supachris)


Lesenswert?

Laut GCC benötigt das Programm 78 Byte RAM, (s.o.) daran sollte es nicht 
liegen.

von Tilo S. (thesurfer)


Lesenswert?

???? wie bitte hast du den F2013 mit mspgcc ausprobiert

ich erhalte diese Fehlermeldung, aber die versteh ich und such jetzt ein 
workarrround

msp430-gcc -I"C:\mspgcc\msp430\include" -O0 -g3 -Wall -c 
-fmessage-length=0 -mmcu=msp430x20x3 -omain.o ../main.c
cc1: MCU msp430x20x3 not supported
Known MCU names:
   msp1
   msp2
   msp430x110
   msp430x112
   msp430x1101
   msp430x1111
   msp430x1121
   msp430x1122
   msp430x1132
   msp430x122
   msp430x123
   msp430x1222
   msp430x1232
   msp430x133
   msp430x135
   msp430x1331
   msp430x1351
   msp430x147
   msp430x148
   msp430x149
   msp430x1471
   msp430x1481
   msp430x1491
   msp430x155
   msp430x156
   msp430x157
   msp430x167
   msp430x168
   msp430x169
   msp430x1610
   msp430x1611
   msp430x1612
   msp430x2101
   msp430x2111
   msp430x2121
   msp430x2131
   msp430x311
   msp430x312
   msp430x313
   msp430x314
   msp430x315
   msp430x323
   msp430x325
   msp430x336
   msp430x337
   msp430x412
   msp430x413
   msp430x415
   msp430x417
   msp430x423
   msp430x425
   msp430x427
   msp430x4250
   msp430x4260
   msp430x4270
   msp430xE423
   msp430xE425
   msp430xE427
   msp430xW423
   msp430xW425
   msp430xW427
   msp430xG437
   msp430xG438
   msp430xG439
   msp430x435
   msp430x436
   msp430x437
   msp430x447
   msp430x448
   msp430x449
(null):0: confused by earlier errors, bailing out

wie man sieht kein F2013 dabei

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

78 Bytes für Variablen ver(sch)wendetes RAM. Von 128 Bytes insgesamt. 
Und wie groß ist der Stack? Wieviel Platz gedenkst Du dem zuzuteilen?

von Christian R. (supachris)


Lesenswert?

Was hast du denn für eine mspgcc Version? Bei meiner 3.2.3 wird der 
unterstützt.


@Rufus:
Wieso verschwendet? Wenn man die Variablen halt braucht, braucht man 
sie. Grade für digitale Filter braucht man nun ma bissl RAM.

Der Stack läuft ja automatisch von oben los, die Variablen von unten. 
Wie man die Größe des reservierten Bereichs beim GCC einstellen kann, 
ist mir allerdings auch noch unklar. Ich hatte bisher da noch keine 
Probleme, kam noch nie soweit an den oberen Rand, dass der Stack 
überlief.

von Tilo S. (thesurfer)


Lesenswert?

@Rufus : danke fuer deinen hilfreichen Post, jedoch wie ganz oben 
beschrieben komme ich aus dem PC-Bereich und arbeite mich gerade in µC 
ein. Wenn ich mich richtig belesen habe ist der RAM fuer Variablen da, 
also sage mir warum ich ihn nicht ver(sch)wenden soll. Wie weiterhin 
schon beschrieben sind das alle Variablen die ich habe mehr gibt es 
erstmal nicht.

Beitrag "MSP430 - Stack & Heap im Projekt" <-- sowas hilft dann doch ein 
bisschen mehr meinem Verstaendnis, aber nach dieser definition bin ich 
mit meinen Variablen immer noch im gruenen Bereich.

@christian , msp430-gcc -v sagt mir das es die Version 3.2.3 ist.
Naja, mal weiterschaun.

MfG
Tilo

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Der Stack läuft ja automatisch von oben los, die Variablen von unten.

Nö, von unten kommt der Heap. Statische bzw. globale Variablen werden 
aber nicht vom Heap alloziert, sondern liegen im .text-Segment (oder wie 
auch immer das beim jeweiligen Compiler heißen mag).

Deine Variablen sind allesamt globale Variablen; der (Rest) Speicher 
muss aber für Heap & Stack ausreichen.
Betrachte ich Deinen Code, so wird der Stack ausschließlich für die 
Interruptroutine (genauer: deren Rücksprungadresse & Register) genutzt, 
nicht aber für automatische Variablen. Du könntest also die Stackgröße 
reduzieren, da darauf nicht viel los ist. Den Heap nutzt Du überhaupt 
nicht (keine dynamische Speicherverwaltung).

PS: Lege nicht zu viel Augenmerk auf das "sch" ...


von Tilo S. (thesurfer)


Lesenswert?

@rufus danke dein Kommentar hat doch was gebracht, ich hab mich bisschen 
mehr mit den einstellungen im cce auseinandergesetzt und jetzt baut er 
es so wie ich es will. Nun kommt das debuging dran um zu sehen ob ich 
irgendwo ein ueberlauf hab.

Um deine Frage zu beantworten, dem stack hab ich erstmal nur 16 Byte 
zugewiesen.

Was ich damit sagen will ich hab es erstmal geschafft und brauch den 
msp-gcc doch nicht :) .

Danke fuer eure Hilfe.
Tilo

// edit, okay warst schneller mit deinem Post :)

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.