Also mir ist der Unterschied zwischen den verschiedenen Speicherarten jedenfalls klar:
0) Register
1) RAM, die Atmels haben nur SRAM, kein DRAM, hier liegen Variablen. Inhalte gehen nach Strom abschalten verloren. Nicht nach Reset!!!
2) EEPROM, persistenter Speicher für Daten die das Programm kontrolliert
3) Flash, persistenter Speicher für das Programm
Das kompilierte C Programm wird im Flash gespeichert. Wenn da der Platz nicht reicht, dann kann man das Programm schon gar nicht sinnvoll in den Prozessor schreiben. Das Programm wird immer im Flash ausgeführt. Nur die Variablen kommen ins RAM.
Zur Laufzeit kann es sein, daß das RAM nicht reicht. Das liegt daran, daß der Stack und der Heap von verschiedenen Seiten allokiert werden. Sobald man zuviel Platz verbraucht kommen sich Stack und Heap in die Quere. Danach geht einiges (bzw. so ziemlich alles) schief.
Ob noch Platz ist ermittle ich so:
void free_dump() {
uint8_t *heapptr;
uint8_t *stackptr;
stackptr = (uint8_t *)malloc(4); // use stackptr temporarily
heapptr = stackptr; // save value of heap pointer
free(stackptr); // free up the memory again (sets stackptr to 0)
stackptr = (uint8_t *)(SP); // save value of stack pointer
// print("HP: ");
pgm_print(PSTR("HP: "));
println((int) heapptr, HEX);
// print("SP: ");
pgm_print(PSTR("SP: "));
println((int) stackptr, HEX);
// print("Free: ");
pgm_print(PSTR("Free: "));
println((int) stackptr - (int) heapptr, HEX);
println();
}
Das ist nicht ganz so gefährlich wie die von ChrisS beschrieben Methode. Die hatte ich früher mal im Einsatz und damit eher schlechte Erfahrungen gemacht. Grund: sie schlägt zu spät an. Ich habe nie analysiert warum genau, aber die Methode oben scheint bisher zuverlaessig zu funktionieren.
pgm_print und print sind Spezialversionen weil ich schon die Print Library rausgekegelt habe (verbraucht unnötig Ram und Flash und bei mir ist es eng). Einfach wieder durch die normalen Serial.prints ersetzen.
Regelmaessig kommt die größte unnötige Rambelegung daher, daß eigentlich konstante Strings im Ram abgelegt werden. Daß kann man mit den "Progmem" Makros beheben.
http://www.arduino.cc/en/Reference/PROGMEMhttp://www.cs.mun.ca/~paul/cs4723/material/atmel/avr-libc-user-manual-1.6.5/pgmspace.htmlDas ist allerdings nichts für Anfänger. Mit den Progmem Makros kann man sich ganz schön selber austricksen. Allerdings holt das mit am Meissten raus.
Was dann auch noch ganz schön reinhaut ist der relativ große Puffer für die serielle Kommunikations.
Die einfachste Massnahme ist grundsätzlich einfach den nächstgrößeren Prozessor zu nehmen. Wenn das nicht geht siehe oben. Wenn Flash das Problem ist --> auf ISP umsteigen und als erstes den Bootloader über die Klippe schieben.
Gruß, Udo