Hallo, Ich habe ein folgendes Problem und weiss nicht mehr weiter. Das Verhalten von Atmel ist merkwürdig. in Meinem Program benutze ich eine statische Variable dir mir den aktuellen Zustand des Automaten anzeigt. Die Software ist schon 4kB gross. jetzt wollte ich es noch mehr erweitern dabei wird der zustand ausgelesen und nicht verändert... der rest der Software wurde nich angerührt sie läuft perfekt doch durch Zufügen des neuen Codes wird die statische variable willkürlich geändert...obwohl keine Änderung veranlasst wurde... Auch wenn ich auch ein Stück Code reinsetzte dass nicht ausgeführt wird z.B eine Funktion die nie ausgeführt wird. Entferne ich den Code läuft das Program wieder. Kann es sein das der Speicher schon so voll ist dass beim Ausführen einige Variablen aus Platzmangel überschrieben werden? Der Atmel hat doch 8kB speicher.... Danke für eure Hilfe
> Der Atmel hat doch 8kB speicher....
ROM, nicht RAM. Davon hat er nur 512 Bytes. Wie viel davon du
bereits statisch verbrätst, solltest du am Ende des Compilierens
gesagt bekommen. Hinzu kommt noch der Verbrauch an Stack, den
musst du selbst abschätzen.
case DISPLAY: SetState(SETUP); eeprom_write_byte(0x02,ShowSensors); LCD_WriteData("**DisplSensors Set**"); DelayMs(500); DisplayOption(SetupOption); break; /*case SENDFREQ: SetState(SETUP); LCD_WriteData("**SendFreq Set**"); DelayMs(500); DisplayOption(SetupOption); break;*/ hier ein Beispiel... Das Program läuft 100% ohne den auskomentierten Teil füge ich dieses Teil läuft es nicht mehr. Es kommen schon Fehler bevor die case Anweisung ausgeführt wird. SENDFREQ ist eins der Zustände... aber der Zustand wird schon vorher instabil so dass die anderen case Anweisungen nich mehr funktionieren. Lösche ich nun die 5 zeilen läuft alles wieder. Der SENDFREQ Zustand befindet sich an anderen stellen und alles ist in Ordnung nur die 5 Zeilen haben so ein grawierenden Einfluss. Wieso ist das so? mache ich da was falsch mit den statischen variablen.
hier ist der auszug des verwendeten speichers mit der case anwiesung Size after: main.elf : section size addr .text 3922 0 .data 434 8388704 .bss 45 8389138 .noinit 0 8389183 .eeprom 0 8454144 .stab 876 0 .stabstr 132 0 .debug_aranges 160 0 .debug_pubnames 1024 0 .debug_info 3705 0 .debug_abbrev 1733 0 .debug_line 4368 0 .debug_str 1165 0 Total 17564
Der Datenspeicher ist ziemlich voll. Könnte ein Stack Overflow sein. Es bringt übrigens i.d.R. wenig, irgendwelche nichtssagenden Codeschnipsel zu schicken mit Aufrufen von irgendwelchen Funktionen, die außer Dir niemand kennt.
> LCD_WriteData("**DisplSensors Set**"); > LCD_WriteData("**SendFreq Set**"); 38 Bytes (oder 7,4 %) zusätzlicher RAM-Verbrauch, weil du deine Debugstrings alle im RAM hast. Das kann man auf einem ,,großen'' Prozessor (ATmega128, ATmega1281) locker machen, weil sich der Debug-Code so einfacher schreiben lässt, wenn man aber wie du an die Grenzen des RAM st\ßt, sollte man den Krempel komplett in den ROM auslagern. Dazu musst du eine Funktion LCD_WriteData_P() schreiben, die den String aus'm ROM popelt, und die Aufrufe schreiben in der Art: LCD_WriteData(PSTR("**DisplSensors Set**")); Ein Editor mit "advanced search and replace features" (zum Beispiel mittels regulärer Ausdrücke) erledigt das in wenigen Sekunden.
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.