Một số cách debug phổ biến khi gặp sự cố với FreeRTOS trên ESP32
Bài viết sẽ hướng dẫn bạn một số cách debug phổ biến khi gặp sự cố với FreeRTOS trên ESP32. Dưới đây là các phương pháp và ví dụ tương ứng:
1. Sử dụng Serial Monitor:
Đây là cách đơn giản nhất để debug. Bạn có thể in ra thông tin về trạng thái hệ thống, giá trị biến, hoặc các điểm kiểm tra trong code.
Ví dụ:
void vTask1( void * pvParameters )
{
for( ;; )
{
// Thực hiện công việc của task
Serial.println("Task 1 đang chạy");
Serial.print("Bộ nhớ còn lại: ");
Serial.println(xPortGetFreeHeapSize());
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
2. Sử dụng vTaskList():
Hàm này in ra thông tin về tất cả các task đang chạy, bao gồm tên, trạng thái, ưu tiên và stack còn lại.
Ví dụ:
void printTaskList() {
char taskListBuffer[400];
vTaskList(taskListBuffer);
Serial.println("Task List:");
Serial.println(taskListBuffer);
}
void loop() {
printTaskList();
delay(5000);
}
3. Kiểm tra Stack Overflow:
Bạn có thể sử dụng uxTaskGetStackHighWaterMark() để kiểm tra mức sử dụng stack cao nhất của một task.
Ví dụ:
void vTask1( void * pvParameters )
{
for( ;; )
{
Serial.print("Task 1 Stack High Water Mark: ");
Serial.println(uxTaskGetStackHighWaterMark(NULL));
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
4. Sử dụng Hook Functions:
FreeRTOS cung cấp một số hook functions mà bạn có thể sử dụng để debug. Ví dụ, bạn có thể sử dụng vApplicationMallocFailedHook để bắt lỗi khi cấp phát bộ nhớ thất bại.
Ví dụ:
void vApplicationMallocFailedHook( void )
{
Serial.println("Malloc Failed!");
while(1); // Dừng chương trình
}
5. Sử dụng Assertion:
Bạn có thể sử dụng macro configASSERT() để kiểm tra các điều kiện quan trọng trong code.
Ví dụ:
void vTask1( void * pvParameters )
{
for( ;; )
{
int result = someFunction();
configASSERT( result == 0 );
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
6. Sử dụng ESP32 Log System:
ESP-IDF (framework mà Arduino ESP32 sử dụng) cung cấp một hệ thống log mạnh mẽ.
Ví dụ:
#include "esp_log.h"
static const char* TAG = "MyApp";
void setup() {
esp_log_level_set(TAG, ESP_LOG_INFO);
}
void loop() {
ESP_LOGI(TAG, "This is an info message");
ESP_LOGW(TAG, "This is a warning message");
ESP_LOGE(TAG, "This is an error message");
delay(1000);
}
7. Sử dụng FreeRTOS+Trace:
Đây là một công cụ mạnh mẽ để visualize và analyze hành vi của hệ thống FreeRTOS. Tuy nhiên, nó yêu cầu cài đặt và cấu hình bổ sung.
8. Sử dụng GDB (GNU Debugger):
Bạn có thể sử dụng GDB để debug ESP32 thông qua JTAG interface. Điều này cho phép bạn set breakpoints, step through code, và inspect variables.
Ví dụ cơ bản về cách sử dụng GDB:
(gdb) target remote :3333
(gdb) mon reset halt
(gdb) thb app_main
(gdb) c
Khi debug FreeRTOS, hãy nhớ rằng một số vấn đề có thể chỉ xuất hiện trong điều kiện thời gian thực. Vì vậy, việc sử dụng kết hợp nhiều phương pháp debug có thể giúp bạn phát hiện và giải quyết vấn đề hiệu quả hơn.