Hallo, ich arbeite gerade an einem recht speicher-aufwändigen Projekt und hätte gern mal gewusst, ob es eine Möglichkeit den maximal benötigten Speicher eines Programms bestimmen zu lassen (evtl. auch inkl. dynamisch allokierten Speicher per malloc()). Nun gibt es ja beim Kompilieren mit dem avr-gcc die "AVR Memory Usage"-Ausgabe und da gibt mir die "Data"-Angabe Auskunft über den (statischen) Speicherverbrauch. Doch was genau bedeutet diese Angabe? Ist Sie das Maximum? Ist da schon Platz für Rücksprungadressen, Parameter, etc. mit einkalkuliert? Ich hoffe ich konnte mein Anliegen einigermaßen klar vermitteln ;) Gruß Sven
Gast
#2424864
Der statische Speicherverbrauch ist der statische Speicherverbrauch. Der enthält nur die globalen und statischen Vaiablen, sonst nichts. Alles, was erst zur Laufzeit auf dem Stack oder heap angelegt wird, ist da nicht enthalten. Eine einfache rechnderische Methode, den dynamischen Speicherbedarf zu bestimmen, gibt es nicht. Da hilft nur, entweder von Hand den worst-case zu ermitteln, oder zur Laufzeit Stack und heap zu überwachen. Oliver
Oliver schrieb: > [...] oder zur Laufzeit Stack und heap zu überwachen. Und die geht das?
Gesamten speicher auf einen bestimmten wert initialisieren, programm laufen lassen und danach schaun, bis wohin der Speicher geändert wurde. Von oben müsste der Stack Daten geändert haben, von unten der Heap. Irgendwo zwischendrin gibts ungeänderte Bytes. Benedikt hat in der Codesammlung auch mal ein kleines Tool veröffentlich um den RAM-verbrauch zu berechnen. Heißt glaub ich Stack Viewer. Aber ich weiß nicht, ob das mit malloc umgehen kann, denke aber ehr nicht. Der Stack ist aber drin, solange du keine Rekursion verwendest. Sebastian
MoinMoin, ich hatte bei der Implementierung meines AVR-BASIC-Interpreters mal ein ähnliches Verlangen und wollte herausbekommen, wie so die Speicherbelegung in bestimmten Situationen ist. Nach einigem Rumsuchen im Netz ist dies entstanden (zusammenkopiert) worden:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
Dabei liefert get_mem_free() den derzeit freien Speicher zwischen Stack und Heap. get_mem_unused() liefert die Speichergröße, die noch nicht "angerührt" wurde. Allerdings funktioniert dies dann aber nicht mehr, wenn man mal malloc() aufgerufen hat, weil dann das initialisierte Pattern am "Ram-Ende" überschrieben wird. Grüße Uwe
Besten Dank für die Antworten. Ich werde das mal ausprobieren! Gruß Sven
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.