แรม (RAM) เป็นพื้นที่เก็บข้อมูลชั่วคราวที่นักพัฒนาโปรแกรมไมโครคอนโทรลเลอร์ต้องคำนึงถึง โดยปริมาณแรมจะเป็นตัวกำหนดลักษณะงาน/ปริมาณงานที่ไมโครคอนโทรลเลอร์แต่ละตัวสามารถทำได้ เช่น หากต้องการเขียนโปรแกรมแสดงผลรูปภาพขนาด 10 kB บนหน้าจอ แต่มีแรมเพียง 1 kB ก็อาจจะไม่พอที่จะเก็บข้อมูลรูปภาพไว้บนแรมก่อนจะส่งไปแสดงผลบนหน้าจอได้ หรือหากต้องการบันทึกเสียงความยาว 1 วินาที คาดการว่าใช้แรมประมาณ 16 kB แต่ไมโครคอนโทรลเลอร์มีแรมเพียง 1 kB ก็แสดงว่าไม่สามารถบันทึกเสียงได้ จะเห็นได้ว่างานบางงานปริมาณแรมมีความสำคัญอย่างมาก ภายในตัว ESP32 มีแรม (SRAM) ขนาดประมาณ 512 kB หากงานที่ต้องการให้ ESP32 ทำ จำเป็นต้องใช้แรมมาก ก็ต้องเปลี่ยนไปใช้พื้นที่ของแรมนอก (PSRAM) แทน
บอร์ด ESP32 ที่ใช้แรมนอก (PSRAM) ได้ ต้องเป็นบอร์ดที่ใช้โมดูล ESP32-WROVER ซึ่งภายใต้ฝาครอบเหล็กจะมีชิป PSRAM อยู่ ตัวอย่างบอร์ดที่ใช้โมดูล ESP32-WROVER เช่น IOXESP32PS (ออกแบบและจัดจำหน่ายโดย บจก.อาร์ทรอน ชอป), WEMOS LOLIN D32 Pro, TTGO T-Camera เป็นต้น
หรือบอร์ดที่มีการต่อชิป PSRAM ให้เห็นภายนอกได้อย่างชัดเจน หรือระบุในสเปคว่ามี PSRAM ตัวอย่างบอร์ดที่มีชิป PSRAM ต่อให้เห็นชัดเจน เช่น ESP32-CAM, TTGO T8 เป็นต้น
หากมีบอร์ดที่ใช้มีให้เลือกในรายการบอร์ด ESP32 แนะนำให้เลือกบอร์ดตรงชื่อ หากไม่มี (เช่น บอร์ด IOXESP32PS ไม่มีชื่อบอร์ดนี้ให้เลือก) ให้เลือกบอร์ดเป็น ESP32 Wrover Module
การตรวจสอบขนาดชิป PSRAM ที่ใส่มาบนบอร์ดที่รวดเร็ววิธีหนึ่ง คือการอัพโหลดโปรแกรมทดสอบใช้ PSRAM และอ่านขนาด PSRAM ซึ่งใช้โค้ดโปรแกรมต่อไปนี้ในการทดสอบ
หลังจากอัพโหลดโปรแกรมแล้ว เปิด Serial Monitor ขึ้นมา แล้วสังเกตข้อความใน Serial Moitor จะแสดงค่า 4 ค่า คือ
ตัวเลขที่แสดงเป็นหน่วยไบต์ จากรูป Total PSRAM: 4192139 ไบต์ แปลงได้ 4192139 / 1024 / 1024 = 3.99 MByte
บน ESP32 แรมภายใน (SRAM) และแรมภายนอก (PSRAM) จะแยกส่วนกัน หากสร้างตัวแปรแบบปกติ คอมไพเลอร์จะให้ไปใช้แรมภายใน (SRAM) เสมอ การจะใช้พื้นที่ของแรมภายนอกต้องทำผ่านคำสั่ง ps_malloc() สร้างพื้นที่ขึ้นมา แล้วเรียกใช้งานตัวแปรในรูปแบบ pointer ตัวอย่างการสร้างตัวแปร int บนแรมนอก แสดงดังโค้ดโปรแกรมด้านล่าง
เมื่ออัพโหลดโปรแกรม และเปิด Serial Monitor ขึ้นมา จะเห็นได้ว่าพื้นที่ของแรมนอก (Free PSRAM) ลดลง
ในการใช้งานจริงจะมีข้อมูลหลายอย่างที่ต้องเก็บลงแรมนอก เพื่อความสะดวกควรนำ struct เข้ามาช่วยให้สามารถสร้างตัวแปรหลาย ๆ ตัวได้ในครั้งเดียว ตัวอย่างโค้ดโปรแกรมสร้างตัวแปร a, b, c, d แสดงดังโค้ดด้านล่าง
การคืนพื้นที่แรม (free) ควรทำทันทีหลังจากเลิกใช้ตัวแปรนั้น ๆ แล้ว เพื่อให้โค้ดโปรแกรมส่วนอื่น ๆ นำพื้นแรมไปใช้ต่อไป การสร้างตัวแปรแบบปกติ หากสร้างเป็นตัวแปรแบบ local (สร้างตัวแปรภายในปีกกา เช่น สร้างใน void setup(), สร้างใน void loop()) ตัวแปรจะถูกลบ พื้นที่จะถูกคืนอัตโนมัติหลังโค้ดโปรแกรมบรรทัดสุดท้ายในปีกกา แต่สำหรับตัวแปรที่สร้างด้วยคำสั่ง ps_malloc() พื้นที่จะไม่ถูกลบจนกว่าจะเรียกใช้คำสั่ง free() ตัวอย่างการใช้คำสั่ง free() คืนพื้นที่ PSRAM แสดงดังโค้ดโปรแกรมด้านล่าง
จากโค้ดโปรแกรมด้านบน จะเห็นว่าก่อนขอจัดสรรพื้นที่ มี PSRAM เหลือ 4192139 (1) หลังใช้คำสั่ง ps_malloc() มีเหลือ 4192123 (2) และสุดท้ายหลังจากใช้คำสั่ง free() พื้นที่ PSRAM กลับมาเหลือเท่าก่อนใช้คำสั่ง ps_malloc() (3)
การใช้พื้นที่บน PSRAM เกี่ยวข้องกับตัวแปรแบบ pointer ซึ่งตัวแปรแบบ pointer จำเป็นจะต้องเรียกใช้คำสั่ง ps_malloc() เพื่อสร้างพื้นที่ขึ้นมาก่อน จึงจะกำหนดค่าลงในตัวแปร หรือเรียกค่าในตัวแปรมาใช้ได้ หากไม่ได้สร้างพื้นที่ด้วย ps_malloc() หรือใช้คำสั่ง free() ไปแล้ว แต่ไปเรียกใช้ตัวแปรนั้น ๆ อีก จะทำให้เกิดปัญหา Watchdog Trigger ตัว ESP32 จะรีบูตตัวเอง
โค้ดโปรแกรมด้านล่างแสดงให้เห็นตัวอย่างของการเรียกใช้ตัวแปร a ก่อนคำสั่ง malloc() ใน Serial Monitor แสดงผล ESP32 รีบูตตัวเองตลอดเวลา พร้อมแจ้งสาเหตุเป็น LoadProhibited หมายถึงเรียกใช้งานพื้นที่ในแรมที่ไม่มีอยู่
เมื่อปิดใช้งานบรรทัดที่เป็นสาเหตุของปัญหาไป (เพิ่มคอมเม้นข้างหน้าบรรทัด 5 และ 10) จะเห็นได้ว่า ESP32 สามารถทำงานได้ปกติ แสดงค่าในตัวแปร a ได้ถูกต้อง โดยไม่มีปัญหารีบูตอีก
การสร้างตัวแปรใช้แรมนอก (PSRAM) ใช้คำสั่ง ps_malloc() และคืนพื้นที่ด้วยคำสั่ง free()