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
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
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.
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 :) .
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.
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
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
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
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
Hiho, ohne genauer hinzuschauen, Du hast leider nur 128 Byte RAM anstatt Deiner angenommenen 256 Byte. Kann es vielleicht daran liegen ? :-)
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.
Laut GCC benötigt das Programm 78 Byte RAM, (s.o.) daran sollte es nicht liegen.
???? 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
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?
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.
@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
> 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" ...
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.