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
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).
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.