Wenn Sie wirklich wiederkehren möchten (und wie @jippie sagte, ist es eine schlechte Idee; unterschwellige Meldung: Tun Sie es nicht ) und wissen möchten, wie viel Sie wiederkehren können, müssen Sie einige Berechnungen und Experimente durchführen. Außerdem haben Sie im Allgemeinen nur eine Annäherung, da dies stark vom Speicherstatus zum Zeitpunkt des Aufrufs Ihrer rekursiven Funktion abhängt.
Zu diesem Zweck sollten Sie zunächst wissen, wie SRAM in AVR-basiertem Arduino organisiert ist (dies gilt beispielsweise nicht für Arduino Galileo von Intel). Das folgende Diagramm von Adafruit zeigt es deutlich:
Dann müssen Sie die Gesamtgröße Ihres SRAM kennen (hängt von der Atmel-MCU ab, daher welche Art von Arduino-Karte Sie haben).
In diesem Diagramm ist es einfach, die Größe des statischen Datenblocks zu ermitteln, da dieser zur Kompilierungszeit bekannt ist und sich später nicht mehr ändert.
Die Größe des Heapspeichers kann schwieriger zu ermitteln sein, da sie zur Laufzeit variieren kann, abhängig von den dynamischen Speicherzuweisungen ( malloc
oder new
), die von Ihrer Skizze oder den verwendeten Bibliotheken durchgeführt werden. Die Verwendung von dynamischem Speicher ist auf Arduino recht selten, aber einige Standardfunktionen tun dies ( String
ich denke, Typ verwendet ihn).
Die Stack- Größe variiert auch während der Laufzeit, basierend auf der aktuellen Tiefe der Funktionsaufrufe (jeder Funktionsaufruf benötigt 2 Byte im Stack, um die Adresse des Aufrufers zu speichern) und der Anzahl und Größe der lokalen Variablen einschließlich der übergebenen Argumente ( die auch auf dem Stack gespeichert sind ) für alle bisher aufgerufenen Funktionen.
Nehmen wir also an, Ihre recurse()
Funktion verwendet 12 Bytes für ihre lokalen Variablen und Argumente, und jeder Aufruf dieser Funktion (der erste von einem externen Aufrufer und der rekursive) verwendet 12+2
Bytes.
Wenn wir das annehmen:
- du bist auf Arduino UNO (SRAM = 2K)
- Ihre Skizze verwendet keine dynamische Speicherzuordnung (kein Heap )
- Sie kennen die Größe Ihrer statischen Daten (sagen wir 132 Bytes)
- Wenn Ihre
recurse()
Funktion aus Ihrer Skizze aufgerufen wird, ist der aktuelle Stapel 128 Byte lang
Dann verbleiben Ihnen die 2048 - 132 - 128 = 1788
verfügbaren Bytes auf dem Stack . Die Anzahl der rekursiven Aufrufe Ihrer Funktion beträgt somit 1788 / 14 = 127
einschließlich des ersten Aufrufs (der kein rekursiver Aufruf ist).
Wie Sie sehen, ist es sehr schwierig, aber nicht unmöglich, das zu finden, was Sie suchen.
Eine einfachere Möglichkeit, die zuvor verfügbare Stack-Größe abzurufen, recurse()
ist die Verwendung der folgenden Funktion (im Adafruit Learning Center verfügbar ; ich habe sie nicht selbst getestet):
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Ich empfehle Ihnen nachdrücklich, diesen Artikel im Adafruit Learning Center zu lesen .