Maximale Stapelgröße, die für ein C-Programm auf MSP430 benötigt wird

9

In einem C-Programm, das keine Rekursion verwendet, sollte es theoretisch möglich sein, die maximale / ungünstigste Stack-Größe zu ermitteln, die zum Aufruf einer gegebenen Funktion und allem, was sie aufruft, benötigt wird. Gibt es freie, Open-Source-Tools, die dies tun können, entweder aus dem Quellcode oder kompilierte ELF-Dateien?

Gibt es alternativ eine Möglichkeit, die Stack-Frame-Größe einer Funktion aus einer ELF-Datei zu extrahieren, sodass ich versuchen kann, sie manuell zu bearbeiten?

Ich kompiliere für MSP430 mit MSPGCC 3.2.3 (Ich weiß, es ist eine alte Version, aber ich muss es in diesem Fall verwenden). Der zu reservierende Stapelspeicherplatz wird im Quellcode festgelegt und sollte so klein wie möglich sein, damit der übrige Speicher für andere Dinge verwendet werden kann. Ich habe gelesen, dass Sie den Stack-Bereich berücksichtigen müssen, der von Interrupts verwendet wird, aber das System, das ich verwende, berücksichtigt dies bereits - ich versuche herauszufinden, wie viel zusätzlichen Platz zusätzlich hinzugefügt werden muss. Außerdem habe ich gelesen, dass Funktionszeiger dies schwierig machen. An den wenigen Stellen, an denen hier Funktionszeiger verwendet werden, weiß ich, welche Funktionen sie aufrufen können, also könnten diese Fälle manuell berücksichtigt werden, wenn der für die aufgerufenen Funktionen und die aufrufenden Funktionen benötigte Stackspace bekannt ist.

Die statische Analyse scheint zur Laufzeit eine robustere Option als Stack-Painting zu sein, aber es ist eine Option, sie zur Laufzeit zu bearbeiten, wenn es keinen guten Weg gibt, dies statisch zu tun.

Bearbeiten:

Ich habe GCCs -fstack-usage -Flag gefunden, das die Rahmengröße für jede Funktion speichert, während sie kompiliert wird. Leider unterstützt MSPGCC dies nicht. Aber es könnte für jeden nützlich sein, der etwas Ähnliches auf einer anderen Plattform versucht.

    
cjc 01.04.2013, 10:06
quelle

5 Antworten

1

Während die statische Analyse die beste Methode zur Bestimmung der maximalen Stack-Nutzung ist, müssen Sie möglicherweise auf eine experimentelle Methode zurückgreifen. Diese Methode kann Ihnen kein absolutes Maximum garantieren, kann Ihnen aber eine sehr gute Vorstellung von Ihrer Stack-Nutzung geben.

Sie können Ihr Linker-Skript überprüfen, um den Speicherort von __STACK_END und __STACK_SIZE zu ermitteln. Sie können diese verwenden, um den Stapelbereich mit einem leicht erkennbaren Muster wie 0xDEAD oder 0xAA55 zu füllen. Führen Sie Ihren Code durch einen Folter-Test, um sicherzustellen, dass so viele Interrupts wie möglich erzeugt werden.

Nach dem Test können Sie den Stack-Bereich untersuchen, um zu sehen, wie viel vom Stack überschrieben wurde.

    
LogicG8 09.07.2013 03:04
quelle
0

Interessante Frage.

Ich würde erwarten, dass diese Informationen in den Debugging-Daten, die in den Debug-Builds enthalten sind, statisch verfügbar sind.

Ich habe mir kurz den DWARF -Standard angesehen und zwei Attribute für die Funktionen DW_AT_frame_base und DW_AT_static_link , die dies können, angegeben verwendet werden, um "den Rahmen zu berechnen Basis der relevanten Instanz des Unterprogramms das schließt sofort das Unterprogramm oder den Einstiegspunkt ein ".

    
unwind 01.04.2013 10:43
quelle
0

Ich denke, dass das einzige, was zu tun ist, statische Analyse ist. Sie müssen den Speicherbereich für alle nicht statischen lokalen Variablen berücksichtigen, die hauptsächlich Zeiger sind, aber Zeiger, die sowieso im Stapel gespeichert werden. Sie müssen auch Speicherplatz für die aktuelle laufende Adresse in der Datenbank reservieren Aufrufer, wie es vom Compiler auf dem Stapel gespeichert wird, so kann die Kontrolle zum Aufrufer zurückgegeben werden, nachdem Ihre Funktion zurückkehrt, und Sie brauchen auch Platz für alle Ihre Funktionsparameter. Wenn Sie also ein Werkzeug haben, mit dem Sie alle Parameter und Autovariablen zählen und ihre Größe bestimmen können, sollten Sie in der Lage sein, die minimale Stack-Frame-Größe zu berechnen, die Sie benötigen. Bitte beachten Sie, dass der Compiler auch versuchen könnte, Werte auf dem Stack für Ihre spezielle Architektur auszurichten, was die Anforderungen an den Stack-Speicherplatz etwas größer machen könnte, als Sie von dieser Berechnung erwarten würden.

    
quelle
0

Einige eingebettete IDE können während der Laufzeit Informationen zur Stack-Nutzung geben Ich weiß, dass IAR eembedded Workbench es unterstützt.

Beachten Sie, dass Sie berücksichtigen müssen, dass Interrupts asynchron auftreten. Verwenden Sie also das Szenario mit dem größten Stack-Verbrauch und fügen Sie einen Interrupt-Kontext hinzu. Wenn verschachtelte Interrupts wie in ARM-Prozessoren unterstützt werden, müssen Sie dies ebenfalls berücksichtigen.

    
stdcall 01.04.2013 18:51
quelle
0

TinyOS hat einige Arbeiten zur Stapelgrößenanalyse gemacht. Es wird hier beschrieben: Ссылка

Sie unterstützen nur AVR, aber sagen, dass "MSP430 nicht schwer zu unterstützen ist, aber das ist keine super hohe Priorität". In jedem Fall bietet die Seite viele Ressourcen.

    
theamk 03.09.2013 20:42
quelle

Tags und Links