使用uart_async_rxtxtasks例程,添加打印后会出现stack overflow

june111
Posts: 1
Joined: Tue Jan 21, 2025 9:57 am

使用uart_async_rxtxtasks例程,添加打印后会出现stack overflow

Postby june111 » Tue Jan 21, 2025 10:19 am

硬件:ESP32-S3-WROOM-1
软件版本:V5.2.3
开发环境:VS Code
修改的代码如下

Code: Untitled.c Select all

static void rx_task(void *arg)
{
static const char *RX_TASK_TAG = "RX_TASK";
esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO);
uint8_t* data = (uint8_t*) malloc(RX_BUF_SIZE + 1);
//uint32_t userFree = 0;
volatile int32_t userFree = 0;
userFree = (int32_t)uxTaskGetStackHighWaterMark(NULL);
ESP_LOGW(RX_TASK_TAG, "111:%d", 0);
userFree = (int32_t)uxTaskGetStackHighWaterMark(NULL);
ESP_LOGI(RX_TASK_TAG, "start is %ld", (int32_t)uxTaskGetStackHighWaterMark(NULL));
userFree = (int32_t)uxTaskGetStackHighWaterMark(NULL);

while (1) {
ESP_LOGI(RX_TASK_TAG, "min free stack size is %ld", (int32_t)uxTaskGetStackHighWaterMark(NULL));
userFree = (int32_t)uxTaskGetStackHighWaterMark(NULL);
const int rxBytes = uart_read_bytes(UART_NUM_1, data, RX_BUF_SIZE, 1000 / portTICK_PERIOD_MS);
if (rxBytes > 0) {
data[rxBytes] = 0;
//userFree = uxTaskGetStackHighWaterMark(NULL);
ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxBytes, data);
ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO);
}
}
ESP_LOGW(RX_TASK_TAG, "error:%d", 0);
free(data);
}
异常日志如下:

Code: Untitled.txt Select all

I (318) main_task: Calling app_main()
W (35288) RX_TASK: 111:0
I (65258) RX_TASK: start is 68
I (98038) RX_TASK: min free stack size is 68
I (103248) tx_task: min free stack size is 1388
I (103248) TX_TASK: Wrote 11 bytes
I (103248) main: free is 2044
I (103248) main_task: Returned from app_main()
I (104248) RX_TASK: Read 11 bytes: 'Hello world'
I (108858) tx_task: min free stack size is 76
I (114978) TX_TASK: Wrote 11 bytes
I (114978) RX_TASK: 0x3fc9d36c 48 65 6c 6c 6f 20 77 6f 72 6c 64 |Hello world|
I (123198) tx_task: min free stack size is 76
I (132958) TX_TASK: Wrote 11 bytes
I (133718) RX_TASK: min free stack size is 0

***ERROR*** A stack overflow in task uart_rx_task has been detected.
Setting breakpoint at 0x403759ed and returning...
--- 0x403759ed: panic_abort at D:/Programs/Espressif/frameworks/esp-idf-v5.2.3/components/esp_system/panic.c:466
疑问:
1、ESP_LOGW函数调用之后没有释放栈内存?
调用了一次ESP_LOGW(RX_TASK_TAG, "111:%d", 0);之后,后继查看uxTaskGetStackHighWaterMark(NULL)没有变回原来的大小。
2、是否不应该使用uxTaskGetStackHighWaterMark查看,但没有找到获取当前线程剩余栈空间大小的函数接口

调试过程请查看附件
20250121-181555.jpg
20250121-181555.jpg (258.7 KiB) Viewed 2004 times
20250121-181655.jpg
20250121-181655.jpg (232.47 KiB) Viewed 2004 times
20250121-181737.jpg
20250121-181737.jpg (283.33 KiB) Viewed 2004 times

Who is online

Users browsing this forum: Amazon [Bot], Applebot and 2 guests