Si realmente desea recurrir (y como @jippie dijo que es una mala idea; mensaje subliminal: no lo haga ) y desea saber cuánto puede repetir, entonces tendrá que realizar algunos cálculos y experimentos; Además, generalmente solo tendrá una aproximación, ya que depende mucho del estado de la memoria en el momento en que se llamará a su función recursiva.
Para esto, primero debe saber cómo se organiza SRAM dentro de Arduino basado en AVR (no se aplicará, por ejemplo, al Arduino Galileo de Intel). El siguiente diagrama de Adafruit lo muestra claramente:
Entonces necesita saber el tamaño total de su SRAM (depende de Atmel MCU, de ahí qué tipo de placa Arduino tiene).
En este diagrama, es fácil descubrir el tamaño del bloque de datos estáticos , ya que se conoce en tiempo de compilación y no cambiará más adelante.
El tamaño del montón puede ser más difícil de conocer ya que puede variar en tiempo de ejecución, dependiendo de las asignaciones de memoria dinámica ( malloc
o new
) realizadas por su boceto o las bibliotecas que utiliza. Usar memoria dinámica es bastante raro en Arduino, pero algunas funciones estándar lo hacen (el tipo lo String
usa, creo).
Para el tamaño de la pila , también variará durante el tiempo de ejecución, en función de la profundidad actual de las llamadas a funciones (cada llamada a la función toma 2 bytes en la pila para almacenar la dirección de la persona que llama) y el número y el tamaño de las variables locales, incluidos los argumentos pasados ( que también se almacenan en la Pila ) para todas las funciones llamadas hasta ahora.
Supongamos que su recurse()
función usa 12 bytes para sus variables y argumentos locales, luego cada llamada a esta función (la primera de un llamador externo y las recursivas) usará 12+2
bytes.
Si suponemos que:
- estás en Arduino UNO (SRAM = 2K)
- su boceto no usa asignación de memoria dinámica (sin montón )
- conoce el tamaño de sus datos estáticos (digamos 132 bytes)
- cuando
recurse()
se llama a su función desde su boceto, la pila actual tiene una longitud de 128 bytes
Luego te quedan 2048 - 132 - 128 = 1788
bytes disponibles en la Pila . El número de llamadas recursivas a su función es 1788 / 14 = 127
, por lo tanto , incluida la llamada inicial (que no es recursiva).
Como puede ver, esto es muy difícil, pero no imposible de encontrar lo que desea.
Una forma más simple de obtener el tamaño de pila disponible antes de recurse()
llamar es utilizar la siguiente función (que se encuentra en el centro de aprendizaje Adafruit; no lo he probado yo mismo):
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Le recomiendo que lea este artículo en el centro de aprendizaje Adafruit.