instabilität WinAVR und ATmega8535

Gast #410736
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
Gast #410738
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.
Gast #410739
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
Gast #410740
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.
Moderator Persönliche Seite #410742
>  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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.