यदि आप वास्तव में पुनर्विचार करना चाहते हैं (और जैसा कि @jippie ने कहा कि यह एक बुरा विचार है; अचेतन संदेश: यह मत करो ) और यह जानना चाहते हैं कि आप कितना पुनरावृत्ति कर सकते हैं, तो आपको कुछ गणना और प्रयोग करने होंगे; आपके पास भी आम तौर पर इसका केवल एक सन्निकटन होगा क्योंकि यह उस समय स्मृति स्थिति पर बहुत कुछ निर्भर करता है जब आपका पुनरावर्ती कार्य कहा जाएगा।
इसके लिए, आपको पहले पता होना चाहिए कि एवीआर-आधारित अरुडिनो के अंदर SRAM का आयोजन कैसे किया जाता है (यह इंटेल द्वारा Arduino गैलिलियो पर लागू नहीं होगा)। Adafruit का निम्न चित्र स्पष्ट रूप से दिखाता है:
फिर आपको अपने SRAM का कुल आकार जानने की जरूरत है (Atmel MCU पर निर्भर करता है, इसलिए आपके पास किस तरह का Arduino बोर्ड है)।
इस आरेख पर, स्टैटिक डेटा ब्लॉक के ths आकार का पता लगाना आसान है क्योंकि यह संकलन-समय पर जाना जाता है और इसे नहीं बदलेगा।
ढेर आकार, के रूप में यह रनटाइम पर भिन्न हो सकते हैं और अधिक जानना मुश्किल हो सकता है गतिशील स्मृति आवंटन (पर निर्भर करता है malloc
या new
) अपने स्केच या पुस्तकालयों का उपयोग करता है के द्वारा प्रदर्शन किया। Arduino पर डायनामिक मेमोरी का उपयोग करना काफी दुर्लभ है, लेकिन कुछ मानक कार्य इसे करते हैं (प्रकार String
इसका उपयोग करता है, मुझे लगता है)।
के लिए ढेर आकार, यह भी समारोह कॉल की वर्तमान गहराई के आधार पर रनटाइम के दौरान अलग अलग होंगे, (प्रत्येक समारोह कॉल ढेर पर 2 बाइट्स लेता है फोन करने वाले का पता स्टोर करने के लिए) और नंबर और पारित तर्क सहित स्थानीय चर का आकार ( अब तक कहे जाने वाले सभी कार्यों के लिए भी स्टैक पर ) संग्रहीत हैं।
तो मान लीजिए कि आपका recurse()
फ़ंक्शन अपने स्थानीय चर और तर्कों के लिए 12 बाइट्स का उपयोग करता है, तो इस फ़ंक्शन के लिए प्रत्येक कॉल (बाहरी कॉलर से पहला और पुनरावर्ती वाले) 12+2
बाइट्स का उपयोग करेगा ।
अगर हमें लगता है कि:
- आप Arduino UNO (SRAM = 2K) पर हैं
- आपका स्केच डायनेमिक मेमोरी एलोकेशन (कोई ढेर नहीं ) का उपयोग नहीं करता है
- आप अपने स्टैटिक डेटा का आकार जानते हैं (आइए बताते हैं 132 बाइट्स)
- जब आपका
recurse()
फ़ंक्शन आपके स्केच से कॉल किया जाता है, तो वर्तमान स्टैक 128 बाइट्स लंबा होता है
फिर आपको स्टैक2048 - 132 - 128 = 1788
पर उपलब्ध बाइट्स के साथ छोड़ दिया जाता है । आपके फ़ंक्शन में पुनरावर्ती कॉल की संख्या इस प्रकार है , जिसमें प्रारंभिक कॉल (जो पुनरावर्ती नहीं है) शामिल है।1788 / 14 = 127
जैसा कि आप देख सकते हैं, यह बहुत मुश्किल है, लेकिन यह असंभव नहीं है कि आप क्या चाहते हैं।
स्टैक के आकार को प्राप्त करने से पहले recurse()
कहा जाने वाला एक सरल तरीका निम्नलिखित फ़ंक्शन का उपयोग करना होगा (Adafruit Learning Center पर पाया गया; मैंने इसे स्वयं परीक्षण नहीं किया है):
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
मैं आपको Adafruit Learning Center में इस लेख को पढ़ने के लिए प्रोत्साहित करता हूं ।