mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega16 stürzt ab?


Autor: Christian Kernstock (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Hab da ein etwas umfangreicheres Programm für ein Netzgerät
geschrieben. Das Programm verwendet einige float
Multiplikationen/Divisionen und float-sprintf.  Nun beginnt der
ATmega16 "abzustürzen", wenn ich etwas hinzufüge... Wenn ich
"unwichtigen" bereits funktionsfähigen Code auskommentiere
funktioniert er wieder.  Kann es sein das der (RAM?)Speicher zu wenig
wird? Sprich der Stack irgendwas überschreibt? Wie kann ich das
kontrollieren?
Der avr-gcc sagt (für mich noch unverständliches):

Size after:
main.elf  :
section            size      addr
.text             11248         0
.data               688   8388704
.bss                149   8389392
.noinit               0   8389541
.eeprom               0   8454144
.stab               876         0
.stabstr            132         0
.debug_aranges       20         0
.debug_pubnames     680         0
.debug_info        2368         0
.debug_abbrev       614         0
.debug_line        2233         0
.debug_str         1012         0
.debug_ranges        24     11248
Total             20044

Bin für jede Hilfe dankbar
Christian

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
könntest in die letzte SRAM Stelle nen bestimmten Wert reinschreiben
wenn der sich ändern weißt du das du nen Stacküberlauf hast.

Autor: MasterFX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das deutet eigentlich darauf hin, das der Flash-Speicher zu klein ist.
Guck dir mal die Adressen im Hex-File an und guck ob die noch im
gültigen Bereich liegen.

Autor: Christian Kernstock (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch beiden für die Antworten.

Variable beobachten ist eine gute Idee,  leider hab ich aber keinen
JTag...
Hab mir mal das ganze in AVRStudio angeschaut: der Disasembler  zeigt
mir als letzte beschriebene Stelle die 0x178F also es sollten noch ca.
10kByte frei sein.

mfg
Christian

Autor: MasterFX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Öhm sind das nicht 16Bit Adressen? Dann sollten das eher 12KB sein, das
würde sich dann mit
.text   11248     0
auch decken.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.data und .bss sind im ram

du hast also nur 187 bytes für heap und stack!!! zu 99,99% liegt hier
das problem... irgendwann wird der stack überschrieben und schon
landest du bei einem ret im nirvana...

fall der flash zu klein ist meldet sich normal der compiler und sagt
das...

73

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schließe mich Hans an. Dafür gleich noch ein Lösungstipp: Verwende
statt printf() printf_P().
printf() kann nur Variablen aus dem Ram ausgeben, und diese werden
schon bei Programmstart in den Ram geladen.
printf_P() hingegen liest den auszugebenden Text direkt aus dem Flash.

Autor: Dennis Kleine-Beck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

> du hast also nur 187 bytes für heap und stack!!!

Was für eine Mindestgröße für Heap + Stack ist denn empfehlenswert?
So als Richtwert, "über'n Daumen"

Dennis

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kommt auf das Programm an. Hast du ein Programm, das vollständig
linear abläuft, und nur globale Variablen verwendet, brauchst du
praktisch keinen Stack.
Pro Funktionsaufruf werden mindestens 2 Byte für die Rücksprungadresse
fällig, dazu noch < 20 Byte um Register zu sichern und der Speicher für
die lokalen Variablen in der Funktion. Wenn du viele Variablen an die
Funktion übergibst, landen die auch (ab 10 byte (?)) dort...
Wieviel Speicher du nun wirklich brauchst, hängt von vielen Faktoren
ab, vor allem auch von der möglichen Schachtelungstiefe der Funktionen
(a() ruft b() auf, ruft c() auf...)

Autor: Christian Kernstock (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
printf_P() ist meine neue Lieblingsfunktion geworden :-) brauch jetzt
statt 600Byte nur 40 Byte in der .data section. Und somit rennt der uC
auch wieder stabil.

Vielen Dank an Alle
Christian

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.