www.mikrocontroller.net

Forum: Compiler & IDEs instabilität WinAVR und ATmega8535


Autor: Adam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Adam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Adam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Adam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tip mit Stack Overflow.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.