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


von Andreas T. (andyt)


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

von Gast (Gast)


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.

von Hc Z. (mizch)


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

von Fump (Gast)


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.

von oldmax (Gast)


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

von Hc Z. (mizch)


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.

von Uwe (Gast)


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

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.