[ESP32] 11. Tối ưu hóa hiệu suất trong lập trình đa nhân trên ESP32

Bạn đang phát triển một dự án IoT phức tạp trên ESP32 và nhận thấy hiệu quả đa nhân chưa đạt như mong đợi? Hãy cùng khám phá ba kỹ thuật quan trọng để tối ưu hóa hiệu suất trong lập trình đa nhân trên ESP32!

1. Phân tích và đo lường hiệu suất

Để cải thiện, trước tiên bạn cần biết đâu là điểm yếu. Hãy sử dụng các công cụ và kỹ thuật để đo lường thời gian thực thi, sử dụng CPU và bộ nhớ của ứng dụng.

Ví dụ: Sử dụng FreeRTOS task stats để theo dõi hiệu suất tác vụ:

void printTaskStats() {
  char stats[1000];
  vTaskGetRunTimeStats(stats);
  Serial.println("Task Stats:");
  Serial.println(stats);
}

void loop() {
  // Gọi hàm này định kỳ để in thống kê
  printTaskStats();
  vTaskDelay(pdMS_TO_TICKS(10000));  // Đợi 10 giây
}

Kết quả có thể cho thấy tác vụ nào đang chiếm nhiều thời gian CPU, giúp bạn tập trung vào việc tối ưu hóa những phần quan trọng.

2. Cân bằng tải giữa các lõi

ESP32 có hai lõi, hãy tận dụng chúng! Phân phối tác vụ hiệu quả giữa hai lõi có thể tăng đáng kể hiệu suất tổng thể.

Ví dụ: Chạy tác vụ Wi-Fi trên một lõi và tác vụ xử lý chính trên lõi còn lại:

void setup() {
  // Tạo tác vụ Wi-Fi trên lõi 0
  xTaskCreatePinnedToCore(
    wifiTask,    // Hàm tác vụ
    "WiFiTask",  // Tên tác vụ
    10000,       // Kích thước stack
    NULL,        // Tham số
    1,           // Ưu tiên
    NULL,        // Task handle
    0            // Lõi 0
  );

  // Tạo tác vụ xử lý chính trên lõi 1
  xTaskCreatePinnedToCore(
    mainTask,    // Hàm tác vụ
    "MainTask",  // Tên tác vụ
    10000,       // Kích thước stack
    NULL,        // Tham số
    1,           // Ưu tiên
    NULL,        // Task handle
    1            // Lõi 1
  );
}

Cách này giúp tránh xung đột tài nguyên và tăng hiệu suất tổng thể.

3. Tối ưu hóa sử dụng bộ nhớ và CPU

Quản lý tài nguyên hiệu quả là chìa khóa để tạo ra ứng dụng nhanh và tiết kiệm năng lượng.

Ví dụ: Sử dụng bộ nhớ tĩnh thay vì động khi có thể:

// Thay vì:
char* message = (char*)malloc(100 * sizeof(char));

// Sử dụng:
static char message[100];

// Hoặc nếu trong một tác vụ:
void myTask(void* parameter) {
  char message[100];
  while(1) {
    // Xử lý với message
    vTaskDelay(pdMS_TO_TICKS(1000));
  }
}

Sử dụng bộ nhớ tĩnh giúp tránh phân mảnh bộ nhớ và cải thiện hiệu suất.

Một ví dụ khác về tối ưu hóa CPU là sử dụng chế độ ngủ khi không cần xử lý:

void loop() {
  // Thực hiện công việc
  performTask();
  
  // Đặt ESP32 vào chế độ ngủ nhẹ trong 5 giây
  esp_sleep_enable_timer_wakeup(5 * 1000000); // 5 seconds
  esp_light_sleep_start();
}

Bằng cách này, bạn tiết kiệm năng lượng đáng kể trong thời gian không hoạt động.

Áp dụng các kỹ thuật tối ưu hóa này sẽ giúp ứng dụng ESP32 của bạn chạy nhanh hơn, phản hồi tốt hơn và tiêu thụ ít năng lượng hơn. Hãy thử áp dụng chúng vào dự án của bạn và theo dõi sự cải thiện!

Bạn có kinh nghiệm tối ưu hóa nào khác cho ESP32? Hãy chia sẻ trong phần bình luận nhé!