完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我开始按照 PCBreflux 的教程在 esp32 上与 FreeRTOS 进行任务间通信,但我无法在 VS Code 中使用 esp-idf 构建示例,因为其中两个头文件引发了 No such file or directory 错误 :
#include "esp_heap_alloc_caps.h"#include "freertos/heap_regions.h" 经过一些研究,我发现“esp_heap_caps.h”可以替换“esp_heap_alloc_caps.h”(有人可以证实吗?)这确实消除了部分编译错误。 但是“freertos/heap_regions.h”仍然给我带来问题。 即使我手动添加此头文件,我也会收到对 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 :Code: Select all idf_component_register(SRCS "queue_main.c" INCLUDE_DIRS ".") 我项目文件夹下面的 CMakeLists.txt :Code: Select all cmake_minimum_required(VERSION 3.5)include($ENV{IDF_PATH}/tools/cmake/project.cmake)project(main) queue_main的代码:Code: Select all #include #include #include #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("�33[0;" COLOR "m" format "�33[0mn", ##__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, "ttrx_task"); while (1) { color_printf(COLOR_PRINT_GREEN, "ttrx_task queue yield"); if (xQueueReceive(demo_queue, &rxpos, 60000 / portTICK_RATE_MS) != pdTRUE) { // max wait 60s color_printf(COLOR_PRINT_RED, "ttfail to receive queued value"); } else { color_printf(COLOR_PRINT_GREEN, "ttfree DRAM %u IRAM %u", esp_get_free_heap_size(), xPortGetFreeHeapSizeTagged(MALLOC_CAP_32BIT)); color_printf(COLOR_PRINT_GREEN, "ttrx_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");} |
|
相关推荐
1个回答
|
|
为了解决这个问题,我们可以按照以下步骤操作:
1. 确认ESP-IDF版本:首先,确保你使用的ESP-IDF版本与pcbreflux教程中使用的版本相匹配。如果版本不匹配,可能会导致一些API或头文件的更改,从而导致编译错误。 2. 更新ESP-IDF:如果你的ESP-IDF版本较低,建议更新到最新版本。这可以通过以下命令完成: ``` cd ~/esp/esp-idf git pull ./install.sh ``` 3. 替换头文件:你已经尝试使用`esp_heap_caps.h`替换`esp_heap_alloc_caps.h`,这是一个正确的尝试。在较新版本的ESP-IDF中,`esp_heap_alloc_caps.h`已经被废弃,取而代之的是`esp_heap_caps.h`。 4. 解决`heap_regions.h`问题:关于`freertos/heap_regions.h`的问题,你可以尝试以下方法: a. 在ESP-IDF的`components/freertos/include/freertos`目录下创建一个名为`heap_regions.h`的新文件,并添加以下内容: ```c #pragma once #include_next "freertos/heap_regions.h" ``` b. 确保你的项目包含ESP-IDF的`components`目录,以便编译器可以找到这个新创建的头文件。 5. 检查`xPortGetFreeHeapSizeTagged`:关于`xPortGetFreeHeapSizeTagged`的未定义引用错误,这可能是因为你的项目没有正确链接到FreeRTOS的内存管理库。请确保在项目的`CMakeLists.txt`文件中添加了以下行: ```cmake idf_component_register(SRCS "your_source_file.c" INCLUDE_DIRS ".") ``` 6. 重新构建项目:在完成上述步骤后,尝试重新构建项目。在VSCode中,你可以通过点击左侧的锤子图标,然后选择“Clean Build”来完成这个操作。 7. 如果问题仍然存在,请仔细检查你的代码和项目配置,确保没有遗漏或错误的地方。 通过以上步骤,你应该能够解决在VSCode中使用ESP-IDF构建示例时遇到的问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
541浏览 6评论
454浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
434浏览 5评论
436浏览 4评论
409浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 05:22 , Processed in 0.762401 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号