Gerçekten tekrarlamak istiyorsanız (ve @jippie'nin kötü bir fikir olduğunu söylediği gibi, bilinçaltı mesajı: yapmayın ) ve ne kadar para çekebileceğinizi bilmek istiyorsanız, o zaman bazı hesaplama ve deneyler yapmanız gerekir; ayrıca, özyinelemeli fonksiyonunuzun çağrıldığı andaki bellek durumuna çok bağlı olduğu için genellikle sadece bir yaklaşımınız olacaktır.
Bunun için önce SRAM'ın AVR tabanlı Arduino içinde nasıl organize edildiğini bilmelisiniz (örneğin Intel tarafından Arduino Galileo için geçerli değildir). Adafruit'ten aşağıdaki diyagram açıkça göstermektedir:
O zaman SRAM'ınızın toplam boyutunu bilmeniz gerekir (Atmel MCU'ya bağlıdır, bu nedenle ne tür Arduino kartına sahipsiniz).
Bu şemada, derleme zamanında bilindiği ve daha sonra değişmeyeceği için Statik Veri bloğunun boyutunu bulmak kolaydır .
Öbek Zamanında değişebilir olarak boyut dinamik hafıza tahsisleri (bağlı bilmek daha zor olabilir malloc
ya new
da kroki veya kullandığı kütüphaneler tarafından yapılır). Dinamik bellek kullanımı Arduino'da oldukça nadirdir, ancak bazı standart işlevler bunu yapar (tip String
kullanır, sanırım).
İçin yığın boyutu, aynı zamanda, bir işlev arama mevcut derinliğine bağlı olarak, çalışma sırasında değişir ve geçirilen ifade dahil olmak üzere yerel değişkenlerin sayısını ve boyutunu ((her bir işlev arama arayanın adresini depolamak için Stack 2 bayt alır) o da saklanan Yığın şu ana kadar denilen tüm fonksiyonlar için).
Diyelim ki, recurse()
işleviniz yerel değişkenleri ve argümanları için 12 bayt kullanıyor, sonra bu işleve yapılan her çağrı (harici bir arayandan ve özyinelemeli olanlardan ilk) 12+2
bayt kullanacaktır .
Eğer varsayalım:
- Arduino UNO üzerindesiniz (SRAM = 2K)
- çiziminiz dinamik bellek ayırma kullanmıyor ( Yığın yok )
- Statik Verilerinizin boyutunu biliyorsunuz (diyelim ki 132 bayt)
- senin zaman
recurse()
işlevi taslaktan denir, cari Stack 128 byte uzunluğundadır
Sonra Yığın2048 - 132 - 128 = 1788
üzerinde kullanılabilir bayt kalır . Bu nedenle 1788 / 14 = 127
, ilk çağrıyı da içeren (özyinelemeli olmayan) işlevinize özyinelemeli çağrıların sayısı .
Gördüğünüz gibi, bu çok zor, ama ne istediğinizi bulmak imkansız değil.
Daha önce kullanılabilir yığın boyutunu elde etmenin daha basit bir yolu recurse()
aşağıdaki işlevi kullanmaktır (Adafruit öğrenme merkezinde bulunur; kendim test etmedim):
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Adafruit öğrenme merkezinde bu makaleyi okumanızı şiddetle tavsiye ediyorum .