Guten tag forumsteilnehmer, ich habe ein problem das verhalten meines µC zu interpretieren. In meinem programm sollen möglicht viele messwerte in einem globalen vektor abgelegt und danach von versch. funktionen weiterverarbeitet werden. Ich habe nun das problem auf zwei unterschiedliche arten gelöst die eigentlich zum selben ergebnis führen sollten: -definition des vektors als static bevor das main-programm beginnt: Problem: das programm wird ca 10kb groß und die demoversion von µVision verweigert mir das runterladen auf den µC. -dynamische speicherverwaltung nach dem unten aufgeführten muster. anz- steht für die anzahl der 8-byte spiecherplätze(double). der lpc2294 verfügt über 16kb-ram der auch belegbar ist, bei anz > 1022 geht gar nix mehr (sind ja auch zwei vektoren). Problem: in meinem eigentlichen programm geht schon ab anz > 25 gar nix mehr, bzw die aus aaa und bbb errechneten werte sind quatsch. wieso ist das so? Gruß t.heimberg #include <stdio.h> #include <stdlib.h> /* I/O Functions */ #include <LPC22XX.H> /* LPC22XX Peripheral Registers */ double *aaa,*bbb; int anz=1020; extern void init_serial (void); void delay (void) { /* Delay Function */ unsigned long x; for (x = 0; x < 400000; x++); } int main (void) { init_serial(); /* Initialize Serial Interface */ IODIR0 = 0x00000100; aaa=malloc(anz*8); bbb=malloc(anz*8); if (aaa==0 || bbb==0) { printf ("nein\n"); IOCLR0 = 0x00000100; /* Turn LED On (P0.8 0) */ delay(); IOSET0 = 0x00000100; /* Turn LED Off (P0.8 = 1) */ } if (aaa!=0 || bbb!=0) { printf ("ja\n"); IOCLR0 = 0x00000100; /* Turn LED On (P0.8 = 0) */ delay(); IOSET0 = 0x00000100; /* Turn LED Off (P0.8 = 1) */ } memset(aaa,0,anz*8); memset(bbb,0,anz*8); while(1); }
> -definition des vektors als static bevor das main-programm beginnt: > Problem: das programm wird ca 10kb groß und die demoversion von µVision > verweigert mir das runterladen auf den µC. Normalerweise müsste ein guter Compiler dadurch die Größe des Binaries nicht aufblähen, (hast du den GCC? der ist definitiv kein guter Compiler) es sei denn, du initialisierst das Array mit unterschiedlichen Werten, dann muß er natürlich alles mitschleppen. Ich würde es über den Linker regeln, also eine entsprechend große RAM-Section definieren, die vom C-Code, Stack, etc. nicht benutzt wird. Dynamischen Speicher (via malloc) wirst du wohl nicht brauchen, weil der Speicher ja sowieso ständig vorhanden sein soll.
Thorsten Heimberg wrote: > Problem: das programm wird ca 10kb groß und die demoversion von µVision > verweigert mir das runterladen auf den µC. Platzgrenzen sind bei Demo-Compilern meist auf den Code bezogen. > int anz=1020; > aaa=malloc(anz*8); > bbb=malloc(anz*8); Gibt schon vor anz=1022 Mist, weil dir garantiert der Stack überläuft, der muss nämlich auch noch ins RAM passen. Vom malloc ist abzuraten weil man keinen Überblick über die Speicherbelegung hat. > double *aaa,*bbb; Fliesskommarechnung benötigt Laufzeitfunktionen, somit deutlich Code-Speicher. Sollte man so weit wie möglich vermeinden, wenn es auf Speicher ankommt. > void delay (void) { /* Delay Function */ > unsigned long x; > > for (x = 0; x < 400000; x++); > } Wird je nach Compiler komplett wegoptimiert, weil aus seiner Sicht völlig sinnfrei. > printf ("nein\n"); printf() mitsamt der dahinter liegenden Bibliothek ist einer der grössten Speicherfresser, die man auf Microcontrollern finden kann.
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.