- 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
软件版本:V5.2.3
开发环境:VS Code
修改的代码如下
- 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);
- }
1、ESP_LOGW函数调用之后没有释放栈内存?
调用了一次ESP_LOGW(RX_TASK_TAG, "111:%d", 0);之后,后继查看uxTaskGetStackHighWaterMark(NULL)没有变回原来的大小。
2、是否不应该使用uxTaskGetStackHighWaterMark查看,但没有找到获取当前线程剩余栈空间大小的函数接口
调试过程请查看附件