Se você realmente deseja se retribuir (e como @jippie disse que é uma péssima idéia; mensagem subliminar: não faça isso ) e quer saber o quanto você pode retribuir, será necessário realizar alguns cálculos e experimentos; Além disso, você geralmente terá apenas uma aproximação, pois depende muito do estado da memória no momento em que sua função recursiva será chamada.
Para isso, você deve primeiro saber como a SRAM é organizada no Arduino baseado no AVR (não se aplica, por exemplo, ao Arduino Galileo da Intel). O diagrama a seguir da Adafruit mostra claramente:
Então você precisa saber o tamanho total da sua SRAM (depende do Atmel MCU, portanto, que tipo de placa Arduino você possui).
Neste diagrama, é fácil descobrir esse tamanho do bloco Static Data , pois é conhecido em tempo de compilação e não será alterado posteriormente.
O tamanho da pilha pode ser mais difícil de saber, pois pode variar em tempo de execução, dependendo das alocações de memória dinâmica ( malloc
ou new
) executadas pelo seu esboço ou pelas bibliotecas que ele usa. O uso de memória dinâmica é bastante raro no Arduino, mas algumas funções padrão o fazem (o tipo String
usa, eu acho).
Para o tamanho da pilha , ele também varia durante o tempo de execução, com base na profundidade atual das chamadas de função (cada chamada de função ocupa 2 bytes na pilha para armazenar o endereço do chamador) e o número e tamanho das variáveis locais, incluindo argumentos passados ( que também são armazenados na pilha ) para todas as funções chamadas até agora.
Então, vamos supor que sua recurse()
função use 12 bytes para suas variáveis e argumentos locais, então cada chamada para essa função (a primeira de um chamador externo e a recursiva) usará 12+2
bytes.
Se supusermos que:
- você está no Arduino UNO (SRAM = 2K)
- seu sketch não usa alocação dinâmica de memória (sem Heap )
- você sabe o tamanho dos seus dados estáticos (digamos 132 bytes)
- quando sua
recurse()
função é chamada do esboço, a pilha atual tem 128 bytes
Então você fica com 2048 - 132 - 128 = 1788
os bytes disponíveis na pilha . O número de chamadas recursivas para sua função é 1788 / 14 = 127
, portanto , incluindo a chamada inicial (que não é recursiva).
Como você pode ver, isso é muito difícil, mas não impossível de encontrar o que você deseja.
Uma maneira mais simples de obter o tamanho da pilha disponível antes da recurse()
chamada seria usar a seguinte função (encontrada no Adafruit learning center; eu mesmo não testei):
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
É altamente recomendável que você leia este artigo no Adafruit learning center.