top of page

ทดสอบความเร็วอ่าน-เขียน SRAM / PSRAM ของ ESP32 / ESP32-S2 / ESP32-S3

อัปเดตเมื่อ 12 มิ.ย. 2565


การใช้งานจอแสดงผล การใช้งานกล้อง การใช้งานด้านเสียง เป็นการใช้งานไมโครคอนโทรลเลอร์ที่ค่อนข้างหนัก เนื่องจากงานดังกล่าวจำเป็นต้องเก็บข้อมูลจำนวนมาก และรวดเร็ว เช่น งานจอ หากต้องการแสดงผลรูปขนาด 200x200 พิเซล ใช้สีแบบ RGB565 คือ 1 พิเซลใช้ 2 ไบต์ รูปขนาด 200x200 จึงมี 40,000 พิเซล x 2 ไบต์ = 80,000 ไบต์ จะเห็นได้ว่าการแสดงผลรูป 1 รูปต้องใช้พื้นที่จำนวนมาก (80kB ถือว่าเยอะมากในไมโครคอนโทรลเลอร์ เทียบกับ Arduino Uno มีแรมเพียง 2 kB) พื้นที่จำนวนมากนี้ต้องเก็บลงในแรมก่อน หากแรมสามารถอ่าเขียนได้เร็ว การแสดงผลรูปภาพบนจอ ก็สามารถแสดงผลได้อย่างรวดเร็วมากขึ้น หากแรมอ่านเขียนได้ช้า การแสดงผลก็ทำได้ช้าไปด้วย

ในงานกล้อง กล้องมักจะให้ข้อมูลภาพมาเป็น JPEG หากต้องการนำภาพไปแสดงผลบนหน้าจอ จำเป็นต้องแปลงรูปแบบไฟล์ก่อน การแปลงรูปแบบไฟล์จำเป็นต้องใช้แรมจำนวนมาก เพราะต้องเก็บข้อมูล JPEG ด้วย และต้องเก็บข้อมูลที่แปลงมาแล้วด้วย หากแรมมีความเร็วมาก ก็จะทำให้ CPU สามารถดึงข้อมูลออกมาได้เร็ว ส่งผลให้ภาพรวมการแปลงไฟล์สามารถทำได้เร็วขึ้นตามไปด้วย

จะเห็นได้ว่าแรมมีความสำคัญในระบบคอมพิวเตอร์ โดยเฉพาะไมโครคอนโทรลเลอร์ โดยนอกจากจะเน้นขนาดเล็กแล้ว ยังต้องการความเร็วมาก เพื่อให้ทำงานได้หลากหลายมากขึ้นอีกด้วย ในบทความนี้จึงจะมาทดสอบ ESP32 ที่ปกติมี SRAM ขนาดประมาณ 520 kB และสำหรับบางรุ่น มี PSRAM แบบ Quad SPI และ Octal SPI มาด้วย โดยเปรียบเทียบ ESP32, ESP32-S2 และ ESP32-S3

ฮาร์ดแวร์ที่ใช้ทดสอบ

ใช้บอร์ด IOXESP32+, Cucumber RI และ Node32-S3 (ESP32-S3-WROOM-2, Octal SPI PSRAM) เทียบสเปคแต่ละบอร์ดได้ดังนี้

เครื่องมือพัฒนาซอฟแวร์

ใช้ PlatformIO เขียนโปรแกรมทดสอบ และอัพโหลด

โค้ดโปรแกรมทดสอบ

ใช้คำสั่ง malloc() ขอพื้นที่ใน SRAM / PSRAM โดยร้องขอแบบ 1 KB 10 kB และ 100 kB จาก SRAM และ PSRAM ใช้คำสั่ง micro() จับเวลา


#include <Arduino.h>

uint64_t startTime = 0;
void StartTimer() {
  startTime = micros();
}

void PrintTimeDiff() {
  uint32_t timeDiff = micros() - startTime;
  Serial.printf("%d uS\n", timeDiff);
}
 
void testWriteRead(size_t test_size, uint32_t malloc_flag) {
  uint8_t *test = (uint8_t*)heap_caps_malloc(test_size, malloc_flag);
  if (test == NULL) {
    Serial.println("malloc fail, skip");
    return;
  }
  Serial.printf("Write %d bytes use time... ", test_size);
  StartTimer();
  for (uint32_t i=0;i<test_size;i++) {
    test[i] = 0x23;
  }
  PrintTimeDiff();

  Serial.printf("Read %d bytes use time... ", test_size);
  uint64_t dummy = 0;
  StartTimer();
  for (uint32_t i=0;i<test_size;i++) {
    dummy = test[i];
  }
  PrintTimeDiff();
  digitalWrite(-1, dummy); // Use dummy for fix compiler optimize

  free(test);
}

void setup() {
  Serial.begin(115200);
  
  Serial.println("Test write-read on SRAM");
  testWriteRead(1024, MALLOC_CAP_8BIT);
  testWriteRead(1024 * 10, MALLOC_CAP_8BIT);
  testWriteRead(1024 * 100, MALLOC_CAP_8BIT);
  
  Serial.println("Test write-read on PSRAM");
  if (!psramFound()) {
    Serial.println("don't have, skip");
    goto finally;
  }
  testWriteRead(1024, MALLOC_CAP_SPIRAM);
  testWriteRead(1024 * 10, MALLOC_CAP_SPIRAM);
  testWriteRead(1024 * 100, MALLOC_CAP_SPIRAM);
  testWriteRead(1024 * 1024, MALLOC_CAP_SPIRAM);

finally:
  Serial.println("Finish");
}

void loop() {

}

ผลการทดสอบ

ผลการทดสอบ เป็นไปดังตารางด้านล่าง

แปลงออกมาเป็นหน่วย MB/s แล้วนำไปทำเป็นกราฟได้ดังนี้

จะเห็นได้ว่า ESP32-S3 (N4R8V) สามารถอ่านเขียนข้อมูลโดยเฉลี่ยจากแรมได้เร็วที่สุด อย่างไรก็ตาม สำหรับ ESP32-S3 ใช้ PSRAM แบบ Octal SPI (สาย 8 เส้น) แต่ ESP32-S2 (N4R2) ใช้แบบ Quad SPI (สาย 4 เส้น) ทำให้ ESP32-S3 (N32R8V) ควรจะเร็วที่สุดอยู่แล้ว



ดู 722 ครั้ง0 ความคิดเห็น

コメント


bottom of page