mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR-Assembler max. RAM-Bedarf ermitteln


Autor: Andreas T. (andyt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich schreibe gerade in AVR-Studio ein Assemblerprogramm welches
das RAM des ATMega8 maximal nutzen soll/muß (Ringspeicher usw...).
Wenn ich so bei 1005 bytes Nutzung laut AVR-Studio angekommen bin, kommt 
es vor, daß der uC sich gelegentlich "aufhängt".

Welche Möglichkeiten gibt es, den max. RAM-Bedarf im voraus zu 
ermitteln? Das Problem ist, daß der Fehler manchmal Stunden lang nicht 
auftritt und man denkt, jetzt reicht das RAM.

Evtl. könnte man an geeigneter Stelle im RAM eine Testvariable einbauen 
und
diese auf Konstanz überwachen. Wo müßte die am geschicktesten hin 
(RAMEND-?)?

Gruß
Andreas

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist ja der Stack am oberen Ende des RAM. Wie weit der nach 
unten wandert ist kaum abschätzbar.

Benutze doch zum Test einen kleinen Ringspeicher, pushe und pope am 
Anfang des Programms 50 mal ein Bitmuster von vielleicht 0x55. Nach 
langer Laufzeit kannst du dann nachsehen bis wohin dieses Bitmuster im 
oberen RAM zerstört wurde.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende dafür zu Programmbeginn eine Schleife, die das gesamte Ram 
nullt.  Bei den geringen Ramgrößen tut das zur Initialisierungszeit 
nicht weh.  Ein Ram-Speicherdump später zeigt dann schnell, wie weit 
herunter das Stack bisher gewandert ist (wie hoch die Nullen noch 
reichen).

Autor: Fump (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zusätzlich zu den obigen Tipps musst Du aber diese Situation

>Das Problem ist, daß der Fehler manchmal Stunden lang nicht
>auftritt und man denkt, jetzt reicht das RAM.

reproduzierbar machen. Sonst meinst Du wieder das es reicht und es 
reicht dann nicht.

Abgesehen davon ist das ja auch schon ein Hinweis. So wenig RAM wie in 
diesem Fall, darfst Du dem Stack dann nicht lassen.

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Solange, wie du keine Interrupts verwendest, kannst du sehr mühselig 
allerdings deinen RAM für den Stack berechnen. Laufen Interrupts, ist's 
nicht mehr berechenbar, bestenfalls kann man schätzen. Aber nun die 
Frage, wofür soviel RAM? Ist er wirklich notwändig, oder ließe sich 
über andere Methoden der benötigte Speicher klein halten. Könnte ein 
Ringspeicher Abhilfe schaffen? Ich kann es nicht beurteilen, aber ein µC 
ist nun mal kein PC. Daher ist man gezwungen, seinen Speicher im RAM 
eben nicht allzu üppig in Gebrauch zu nehmen.
Gruß oldmax

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oldmax schrieb:
> Hi
> Solange, wie du keine Interrupts verwendest, kannst du sehr mühselig
> allerdings deinen RAM für den Stack berechnen.

Aber sehr müselig, schon bei Programmen mit relative wenig Komplexität 
gar nicht mehr.  Denn dafür müsstest Du genau nachvollziehen können, 
welche Pfade Dein Programm beschreitet, wann also wer unter welchen 
Bedingungen wen ruft.  Schon mit einer überschaubaren Anzahl von 
Eingangsgrößen, die das Programm beeinflussen, wird das so komplex (die 
zeitliche Abhängigkeit kommt ja dazu), dass sich das mit vertretbarem 
Aufwand nicht mehr rechnen lässt.

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
>Aber sehr müselig, schon bei Programmen mit relative wenig Komplexität
>gar nicht mehr.  Denn dafür müsstest Du genau nachvollziehen können,
>welche Pfade Dein Programm beschreitet
ASM-Programme die nicht nur hingewürfelt werden, sondern mit
System erstellt werden, sind absolut überschaubar.
Kompliziert wird es erst bei rekursiven calls und sei innerhalb von 
ISR's.
Ansonsten maximale call_tiefe(+push) bestimmen + max_ISR_Stackbedarf,
zusammenrechnen und gut ist.

Viel Erfolg, Uwe

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.