Forum: Compiler & IDEs instabilität WinAVR und ATmega8535


von Adam (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> 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.

von Adam (Gast)


Lesenswert?

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.

von Adam (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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.

von Adam (Gast)


Lesenswert?

Danke für den Tip mit Stack Overflow.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

>  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
Noch kein Account? Hier anmelden.