Diese Software errechnet den gesamten RAM Verbrauch einer Software
(inkl. Stack!) und erstellt eine Datei mit der Baumstruktur welche
Funktion welche aufruft.
Dazu wird die vom Compiler erstellte ELF Datei mittels der ELFIO Lib
eingelesen, der Maschinencode, die Symboltabelle (welche Funktion an
welcher Adresse steht) und die globale Variablengröße extrahiert.
Nun spielt die Software das Programm einmal komplett durch, betrachtet
aber nur calls und andere Stack manipulierende Befehle. So wird der
maximale Stackverbrauch ermittelt.
Das funktioniert für "normale" Programme ganz gut, es gibt allerdings
ein paar Situationen in denen die Software scheitert (diese erzeugen
eine Warning):
- icalls (Program Pointer): Da diese erst zur Laufzeit ermittelt werden,
können diese nicht ausgeführt werden.
- rekursive Funktionen: Da diese eine Endlosschleife bewirken, werden
auch diese nicht ausgeführt.
- nested Interrupts. Hier gilt ähnliches wie bei rekursiven Funktionen.
Solange keine der obigen Situationen auftreten, sollte die Berechnung
exakt sein (falls ich nicht irgendeinen Fehler eingebaut habe.)
Diese Software ist nicht wirklich ausgereift! Eigentlich war es eine
quick&dirty Lösung um einen Fehler zu finden (den ich auch gefunden
habe: Es lag tatsächlich am Stack!).
Da ich die Software aber als sehr nützlich erachte, stelle ich das
Programm inkl Source hier rein. Der Code ist aber alles andere als
ordentlich programmiert.
In der Software habe ich aus Gründen der Einfachheit etliche Annahmen
getroffen (die einen Error erzeugen wenn sie nicht zutreffen, bzw. das
Programm abstürzt) wie z.B.
- eine Abschätzung der Flashgröße (notwendig für die rjmp/rcall Sprünge
über die Flashgrenze hinweg)
- der Code steht in der Section die .text heißt
- der Einstiegspunkt ist die Funktion die in der Symboltabelle main
heißt
- bestimmte Befehlskombinationen mit dem der Compiler Stack belegt (in
rx,SPL/SPH, sbiw rx, n)
- und noch ein paar weitere.
Ich habe das Programm ein wenig getestet, mit allen getesteten
Programmen funktionierte die Software bei mir (was natürlich nicht
heißt, dass es mit allen Compilerversionen auch wirklich geht). Falls
jemand ein Programm hat das nicht laufen sollte, bitte das gesamte
Projekt (Source, lst, lss, elf Dateien) als zip hier posten. Falls ich
Zeit habe, werde ich versuchen das Problem zu lösen.