Wie kann ich ermitteln, geeignete stack-und heap-Größen für ARM Cortex, mit C++
Den cortex-M3-Prozessor-startup-Datei können Sie angeben, wie viel RAM gewidmet, den stack und den heap. Für ein c++ code-Basis, gibt es eine Faustregel oder vielleicht ein paar mehr expliziten Weg, um zu bestimmen, die Werte für den stack-und heap-Größen? Zum Beispiel, würden Sie die Anzahl und Größe von einzigartigen Objekten, oder vielleicht verwenden Sie die kompilierte code-Größe?
Dies ist mehr compiler-und runtime-library als spezifische, bezogen auf eine bestimmte CPU-Architektur. Aber die meisten von allen, es ist Ihr code, der bestimmt, Speichernutzung. Verwenden Sie entweder die MMU oder eines Daten-Haltepunkts auf catch-stack-overflows.
mögliche Duplikate von Wie bestimmt die maximale stack-Auslastung?
Cortex-M3 hat keine MMU, aber es hat auch Daten auf hardware-breakpoint-Unterstützung, die helfen kann, während des Tests, aber nicht für die Bereitstellung.
Angesichts der toolchain-spezifischen Komponenten der Clifford ' s Antwort, ich glaube nicht, dass diese funktional ein Duplikat. Eine nützliche Zeiger trotzdem, obwohl.
mögliche Duplikate von Wie bestimmt die maximale stack-Auslastung?
Cortex-M3 hat keine MMU, aber es hat auch Daten auf hardware-breakpoint-Unterstützung, die helfen kann, während des Tests, aber nicht für die Bereitstellung.
Angesichts der toolchain-spezifischen Komponenten der Clifford ' s Antwort, ich glaube nicht, dass diese funktional ein Duplikat. Eine nützliche Zeiger trotzdem, obwohl.
InformationsquelleAutor rmaVT | 2011-03-11
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist nicht eine Funktion des Cortex-M3, sondern der start-up-code Ihres Entwicklungs-toolchain. Es ist der Weg der Keil ARM-MDK standardmäßig start-up-Dateien für den M3 zu arbeiten. Es ist etwas ungewöhnlich; Häufig legen Sie einen stack der Größe, und alle verbleibenden Speicherplatz nach der stack und statische Speicherreservierung durch den linker wird der Haufen; das ist wohl besser, da Sie nicht am Ende mit einem pool von unbrauchbar Speicher. Könnte man ändern, und verwenden Sie eine alternative Regelung, aber Sie müssten wissen, was Sie tun.
Wenn Sie sind unter Keil ARM-MDK, die linker-Optionen --info=stack und --callgraph-Informationen hinzufügen, um die map-Datei, die aids-stack Anforderungsanalyse. Diese und andere Techniken sind beschrieben hier.
Wenn Sie mit einem RTOS oder multi-tasking-kernel, jeder task seinen eigenen stack. Das OS bereitstellen kann, die stack-Analyse-tools, Keil RTX-kernel-viewer zeigt den aktuellen stack-Nutzung, aber keine Spitzen-stack-Auslastung (damit ist meist nutzlos, und es funktioniert nur richtig bei Aufgaben mit Standard-stack-Längen).
Wenn Sie implementieren müssen, um stack-checking-tools selbst, die normale Methode ist, füllen Sie den stack mit einem bekannten Wert, und ab der high-Adresse, überprüfen Sie den Wert, bis Sie den ersten Wert, das ist nicht die fill-byte, das gibt den likley Flut-Marke auf dem stack. Können Sie code implementieren, um dies zu tun, oder Sie können Sie manuell füllen Sie den Speicher aus dem debugger, und überwachen Sie dann die stack-Nutzung im debugger memory-Fenster.
Heap-Anforderung hängt von der Laufzeit-Verhalten des Codes, müssen Sie analysieren, sich selbst allerdings im ARM/Keil Realview, die MemManage Ausnahme-handler wird aufgerufen, wenn C++'s
new
löst eine Ausnahme aus; ich bin nicht sicher, obmalloc()
hat, oder einfach nur NULL zurück. Sie können einen Haltepunkt im exception-handler oder ändern Sie den handler zu emittieren, eine Fehlermeldung zu erkennen, heap Erschöpfung während der Prüfung. Es gibt auch eine __heapstats() - Funktion, die verwendet werden können, um die Ausgabe heap-Informationen. Es hat etwas umständlichen interface, wickelte ich es so:InformationsquelleAutor Clifford
Den kompilierten code Größe wird nicht helfen, da der code nicht ausgeführt wird in der stack noch im heap. Cortex-M3-Geräte sind in der Regel implementiert, die auf mikrocontroller mit eingebauten Blitz und eine relativ kleine Menge an RAM. In dieser Konfiguration wird der code in der Regel aus Flash.
Der heap ist für die dynamische Speicherverwaltung. Zählen der Anzahl eindeutiger Objekte geben Ihnen eine grobe Schätzung, aber Sie haben auch zu berücksichtigen, für andere Elemente, die dynamische Speicher-Allokation (mit der
new
- Schlüsselwort in C++). In der Regel, dynamische Speicherverwaltung vermieden embedded-Systeme für die genaue Grund dafür, dass die heap-Größe ist schwer zu verwalten.Dem Stapel verwendet werden, für die variable übergeben, lokale Variablen und Kontext speichern während der exception-handling-Routinen. Es ist im Allgemeinen schwer zu bekommen ist eine gute Idee, stack-Nutzung, es sei denn, du bist-code reserviert einen großen block von lokalen Speicher oder eine große Objekte. Eine Technik, die helfen kann, ist die Zuweisung aller verfügbaren RAM für den stack. Füllen Sie den Stapel mit einem bekannten Muster (0x00 oder 0xff sind nicht die beste Wahl, da diese Werte Häufig vorkommen), führen Sie das system für eine Weile, dann untersuchen Sie den stack, um zu sehen, wie viel verwendet wurde. Zugegeben, das ist nicht sehr präzise und keine wissenschaftliche Herangehensweise, aber immer noch hilfreich in vielen Fällen.
InformationsquelleAutor semaj
Die neueste version der IAR Compiler hat eine Funktion, die bestimmen, welche stack Größe, die Sie benötigen, basierend auf einer statischen Analyse des Codes (vorausgesetzt, Sie haben keine Rekursion).
Den Allgemeinen Ansatz, wenn Sie nicht über eine genaue Zahl ist so groß, wie Sie können, und dann, wenn Sie anfangen zu laufen aus der Erinnerung, beginnen trimmen der Stapel nach unten, bis Ihr Programm abstürzt aufgrund von einem stack over flow. Ich Wünsche mir, dass sei ein Witz, aber das ist, wie es ist in der Regel getan.
InformationsquelleAutor Mark Lakata
Reduzieren, bis es abstürzt, ist eine schnelle ad-hoc-Weise. Sie können auch füllen den stack mit einem bekannten Wert, sagen, 0xCCCC, und überwachen Sie dann die maximale stack-Auslastung durch abtasten der 0xCCCC.
Es ist nicht perfekt, aber viel besser als die Suche nach einen Absturz.
Die Begründung sein, die Reduzierung der stack-Größe, die nicht garantieren, dass stack-überlauf wird munch etwas "sichtbar".
InformationsquelleAutor charles