在vscode的ESP-IDF中使用自定义组件
以hello-world为例,演示步骤和注意事项
1、新建ESP-IDF项目
选择模板
从hello-world模板创建
2、打开项目
3、编译结果没错
正在执行任务: /home/azhu/.espressif/python_env/idf5.1_py3.10_env/bin/python /home/azhu/esp/v5.1/esp-idf/tools/idf_size.py /home/azhu/ESP32/test/use_componet/build/use_componet.map Total sizes:
Used static DRAM: 10664 bytes ( 170072 remain, 5.9% used).data size: 8472 bytes.bss size: 2192 bytes
Used static IRAM: 48958 bytes ( 82114 remain, 37.4% used).text size: 47931 bytes.vectors size: 1027 bytes
Used Flash size : 118107 bytes.text: 80723 bytes.rodata: 37128 bytes
Total image size: 175537 bytes (.bin may be pa
4、烧写运行
'/home/azhu/.espressif/python_env/idf5.1_py3.10_env/bin/python' '/home/azhu/esp/v5.1/esp-idf/tools/idf_monitor.py' -p /dev/ttyUSB0 -b 115200 --toolchain-prefix xtensa-esp32-elf- --target esp32 '/home/azhu/ESP32/test/use_componet/build/use_componet.elf'
--- esp-idf-monitor 1.5.0 on /dev/ttyUSB0 115200
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
ets Jul 29 2019 12:21:46rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:7128
load:0x40078000,len:15624
load:0x40080400,len:4
--- 0x40080400: _init at ??:?load:0x40080404,len:3876
entry 0x4008064c
I (29) boot: ESP-IDF v5.1.5-346-g41a885bb2d 2nd stage bootloader
I (29) boot: compile time Dec 24 2024 14:24:47
I (31) boot: Multicore bootloader
I (35) boot: chip revision: v3.0
I (39) boot.esp32: SPI Speed : 40MHz
I (43) boot.esp32: SPI Mode : DIO
I (48) boot.esp32: SPI Flash Size : 2MB
I (52) boot: Enabling RNG early entropy source...
I (58) boot: Partition Table:
I (61) boot: ## Label Usage Type ST Offset Length
I (69) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (76) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (84) boot: 2 factory factory app 00 00 00010000 00100000
I (91) boot: End of partition table
I (95) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=09208h ( 37384) map
I (117) esp_image: segment 1: paddr=00019230 vaddr=3ffb0000 size=02118h ( 8472) load
I (121) esp_image: segment 2: paddr=0001b350 vaddr=40080000 size=04cc8h ( 19656) load
I (131) esp_image: segment 3: paddr=00020020 vaddr=400d0020 size=13b54h ( 80724) map
I (161) esp_image: segment 4: paddr=00033b7c vaddr=40084cc8 size=07278h ( 29304) load
I (179) boot: Loaded app from partition at offset 0x10000
I (179) boot: Disabling RNG early entropy source...
I (191) cpu_start: Multicore app
I (192) cpu_start: Pro cpu up.
I (192) cpu_start: Starting app cpu, entry point is 0x400810f4
--- 0x400810f4: call_start_cpu1 at /home/azhu/esp/v5.1/esp-idf/components/esp_system/port/cpu_start.c:160I (0) cpu_start: App cpu up.
I (209) cpu_start: Pro cpu start user code
I (209) cpu_start: cpu freq: 160000000 Hz
I (209) cpu_start: Application information:
I (214) cpu_start: Project name: use_componet
I (219) cpu_start: App version: 1
I (224) cpu_start: Compile time: Dec 24 2024 14:24:22
I (230) cpu_start: ELF file SHA256: 7a0e0699229a74e2...
I (236) cpu_start: ESP-IDF: v5.1.5-346-g41a885bb2d
I (242) cpu_start: Min chip rev: v0.0
I (247) cpu_start: Max chip rev: v3.99
I (252) cpu_start: Chip rev: v3.0
I (257) heap_init: Initializing. RAM available for dynamic allocation:
I (264) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (270) heap_init: At 3FFB29A8 len 0002D658 (181 KiB): DRAM
I (276) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (282) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (289) heap_init: At 4008BF40 len 000140C0 (80 KiB): IRAM
I (296) spi_flash: detected chip: gd
I (299) spi_flash: flash io: dio
W (303) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (317) app_start: Starting scheduler on CPU0
I (321) app_start: Starting scheduler on CPU1
I (321) main_task: Started on CPU0
I (331) main_task: Calling app_main()
Hello world!
This is esp32 chip with 2 CPU core(s), WiFi/BTBLE, silicon revision v3.0, 2MB external flash
Minimum free heap size: 301172 bytes
Restarting in 10 seconds...
5、添加组件,功能为再输出一行文字
COMMAND->Create ESP-IDF Compontent
最上方输入自己的组件名称然后回车,这里输入 mycomp
ESP-IDF自动创建compontents文件夹,然后在下面有mycomp文件夹,里面有mycomp.c,include/mycomp.h
编写代码,mycomp.c
#include <stdio.h>
#include "mycomp.h"void func(void)
{printf("call by mycomp\n");
}
main/hello_world_main.c,只加两行
......
#include "esp_flash.h"
#include "mycomp.h" //addvoid app_main(void)
{......printf("Restarting now.\n");func(); //addfflush(stdout);
6、再次编译,不出意外的话,一定报错:
............../use_componet/main/hello_world_main.c
/home/azhu/ESP32/test/use_componet/main/hello_world_main.c:14:10: fatal error: mycomp.h: No such file or directory14 | #include "mycomp.h"| ^~~~~~~~~~
compilation terminated.
ninja: build stopped: subcommand failed.
7、关键要点!
原因是main没有包含自己写的组件,或者说依赖,把main/CMakeLists.txt修改为
idf_component_register(SRCS "hello_world_main.c"INCLUDE_DIRS "")
改成如下:idf_component_register(SRCS "main.c"INCLUDE_DIRS ""PRIV_REQUIRES mycomp)
再编译,错误变了
/use_componet/main/hello_world_main.c:13:10: fatal error: esp_flash.h: No such file or directory13 | #include "esp_flash.h"| ^~~~~~~~~~~~~
compilation terminated.
[902/910] Building C object esp-id...provisioning.dir/src/manager.c.obj
ninja: build stopped: subcommand failed.
继续修改main/CMakeLists.txt,右键点#include "esp_flash.h",然后转到定义,可以看到esp_flash.h位于esp_flash模块,所以加上spi_flash组件
idf_component_register(SRCS "hello_world_main.c"INCLUDE_DIRS ""PRIV_REQUIRES spi_flash mycomp)
所有的include都有组件支持了,编译无错,运行后可以看到输出了 call by mycomp
I (331) main_task: Calling app_main()
Hello world!
This is esp32 chip with 2 CPU core(s), WiFi/BTBLE, silicon revision v3.0, 2MB external flash
Minimum free heap size: 301172 bytes
Restarting in 10 seconds...
......
Restarting in 0 seconds...
Restarting now.
call by mycomp
ets Jul 29 2019 12:21:46rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
.....
8、如果自己的组件中不止一个源文件怎么办,方法是编辑组件根下的CMakeLists.txt,这里示例为components/mycomp/CMakeLists.txt,有两个方法可以组织源文件和头文件
file(GLOB_RECURSE SOURCES *.c */*.c)set(include_dirs """include"
)
idf_component_register(SRCS ${SOURCES}INCLUDE_DIRS ${include_dirs})# idf_component_register(SRCS "mycomp.c" "mycomp2.c"
# INCLUDE_DIRS "include")
这里简单示例,mycomp2.c和mycomp.c功能差不多,最后在主程序func();后面加了行func2();
运行结果:
I (331) main_task: Calling app_main()
Hello world!
This is esp32 chip with 2 CPU core(s), WiFi/BTBLE, silicon revision v3.0, 2MB external flash
Minimum free heap size: 301172 bytes
Restarting in 10 seconds...
....
Restarting in 0 seconds...
Restarting now.
call by mycomp
call by mycomp---2
ets Jul 29 2019 12:21:46
9、小结
如果main模块编译出错,需要编辑同级CMakeLists.txt,如果组件编译出错,也要编辑同级CMakeLists.txt
如果需要,执行COMMAND->Full Clean
相关文章:

在vscode的ESP-IDF中使用自定义组件
以hello-world为例,演示步骤和注意事项 1、新建ESP-IDF项目 选择模板 从hello-world模板创建 2、打开项目 3、编译结果没错 正在执行任务: /home/azhu/.espressif/python_env/idf5.1_py3.10_env/bin/python /home/azhu/esp/v5.1/esp-idf/tools/idf_size.py /home…...

目标检测,语义分割标注工具--labelimg labelme
1 labelimg labelimg可以用来标注目标检测的数据集, 提供多种格式的输出, 如Pascal Voc, YOLO等。 1.1 安装 pip install labelimg1.2 使用 命令行直接输入labelimg即可打开软件主界面进行操作。 使用非常简单, 不做过细的介绍࿰…...

发明专利与实用新型专利申请过程及自助与代办方式对比
申请专利(发明专利、实用新型专利、外观设计专利)有两种方式:1、自己直接向国家知识产权局申请。2、通过专利代办处申请。以下是对这两种专利类型(发明专利、实用新型专利)申请过程及两种申请方式的详细介绍和对比,参考…...

Datawhale AI冬令营(第二期)动手学AI Agent task2--学Prompt工程,优化Agent效果
目录 如何写好Prompt? 工具包神器1:Prompt框架——CO-STAR 框架 工具包神器2:Prompt结构优化 工具包神器3:引入案例 案例:构建虚拟女友小冰 1. 按照 CO-STAR框架 梳理目标 2. 撰写Prompt 3. 制作对话生成应用&…...

基于python对网页进行爬虫简单教程
python对网页进行爬虫 基于BeautifulSoup的爬虫—源码 """ 基于BeautifulSoup的爬虫###?一、BeautifulSoup简介1.?Beautiful?Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供…...

【JavaEE进阶】@RequestMapping注解
目录 📕前言 🌴项目准备 🌲建立连接 🚩RequestMapping注解 🚩RequestMapping 注解介绍 🎄RequestMapping是GET还是POST请求? 🚩通过Fiddler查看 🚩Postman查看 …...

【WebAR-图像跟踪】在Unity中基于Imagine WebAR实现AR图像识别
写在前面的话 感慨一下, WebXR的发展是真的快,20年的时候,大多都在用AR.js做WebAR。随着WebXR标准发展,现在诸如Threejs、AFrame、Unity等多个平台都支持里WebXR。 本文将介绍在Unity中使用 Image Tracker实现Web端的AR图像识别功…...
向bash shell脚本传参
例子: ~ script % touch parameter.sh ~ script % chmod 755 parameter.sh ~ % vim parameter.shparameter.sh: #!/usr/bin/env bashecho the name of current script is $0echo the first parameter is $1echo the second parameter is $2echo all parameters: $…...
Oracle中listagg与wm_concat函数的区别
Oracle中listagg与wm_concat都可以用于将多行数据合并成一个字符串的两个函数,区别如下: 1、分隔符:listagg支持指定分隔符,wm_concat默认为","不支持指定; 2、排序:listagg支持排序后…...
热更新与资源管理
热更新、资源管理、打包发布是 Unity 游戏开发中关键的技术点。这些功能可以极大地提高项目的灵活性和资源利用效率,尤其是在多平台、长生命周期的游戏项目中。以下从技术概述、知识点分析、实现方法和代码举例逐一进行详细分析。 一、热更新 热更新指在不重新发布…...

Momentum Provably Improves Error Feedback!
以下是您提供的论文摘要的翻译: **摘要** 由于在分布式环境中训练机器学习模型时通信开销较高,现代算法不可避免地依赖于有损通信压缩。然而,如果不加以处理,压缩造成的错误会传播,并可能导致严重的不稳定行为&#…...

Elasticsearch-脚本查询
脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性…...

《Opencv》基础操作详解(3)
接上篇:《Opencv》基础操作详解(2)-CSDN博客 Opencv基础操作 目录 Opencv基础操作 18、图像边界填充 19、阈值处理(图像的二值化) 20、图像平滑处理 (1)、均值滤波(Mean Filte…...

meshy的文本到3d的使用
Meshy官方网站: 中文官网: Meshy官网中文站 编辑 Opens in a new window 编辑www.meshycn.com Meshy AI 中文官网首页 英文官网: Meshy目前似乎还没有单独的英文官网,但您可以在中文官网上找到英文界面或相关英文资料。 链…...

C语言技巧之有条件的累加
什么叫有条件的累加? 主要是依靠循环,一般形式是一个在循环里面遍历,另一个只有达到一定的条件才会累加(移动到下一个变量),从言语也能看出来,主要是用在字符串和数组里面的,毕竟链表…...

解释为什么fetch(JavaScript)无法将读取的数据存入外部变量
(一)问题描述 你可能会遇到这样的情况:在fetch之外创建变量,将fetch获取到的数据赋值给这个变量以便在fetch外使用,但在使用这个变量的时候发现值是空的,这是为什么呢? (二…...

Windows Subsystem for Linux (WSL)
目录 定义与功能 版本与特点 应用场景 启用 WSL 功能 更新WSL及其内核 下载Linux发行版本 WSL(Windows Subsystem for Linux)是微软在Windows 10和Windows 11中引入的一项功能,使用户能够在Windows上原生运行Linux的命令行工具和应用程…...
Go的Slice如何扩容
在Go语言中,slice(切片)是一个动态数组,其底层实现是基于数组,但提供了更灵活的长度和容量管理。当向slice中添加元素并超出其当前容量时,Go会自动为其分配一个更大的底层数组,并复制现有元素到…...
使用云计算开发App 有哪些坑需要避免
当我们在云计算环境下开发App时,往往会觉得一切都变得“轻松”了。毕竟,云计算提供了无限的计算资源、灵活的存储方案,还有自动化的服务,仿佛有了一个万能的工具箱,啥都能搞定。可是,别被这种“轻松”外表骗…...
ARM 架构--通用寄存器状态寄存器控制寄存器特殊用途寄存器
目录 一?ARM 架构中的寄存器 ARM 架构中的寄存器 通用寄存器 状态寄存器 控制寄存器 特殊用途寄存器 总结 二 通用寄存器 ARM 架构中的通用寄存器 ARMv7 架构 ARMv8 架构 实例 ARMv7 架构 ARMv8 架构 三 状态寄存器 ARM 架构中的状态寄存器 状态寄存器 详细…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...