ist der flash voll, meckert dein flash tool
ist der ram schon reichlich voll wirds dramatisch
variablen die du in methoden verwendest werden vom linker meist hochgradig optimiert (z.b. doppelnutzung bei code pfaden die nie gleichzeitig ausgeführt werden) und an den anfang des RAM gelegt
globale variablen werden dahinter angelegt
methodenaufrufe und deren parameter und die register die zum rechnen verwendet werden werden auf den sog. stack gelegt
der stack wird vom ende des ram nach vorne geschrieben (rückwärts) und wenn er groß genug ist überschreibt er ohne vorwarnung deine globalen variablen (sog. stackobverflow) aber der tiny is dumm und merkt das nicht!
wenn also deine globalen variablen rum spinnen oder der controller nach dem beenden einer methode plötzlich ins nirvana springt und mist ausführt wird dir wohl der ram ausgegenagen sein
konstanten die du definierst kannst du zwar mit PROGMEM (PROGMEM uint8_t someTextConstant="Hello"in den flasch schreiben um RAM zu sparen aber der zugriff auf sog. progmem variablen ist tückisch, du kannst sie als einzelne variablen kopieren aber wenn du ein array kopieren willst must du memcpy_P benutzen statt memcpy ... es gibt diverse methoden die mit _P enden extra für ROM konstanten
kontanten in den RAM zu laden bringt rein garnichts für mehr ROM, der inhalt der variablen steht trotzdem im flash, denn die variablen müssen erstmal erzeugt werden, das bringt dir ausschließlich geschwindigkeitsvorteile weil ROM konstanten mehrere takte brauchen um sie für die operation zu laden
versuch mal deine optimierungsstufe zu ändern, mit dem aktuellen AVR GCC der mit atmel studio 7 kommt habe ich BESTE erfahreungen mit "-oS" gemacht (es gibt noch -o1 für standard optimierung, -o2 für kompakteren code und kleinen RAM, -o3 für maximal schnellen code und -oS für minimale flash größe)
Lesezeichen