หากคุณต้องการเรียกคืน (และตามที่ @ jippie กล่าวว่าเป็นความคิดที่ไม่ดีข้อความอ่อนเกิน: ไม่ทำ ) และต้องการทราบว่าคุณสามารถรับเงินคืนได้เท่าไรคุณจะต้องทำการคำนวณและทดลอง นอกจากนี้คุณโดยทั่วไปจะมีเพียงประมาณของมันเพราะมันขึ้นอยู่กับสถานะหน่วยความจำมากในเวลาที่ฟังก์ชั่นซ้ำของคุณจะถูกเรียก
สำหรับสิ่งนี้คุณควรรู้ก่อนว่า SRAM จัดอยู่ใน Arduino ที่ใช้ AVR (จะไม่นำไปใช้กับ Arduino Galileo โดย Intel) แผนภาพต่อไปนี้จาก Adafruitแสดงให้เห็นอย่างชัดเจน:
จากนั้นคุณต้องรู้ขนาดโดยรวมของ SRAM ของคุณ (ขึ้นอยู่กับ Atmel MCU ดังนั้นคุณมีบอร์ด Arduino ชนิดใด)
ในแผนภาพนี้มันเป็นเรื่องง่ายที่จะหาขนาดของบล็อกข้อมูลแบบคงที่เพราะมันเป็นที่รู้จักกันในเวลารวบรวมและจะไม่เปลี่ยนแปลงในภายหลัง
กองขนาดอาจเป็นเรื่องยากมากที่จะรู้ว่ามันสามารถแตกต่างกันไปที่รันไทม์ขึ้นอยู่กับการจัดสรรหน่วยความจำแบบไดนามิก ( malloc
หรือnew
) ดำเนินการโดยร่างหรือไลบรารีที่ใช้ของคุณ การใช้หน่วยความจำแบบไดนามิกค่อนข้างหายากบน Arduino แต่ฟังก์ชั่นมาตรฐานบางอย่างทำ ( String
ฉันใช้ประเภทมันฉันคิดว่า)
สำหรับขนาดสแต็คมันจะแตกต่างกันไปในระหว่างรันไทม์ตามความลึกปัจจุบันของการเรียกใช้ฟังก์ชัน (การเรียกใช้ฟังก์ชันแต่ละครั้งใช้ 2 ไบต์บนสแต็กเพื่อจัดเก็บที่อยู่ของผู้โทร) และจำนวนและขนาดของตัวแปรท้องถิ่น ที่ถูกเก็บไว้ในStack ) สำหรับฟังก์ชั่นทั้งหมดที่เรียกใช้จนถึงปัจจุบัน
ดังนั้นสมมติว่าrecurse()
ฟังก์ชั่นของคุณใช้ 12 ไบต์สำหรับตัวแปรและอาร์กิวเมนต์ในเครื่องจากนั้นการเรียกใช้ฟังก์ชั่นนี้ (ครั้งแรกจากผู้เรียกภายนอกและผู้เรียกซ้ำ) จะใช้12+2
ไบต์
ถ้าเราคิดว่า:
- คุณอยู่บน Arduino UNO (SRAM = 2K)
- ร่างของคุณไม่ได้ใช้การจัดสรรหน่วยความจำแบบไดนามิก (ไม่มีฮีป )
- คุณรู้ขนาดของข้อมูลคงที่ของคุณ(สมมุติว่า 132 ไบต์)
- เมื่อ
recurse()
ฟังก์ชันของคุณถูกเรียกจากร่างของคุณสแต็กปัจจุบันจะมีความยาว 128 ไบต์
แล้วคุณจะเหลือ2048 - 132 - 128 = 1788
ไบต์ที่มีอยู่ในสแต็ค จำนวนการเรียกซ้ำไปยังฟังก์ชันของคุณจึง1788 / 14 = 127
รวมถึงการโทรเริ่มต้น (ซึ่งไม่ใช่การเรียกซ้ำ)
อย่างที่คุณเห็นนี่เป็นเรื่องยากมาก แต่ไม่สามารถจะค้นหาสิ่งที่คุณต้องการได้
วิธีที่ง่ายกว่าในการเรียกขนาดสแต็กที่มีอยู่ก่อนหน้าrecurse()
นี้คือการใช้ฟังก์ชั่นต่อไปนี้ (พบได้ที่ศูนย์การเรียนรู้ Adafruit; ฉันไม่ได้ทดสอบด้วยตัวเอง):
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
ฉันขอแนะนำให้คุณอ่านบทความนี้ที่ศูนย์การเรียนรู้ Adafruit