การตรวจสอบการใช้ Memory ( Measuring Memory Usage )
วิธีในการวินิจฉัยปัญหาของการใช้ memory คือการตรวจสอบจำนวน memory ที่ถูกใช้ไปโดยโปรแกรมที่เราเขียน เรามักต้องให้ความสำคัญกับเรื่อง การใช้ Memory ค่อนข้างมากเนื่องจาก ทรัพยากร Memory มีน้อย ดูได้จาก post ที่แล้ว เราลองมาดูวิธีการตรวจสอบ กันครับ
Flash
การตรวจสอบจำนวน พื้นที่ที่ถูกใช้ของ flash นั้นดูได้จาก ข้อมูลที่ compiler แสดงทุก ครั้ง ที่มีการ compile
EEPROM
สำหรับ EEPROM นั้นเราสามารถรู้ได้แน่นอนว่าพื้นที่ใช้ไปเท่าไร เหลือเท่าไร เนื่องจากการอ่านและเขียนนั้นเราจะต้อง อ้างไปที่ตำแหน่งของ address นั่นๆ เราไม่รู้ไม่ได้
จากรูปการใช้งานจะเห็นว่าการอ่านหรือเขียนข้อมูลกับ EEPROM นั้นจำนวนการใช้ Memory นั้นค่อยข้างชัดเจนและแน่นอนสามารถควบคุมได้ด้วยโปรแกรมเมอร์อย่างชัดเจน
SRAM
สำหรับ SRAM นั้น การใช้งานค่อนข้าง dynamic ทำให้ยากต่อการตรวจวัด การใช้ free_ram() เป็นวิธีเดียวสำหรับการตรวจสอบนี้ ใช้ส่วนของ code นี้ในโปรแกรม แล้วเรียกใช้เพื่อตรวจสอบ ได้เมื่อต้องการ จากจุดต่างๆ ของ code การใช้พื้นที่ของ SRAM นั้นค่อนข้าง คาดเดาได้ยาก จะต้องมีการตรวจสอบด้วย free_ram() เป็นระยะ ทุก จากทุกจุดของ code
การทำงานของ function freeRam() นั้นเป็นตรวจสอบพื้นที่ ว่างระหว่าง heap กับ stack ไม่ได้รวมถึง memory ใน heap ที่ เลิกใช้หรือ de-allocated (หรือเรียกว่า Buried heap space )
Buried heap space นั้นจะถูกทิ้งไว้โดยไม่มีใครสามารถนำไปใช้ได้ ไม่ว่าจะเป็นส่วนของ heap เองหรือ ของ Stack เองก็ตาม
Buried heap space นั้นเป็นพื้นที่ stack เอาไปใช้งานไม่ได้ หรือแม้แต่ heap เอง พื้นที่ ที่คืนมาอาจไม่ต่อเนื่องพอที่จะ allocate ใช้กับข้อมูลที่ต้องการใช้ได้ ก็ต้องทิ้งล้างไป ดังนั้นพื้นที่ ระหว่าง stack และ heap จึงเป็นพื้นที่ ที่เรา monitor เพื่อป้องกันปัญหาเช่น การล่มของ stack
รูปจาก https://learn.adafruit.com/memories-of-an-arduino/measuring-free-memory
ครับเป็นเรื่องราวที่จำเป็นจะต้อง ทำความเข้าใจให้ถ่องแท้แน่นอน เพื่อการเขียนโปรแกรมที่มีประสิทธิภาพและใช้ทรัพยากกรที่มีอย่างจำกัดได้ประโยชน์สูงสุดครับ
ติดตามกันต่อไปนะครับ อุปกรณ์ที่เราจะนำมาใช้งานร่วมนั้นก็มีส่วนที่จะต้องใช้ Memory เหมือนกัน ติดตามกันต่อไปครับ
ธีระพงษ์ สนธยามาลย์
อ้่างอิง Arduino – Memory , Measuring Memory Usage
-
May 4, 2014 at 1:43 pmการจัดการ Memory ของ Arduino [Arduino Memories] | Teerapong Sontayaman 's Kode Talker .NET