আপনি যদি সত্যিই পুনরাবৃত্তি করতে চান (এবং @ জিপ্পি বলেছিলেন এটি একটি খারাপ ধারণা; আক্ষেপের বার্তা: এটি করবেন না ) এবং আপনি কতটা পুনরাবৃত্তি করতে পারবেন তা জানতে চান, তবে আপনাকে কিছু গণনা এবং পরীক্ষা-নিরীক্ষা করতে হবে; এছাড়াও আপনার সাধারণভাবে এটির প্রায় একটি পরিমাণ থাকে কারণ এটি আপনার পুনরাবৃত্ত ক্রিয়াকলাপটি যখন ডাকা হবে তখন স্মৃতি অবস্থার উপর এটি অনেকটাই নির্ভর করে।
এর জন্য, আপনাকে প্রথমে জানতে হবে কীভাবে এসআরএএম অ্যাভিআর ভিত্তিক আরডুইনোর অভ্যন্তরে সংগঠিত হয় (এটি উদাহরণস্বরূপ ইন্টেলের দ্বারা আর্দুইনো গ্যালিলিওর ক্ষেত্রে প্রযোজ্য হবে না)। অ্যাডাফুর্টের নিম্নলিখিত চিত্রটি এটিকে পরিষ্কারভাবে দেখায়:
তারপরে আপনাকে আপনার এসআরএএম এর মোট আকার জানতে হবে (আটমেল এমসিইউর উপর নির্ভর করে, সুতরাং আপনার কী ধরণের আরডুইনো বোর্ড রয়েছে)।
এই চিত্রটিতে স্ট্যাটিক ডেটা ব্লকের আকার নির্ধারণ করা সহজ কারণ এটি সংকলন সময়ে জানা যায় এবং পরে পরিবর্তন হয় না।
গাদা আকার, যেমন রানটাইম এ পরিবর্তিত হতে পারে আরো জানতে কঠিন হতে পারে গতিশীল মেমরি বরাদ্দ (তার উপর নির্ভর করে malloc
বা new
) আপনার স্কেচ বা লাইব্রেরি এটি ব্যবহার করে দ্বারা সঞ্চালিত। ডায়ামিক মেমোরি ব্যবহার করা আরডুইনোতে বেশ বিরল, তবে কিছু মানক ফাংশন এটি করে (টাইপ String
এটি ব্যবহার করে, আমি মনে করি)।
জন্য স্ট্যাক আকার, এটি ফাংশন কল বর্তমান গভীরতার উপর ভিত্তি করে রানটাইম সময় পরিবর্তিত হতে হবে, (প্রতিটি ফাংশন কল স্ট্যাক 2 বাইট নেয় আহ্বায়ক ঠিকানা সঞ্চয় করতে) এবং সংখ্যার এবং পাস আর্গুমেন্ট সহ স্থানীয় ভেরিয়েবল আকার ( এখন পর্যন্ত ডাকা সমস্ত ফাংশনগুলির জন্য যা স্ট্যাকের মধ্যেও সঞ্চিত রয়েছে ।
সুতরাং ধরা যাক আপনার recurse()
ফাংশনটি তার স্থানীয় ভেরিয়েবল এবং আর্গুমেন্টগুলির জন্য 12 বাইট ব্যবহার করে, তারপরে এই ফাংশনটির প্রতিটি কল (বাহ্যিক কলার এবং পুনরাবৃত্তকারীগুলির প্রথমটি) 12+2
বাইট ব্যবহার করবে ।
আমরা যদি ধরে নিই যে:
- আপনি আরডুইনো ইউএনও-তে রয়েছেন (এসআরএএম = 2 কে)
- আপনার স্কেচটি গতিশীল মেমরি বরাদ্দ ব্যবহার করে না (কোনও হিপ নেই )
- আপনি আপনার স্ট্যাটিক ডেটার আকার জানেন (132 বাইট বলুন)
- যখন আপনার
recurse()
স্কেচ থেকে আপনার ফাংশনটি কল করা হয়, বর্তমান স্ট্যাকটি 128 বাইট দীর্ঘ
তারপরে আপনাকে স্ট্যাকের2048 - 132 - 128 = 1788
উপলভ্য বাইটগুলি রেখে দেওয়া হবে । আপনার ক্রিয়াকলাপে পুনরাবৃত্ত কলগুলির সংখ্যা এইভাবে প্রারম্ভিক কল সহ (যা একটি পুনরাবৃত্তি নয়) including1788 / 14 = 127
আপনি দেখতে পাচ্ছেন যে এটি খুব কঠিন তবে আপনি যা চান তা খুঁজে পাওয়া অসম্ভব।
স্ট্যাকের আকারটি আগে উপলব্ধ হওয়ার সহজ উপায় recurse()
হ'ল নিম্নোক্ত ফাংশনটি ব্যবহার করা (অ্যাডাফ্রুট শেখার কেন্দ্রে পাওয়া যায়; আমি নিজে এটি পরীক্ষা করি নি):
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
অ্যাডাফুর্ট লার্নিং সেন্টারে এই নিবন্ধটি পড়তে আমি দৃ strongly ়ভাবে উত্সাহ দিচ্ছি ।