You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:50:25