Jika Anda benar-benar ingin muncul kembali (dan seperti yang dikatakan @jippie itu adalah ide yang buruk; pesan bawah sadar: jangan lakukan itu ) dan ingin tahu seberapa banyak Anda dapat berulang, maka Anda harus melakukan beberapa perhitungan dan percobaan; Anda juga biasanya hanya akan memiliki perkiraan karena tergantung banyak pada kondisi memori pada saat fungsi rekursif Anda akan dipanggil.
Untuk ini, Anda harus terlebih dahulu tahu bagaimana SRAM diatur dalam Arduino berbasis AVR (itu tidak akan berlaku untuk misalnya Arduino Galileo oleh Intel). Diagram berikut dari Adafruit menunjukkannya dengan jelas:
Maka Anda perlu mengetahui ukuran total SRAM Anda (tergantung pada Atmel MCU, maka jenis papan Arduino yang Anda miliki).
Pada diagram ini, mudah untuk mengetahui ukuran blok Data Statis seperti yang diketahui pada waktu kompilasi dan tidak akan berubah nanti.
The Heap Ukuran dapat lebih sulit untuk mengetahui karena dapat bervariasi pada saat runtime, tergantung pada alokasi memori dinamis ( malloc
atau new
) dilakukan oleh sketsa atau perpustakaan menggunakan. Menggunakan memori dinamis sangat jarang di Arduino, tetapi beberapa fungsi standar melakukannya ( String
saya pikir itu menggunakan tipe itu).
Untuk ukuran Stack , ini juga akan bervariasi selama runtime, berdasarkan pada kedalaman panggilan fungsi saat ini (setiap panggilan fungsi membutuhkan 2 byte pada Stack untuk menyimpan alamat pemanggil) dan jumlah dan ukuran variabel lokal termasuk argumen yang diteruskan ( yang juga disimpan di Stack ) untuk semua fungsi yang dipanggil sampai sekarang.
Jadi anggaplah recurse()
fungsi Anda menggunakan 12 byte untuk variabel dan argumen lokalnya, maka setiap panggilan ke fungsi ini (yang pertama dari penelepon eksternal dan yang rekursif) akan menggunakan 12+2
byte.
Jika kita mengira bahwa:
- Anda berada di Arduino UNO (SRAM = 2K)
- sketsa Anda tidak menggunakan alokasi memori dinamis (tidak ada tumpukan )
- Anda tahu ukuran Data Statis Anda (katakanlah 132 byte)
- ketika
recurse()
fungsi Anda dipanggil dari sketsa Anda, tumpukan saat ini adalah 128 byte
Kemudian Anda dibiarkan dengan 2048 - 132 - 128 = 1788
byte yang tersedia di Stack . Dengan demikian, jumlah panggilan rekursif ke fungsi Anda 1788 / 14 = 127
, termasuk panggilan awal (yang bukan merupakan panggilan rekursif).
Seperti yang Anda lihat, ini sangat sulit, tetapi bukan tidak mungkin untuk menemukan apa yang Anda inginkan.
Cara yang lebih sederhana untuk mendapatkan ukuran tumpukan tersedia sebelum recurse()
dipanggil adalah dengan menggunakan fungsi berikut (ditemukan di pusat pembelajaran Adafruit; saya belum mengujinya sendiri):
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Saya sangat menyarankan Anda untuk membaca artikel ini di pusat pembelajaran Adafruit.