Archive
การตรวจสอบการใช้ 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
การจัดการ Memory ของ Arduino [Arduino Memories]
Arduino มี Memory อยู่ 3 ชนิดคือ
- Flash หรือ Program Memory
- SRAM
- EEPROM
Flash Memory
ใช้สำหรับการบันทึก Program Image และข้อมูลตั้งต้นต่างๆ เราสามารถ run โปรแกรมจาก flash memory ได้แต่เราไม่สามารถแก้ไขข้อมูลใน flash memory จาก code ที่ทำงานอยู่ได้ หากต้องการแก้ไขข้อมูลเราจะต้องทำการสำเนาไปที่ SRAM
Flash memory นั้นใช้เทคโนโลยีเดียวกันกับ thumb-drive และ SD cards ซึ่งเป็นแบบ non-volatile หมายถึง program หรือข้อมูลจะคงอยู่แม้ว่าจะไม่มีไฟหล่อเลี้ยงอยู่ก็ตามหรือมีลักษณะเหมือน hard disk แต่มันก็มีข้อจำกัดในเรื่องจำนวนครั้งในการเขียนกล่าวคือเราจะเขียนหรือบันทึกข้อมูลลง flash memory ได้ประมาณ 100000 ครั้ง (100000 write cycle) มากพอที่จะใช้งานสัก 10 – 20 ปีแหละครับ ( สมมติว่าเราเขียนลงบน flash memory 10 ครั้งต่อวันเราก็จะใช้เวลาประมาณ 27 ปีครับ )
SRAM
หรือ Static Random Access Memory นั้นสามารถอ่านหรือเขียนได้จากโปรแกรม code ที่ทำงานอยู่ SRAM นั้นถูกใช้ในหลายๆจุดประสงค์คือ
- Static Data เป็นส่วนของ memory ที่กันไว้สำหรับ global variable และ static variable ของโปรแกรมสำหรับตัวแปรที่ถูกกำหนดค่าเริ่มต้นเมื่อเริ่ม start ระบบจะทำการสำเนาค่าเริ่มต้นนั้นจาก flash memory มาใส่ให้
- Heap เป็นส่วนที่เก็บข้อมูลแบบ dynamic หรือข้อมูลที่มีการ allocate ระหว่างที่โปรแกรมทำงาน ส่วนของ Heap นั้นจะขยายจากส่วนบนของ static data ขึ้นไปโดยใช้ส่วนของ memory ที่ว่างไปเรื่อยๆในระหว่างที่มีการจองและใช้งานของโปรแกรมที่ทำงานอยู่
- Stack เป็นส่วนของ memory ที่ใช้เก็บข้อมูลตัวแปรแบบ local และเก็บรายการ interrupts และ function call ต่างๆ memory ในส่วนของ stack จะขยายจากด้านบนสุดของ memory ลงมาหา Heap ดังนั้นทุกๆ ตัวแปร รายการ interrupts และ function call นั้นจะทำให้ memory ส่วน stack ขยายลงมากเรื่อยๆ การ return จาก interrupt หรือจาก function call นั้นจะคืนพื้นที่ว่างให้กับ SRAM
ปัญหาส่วนใหญ่ของ Memory เกิดจากการขยายขนนาดของ stack และ heap จนมาชนกันเมื่อเกิดการชนกันของ stack และ heap พื้นที่ข้อมูลของส่วนที่ถูกบันทึกทับก็จะเสียหายส่งผลให้เกิดการทำงานผิดพลาดแบบไม่สามารถคาดเดาผลการทำงานได้หรือในบางครั้งก็อาจทำให้เกิดการล่มของโปรแกรมไปเลย หรือในบางครั้งผลของการชนกันอาจไม่สังเกตเห็นได้จนกระทั่งเกิด error ขึ้นภายหลังจากนำเอาโปรแกรมไปใช้งานแล้วก็ได้
EEPROM
เป็น non-volatile memory อีกอันหนึ่งซึ่งสามารถอ่านและเขียนโดยโปรแกรม code ที่ทำงานอยู่แต่ข้อจำกัดของมันคือต้องอ่านทีละ byte ทำให้เวลาใช้งานยุงยากหน่อยและการอ่านก็ช้ากว่า SRAM นอกจากนี้ก็ยังมีข้อจำกัดในการเขียนที่ 100000 write cycle ( แต่การอ่านไม่จำกัด )
Arduino Memory Comparison
ตารางด้านล่างแสดงถึงข้อเปรียบเทียบของจำนวน memory แต่ละชนิดของแต่ละ model ของ Arduino และ Arduino compatible board
ครับ เรารู้รูปแบบของ Memory ต่าง ๆ กันคร่าวแล้ว ทำไงเราจะตรวจสอบว่า โปรแกรมที่เราเขียนนั้นใช้ Memory ไปเท่าไร หมายถึงอะไรเท่าไรนะครับ มีคำอธิบายต่อไปเรื่องการตรวจสอบ ใน ตอนต่อไปครับ เรื่อง การตรวจสอบการใช้ Memory ( Measuring Memory Usage )
ขอให้สนุกกับการ เรียนรู้นะครับ
ธีระพงษ์ สนธยามาลย์