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
Gast
#1494276
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.
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).
Gast
#1494306
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.
Gast
#1494327
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
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.
Gast
#1494835
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
Bitte melde dich an, um einen Beitrag zu schreiben.