Se vuoi davvero fare affidamento (e come ha detto @jippie è una cattiva idea; messaggio subliminale: non farlo ) e vuoi sapere quanto puoi ricorrere, allora dovrai eseguire alcuni calcoli ed esperimenti; inoltre generalmente ne avrai solo un'approssimazione poiché dipende molto dallo stato della memoria nel momento in cui verrà chiamata la tua funzione ricorsiva.
Per questo, dovresti prima sapere come è organizzata SRAM all'interno di Arduino basato su AVR (non si applicherà ad esempio all'Arduino Galileo di Intel). Il seguente diagramma di Adafruit lo mostra chiaramente:
Quindi devi conoscere la dimensione totale della tua SRAM (dipende dalla MCU Atmel, quindi che tipo di scheda Arduino hai).
In questo diagramma, è facile scoprire la dimensione del blocco di dati statici come è noto in fase di compilazione e non cambierà in seguito.
La dimensione dell'heap può essere più difficile da conoscere in quanto può variare in fase di esecuzione, a seconda delle allocazioni di memoria dinamica ( malloc
o new
) eseguite dallo schizzo o dalle librerie che utilizza. L'uso della memoria dinamica è piuttosto raro su Arduino, ma alcune funzioni standard lo fanno (il tipo lo String
usa, penso).
Per le dimensioni dello Stack , varierà anche durante il runtime, in base alla profondità corrente delle chiamate di funzione (ogni chiamata di funzione richiede 2 byte sullo Stack per memorizzare l'indirizzo del chiamante) e il numero e la dimensione delle variabili locali inclusi gli argomenti passati ( che sono anche memorizzati nello Stack ) per tutte le funzioni chiamate fino ad ora.
Supponiamo quindi che la tua recurse()
funzione utilizzi 12 byte per le sue variabili e gli argomenti locali, quindi ogni chiamata a questa funzione (la prima da un chiamante esterno e quelli ricorsivi) utilizzerà i 12+2
byte.
Se supponiamo che:
- sei su Arduino UNO (SRAM = 2K)
- lo schizzo non utilizza l'allocazione dinamica della memoria (no Heap )
- conosci la dimensione dei tuoi dati statici (diciamo 132 byte)
- quando la
recurse()
funzione viene chiamata dallo schizzo, lo Stack corrente è lungo 128 byte
Quindi ti restano 2048 - 132 - 128 = 1788
i byte disponibili nello Stack . Il numero di chiamate ricorsive alla tua funzione è quindi 1788 / 14 = 127
, inclusa la chiamata iniziale (che non è ricorsiva).
Come puoi vedere, questo è molto difficile, ma non impossibile trovare quello che vuoi.
Un modo più semplice per ottenere la dimensione dello stack disponibile prima che recurse()
venga chiamato sarebbe quello di utilizzare la seguente funzione (trovata nel centro di apprendimento di Adafruit; non l'ho testata da sola):
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Ti incoraggio vivamente a leggere questo articolo nel centro di apprendimento di Adafruit.