ESP-IDF编译报错:头文件缺失及xPortGetFreeHeapSizeTagged未定义问题
问题:ESP-IDF编译FreeRTOS示例时的头文件与函数替代问题
我跟着pcbreflux的教程在ESP32上做FreeRTOS任务间通信开发,用VS Code+ESP-IDF编译示例代码时,碰到两个头文件找不到的错误:esp_heap_alloc_caps.h和freertos/heap_regions.h。
查资料后用esp_heap_caps.h替代了esp_heap_alloc_caps.h,编译错误少了一部分,但想确认这个替代是否正确。
剩下的freertos/heap_regions.h问题没解决,就算手动加了这个头文件,还会出现undefined reference to xPortGetFreeHeapSizeTagged的编译错误,估计这个函数被替换了,想问下该用什么函数替代?
相关配置文件与代码
c_cpp_properties.json
{ "configurations": [ { "name": "Win32", "includePath": [ "${workspaceFolder}/**" ], "defines": [ "_DEBUG", "UNICODE", "_UNICODE" ], "intelliSenseMode": "windows-msvc-x64", "compileCommands": "${workspaceFolder}/build/compile_commands.json" }, { "name": "ESP-IDF", "compilerPath": "c:\\Users\\arthu\\.espressif\\tools\\xtensa-esp32-elf\\esp-2021r2-patch5-8.4.0\\xtensa-esp32-elf\\bin\\xtensa-esp32-elf-gcc.exe", "cStandard": "c11", "cppStandard": "c++17", "includePath": [ "${config:idf.espIdfPath}/components/**", "${config:idf.espIdfPathWin}/components/**", "${config:idf.espAdfPath}/components/**", "${config:idf.espAdfPathWin}/components/**", "${workspaceFolder}/**" ], "browse": { "path": [ "${config:idf.espIdfPath}/components", "${config:idf.espIdfPathWin}/components", "${config:idf.espAdfPath}/components/**", "${config:idf.espAdfPathWin}/components/**", "${workspaceFolder}" ], "limitSymbolsToIncludedHeaders": false }, "configurationProvider": "ms-vscode.makefile-tools" } ], "version": 4 }
main目录下的CMakeLists.txt
idf_component_register(SRCS "queue_main.c" INCLUDE_DIRS ".")
项目根目录下的CMakeLists.txt
cmake_minimum_required(VERSION 3.5) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(main)
queue_main示例代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #include "sdkconfig.h" #include "esp_system.h" #include "esp_heap_caps.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "freertos/heap_regions.h" #define COLOR_PRINT_BLACK "30" #define COLOR_PRINT_RED "31" #define COLOR_PRINT_GREEN "32" #define COLOR_PRINT_BROWN "33" #define COLOR_PRINT_BLUE "34" #define COLOR_PRINT_PURPLE "35" #define COLOR_PRINT_CYAN "36" #define color_printf(COLOR, format, ...) \ { \ printf("\033[0;" COLOR "m" format "\033[0m\n", ##__VA_ARGS__); \ } xQueueHandle demo_queue; void tx_task1(void *arg) { uint32_t txpos = 0; color_printf(COLOR_PRINT_BLUE, "tx_task1"); while (1) { color_printf(COLOR_PRINT_BLUE, "free DRAM %u IRAM %u", esp_get_free_heap_size(), xPortGetFreeHeapSizeTagged(MALLOC_CAP_32BIT)); color_printf(COLOR_PRINT_BLUE, "tx_task1 notify %d", txpos); if (xQueueSendToBack(demo_queue, &txpos, 1000 / portTICK_RATE_MS) != pdTRUE) { color_printf(COLOR_PRINT_RED, "tx_task1 fail to queue value %d", txpos); } vTaskDelay(10000 / portTICK_RATE_MS); // delay 10s txpos++; } } void tx_task2(void *arg) { uint32_t txpos = 0; color_printf(COLOR_PRINT_CYAN, "\ttx_task2"); while (1) { color_printf(COLOR_PRINT_CYAN, "\tfree DRAM %u IRAM %u", esp_get_free_heap_size(), xPortGetFreeHeapSizeTagged(MALLOC_CAP_32BIT)); color_printf(COLOR_PRINT_CYAN, "\ttx_task2 notify %d", txpos); if (xQueueSendToBack(demo_queue, &txpos, 1000 / portTICK_RATE_MS) != pdTRUE) { color_printf(COLOR_PRINT_RED, "\ttx_task2 fail to queue value %d", txpos); } vTaskDelay(7000 / portTICK_RATE_MS); // delay 7s txpos++; } } void rx_task(void *arg) { uint32_t rxpos; color_printf(COLOR_PRINT_GREEN, "\t\trx_task"); while (1) { color_printf(COLOR_PRINT_GREEN, "\t\trx_task queue yield"); if (xQueueReceive(demo_queue, &rxpos, 60000 / portTICK_RATE_MS) != pdTRUE) { // max wait 60s color_printf(COLOR_PRINT_RED, "\t\tfail to receive queued value"); } else { color_printf(COLOR_PRINT_GREEN, "\t\tfree DRAM %u IRAM %u", esp_get_free_heap_size(), xPortGetFreeHeapSizeTagged(MALLOC_CAP_32BIT)); color_printf(COLOR_PRINT_GREEN, "\t\trx_task get queued value %d", rxpos); } if (uxQueueMessagesWaiting(demo_queue) == 0) { // no message? take a break vTaskDelay(15000 / portTICK_RATE_MS); // delay 15s } } } void app_main() { color_printf(COLOR_PRINT_PURPLE, "start ESP32"); color_printf(COLOR_PRINT_PURPLE, "free DRAM %u IRAM %u", esp_get_free_heap_size(), xPortGetFreeHeapSizeTagged(MALLOC_CAP_32BIT)); demo_queue = xQueueCreate(10, sizeof(uint32_t)); color_printf(COLOR_PRINT_PURPLE, "free DRAM %u IRAM %u", esp_get_free_heap_size(), xPortGetFreeHeapSizeTagged(MALLOC_CAP_32BIT)); color_printf(COLOR_PRINT_PURPLE, "create three tasks"); xTaskCreate(tx_task1, "tx_task1", CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE, NULL, 5, NULL); xTaskCreate(tx_task2, "tx_task2", CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE, NULL, 5, NULL); xTaskCreate(rx_task, "rx_task", CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE, NULL, 5, NULL); color_printf(COLOR_PRINT_PURPLE, "end of main"); }
内容的提问来源于stack exchange,提问作者curioso
相关产品推荐
相关产品推荐

