Am besten liest man ein .map File gar nicht. ;-)
Normalerweise ist die Symboltabelle (Ausgabe von avr-nm -n, beim
aktuellen WinAVR-Makefile auch in $(TARGET).sym abgespeichert) viel
sinnvoller zu lesen. avr-size -A zeigt die Belegung ebenfalls an.
In der Symboltabelle ist die RAM-Belegung die Differenz zwischen
__bss_end und __data_start.
Aber: die ,,dynamische'' RAM-Belegung läßt sich mittels derartiger
Methoden nicht ermitteln. Stellt sich ja erstmal die Frage, was für
Dich dynamisch belegter RAM ist. Was Du mit malloc() anforderst, mußt
Du schon selbst wissen. malloc-intern gibt es ein paar Variablen, mit
denen man zur Laufzeit (bspw. im Debugger) analysieren kann, wie viel
aktuell belegt ist.
Falls Du damit die Stackbenutzung meinst, kannst Du diese auch nicht
in statischer Form aus so einer Datei holen. Woher sollten diese denn
wissen, wer wann wen aufruft, ob sich Funktionen gar ggf. rekursiv
aufrufen? Das mußt Du schon selbst wissen.
Im generierten Assemblercode (avr-gcc -S) finden sich Kommentare, die
die Belegung der einzelnen Stackframes angeben. Achtung, damit ist
ausdrücklich kein Disassembler gemeint, der kann logischerweise
keine Kommentare des Compilers mehr enthalten... Diese Zahlen können
Dir zusammen mit Deinem Aufrufgraphen für die Funktionen angeben,
wieviel Stack durch all diese verbraucht wird. Natürlich solltest Du
dabei die Interruptroutinen und die von denen gerufenen Funktionen
nicht vergessen...