Si vous voulez vraiment recurer (et comme @jippie l'a dit, c'est une mauvaise idée; message subliminal: ne le faites pas ) et que vous voulez savoir combien vous pouvez recurer, alors vous devrez effectuer des calculs et des expériences; vous n'en aurez généralement qu'une approximation car cela dépend beaucoup de l'état de la mémoire au moment où votre fonction récursive sera appelée.
Pour cela, vous devez d'abord savoir comment la SRAM est organisée dans l'Arduino basé sur AVR (cela ne s'appliquera pas, par exemple, à l'Arduino Galileo d'Intel). Le schéma suivant d'Adafruit le montre clairement:
Ensuite, vous devez connaître la taille totale de votre SRAM (dépend du microcontrôleur Atmel, d'où le type de carte Arduino que vous avez).
Sur ce diagramme, il est facile de déterminer la taille du bloc de données statiques tel qu'il est connu au moment de la compilation et ne changera pas plus tard.
La taille du segment de mémoire peut être plus difficile à connaître car elle peut varier au moment de l'exécution, selon les allocations de mémoire dynamique ( malloc
ou new
) effectuées par votre croquis ou les bibliothèques qu'il utilise. L'utilisation de la mémoire dynamique est assez rare sur Arduino, mais certaines fonctions standard le font (le type l' String
utilise, je pense).
Pour la taille de la pile , elle variera également pendant l'exécution, en fonction de la profondeur actuelle des appels de fonction (chaque appel de fonction prend 2 octets sur la pile pour stocker l'adresse de l'appelant) et du nombre et de la taille des variables locales, y compris les arguments passés ( qui sont également stockés sur la pile ) pour toutes les fonctions appelées jusqu'à présent.
Supposons donc que votre recurse()
fonction utilise 12 octets pour ses variables et arguments locaux, puis chaque appel à cette fonction (le premier d'un appelant externe et les appels récursifs) utilisera des 12+2
octets.
Si nous supposons que:
- vous êtes sur Arduino UNO (SRAM = 2K)
- votre esquisse n'utilise pas d'allocation de mémoire dynamique (pas de tas )
- vous connaissez la taille de vos données statiques (disons 132 octets)
- lorsque votre
recurse()
fonction est appelée à partir de votre esquisse, la pile actuelle fait 128 octets de long
Il vous reste alors des 2048 - 132 - 128 = 1788
octets disponibles sur la pile . Le nombre d'appels récursifs à votre fonction est donc 1788 / 14 = 127
, y compris l'appel initial (qui n'est pas récursif).
Comme vous pouvez le voir, c'est très difficile, mais pas impossible de trouver ce que vous voulez.
Un moyen plus simple d'obtenir la taille de pile disponible avant l' recurse()
appel serait d'utiliser la fonction suivante (trouvée sur le centre d'apprentissage Adafruit; je ne l'ai pas testée moi-même):
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Je vous encourage fortement à lire cet article au centre d'apprentissage Adafruit.