当前位置: 首页 > news >正文

在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为例&#xff0c;演示步骤和注意事项 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可以用来标注目标检测的数据集&#xff0c; 提供多种格式的输出&#xff0c; 如Pascal Voc, YOLO等。 1.1 安装 pip install labelimg1.2 使用 命令行直接输入labelimg即可打开软件主界面进行操作。 使用非常简单&#xff0c; 不做过细的介绍&#xff0…...

发明专利与实用新型专利申请过程及自助与代办方式对比

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

Datawhale AI冬令营(第二期)动手学AI Agent task2--学Prompt工程,优化Agent效果

目录 如何写好Prompt&#xff1f; 工具包神器1&#xff1a;Prompt框架——CO-STAR 框架 工具包神器2&#xff1a;Prompt结构优化 工具包神器3&#xff1a;引入案例 案例&#xff1a;构建虚拟女友小冰 1. 按照 CO-STAR框架 梳理目标 2. 撰写Prompt 3. 制作对话生成应用&…...

基于python对网页进行爬虫简单教程

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

【JavaEE进阶】@RequestMapping注解

目录 &#x1f4d5;前言 &#x1f334;项目准备 &#x1f332;建立连接 &#x1f6a9;RequestMapping注解 &#x1f6a9;RequestMapping 注解介绍 &#x1f384;RequestMapping是GET还是POST请求&#xff1f; &#x1f6a9;通过Fiddler查看 &#x1f6a9;Postman查看 …...

【WebAR-图像跟踪】在Unity中基于Imagine WebAR实现AR图像识别

写在前面的话 感慨一下&#xff0c; WebXR的发展是真的快&#xff0c;20年的时候&#xff0c;大多都在用AR.js做WebAR。随着WebXR标准发展&#xff0c;现在诸如Threejs、AFrame、Unity等多个平台都支持里WebXR。 本文将介绍在Unity中使用 Image Tracker实现Web端的AR图像识别功…...

向bash shell脚本传参

例子&#xff1a; ~ 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都可以用于将多行数据合并成一个字符串的两个函数&#xff0c;区别如下&#xff1a; 1、分隔符&#xff1a;listagg支持指定分隔符&#xff0c;wm_concat默认为"&#xff0c;"不支持指定&#xff1b; 2、排序&#xff1a;listagg支持排序后…...

热更新与资源管理

热更新、资源管理、打包发布是 Unity 游戏开发中关键的技术点。这些功能可以极大地提高项目的灵活性和资源利用效率&#xff0c;尤其是在多平台、长生命周期的游戏项目中。以下从技术概述、知识点分析、实现方法和代码举例逐一进行详细分析。 一、热更新 热更新指在不重新发布…...

Momentum Provably Improves Error Feedback!

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

Elasticsearch-脚本查询

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

《Opencv》基础操作详解(3)

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

meshy的文本到3d的使用

Meshy官方网站&#xff1a; 中文官网&#xff1a; Meshy官网中文站 ​编辑 Opens in a new window ​编辑www.meshycn.com Meshy AI 中文官网首页 英文官网&#xff1a; Meshy目前似乎还没有单独的英文官网&#xff0c;但您可以在中文官网上找到英文界面或相关英文资料。 链…...

C语言技巧之有条件的累加

什么叫有条件的累加&#xff1f; 主要是依靠循环&#xff0c;一般形式是一个在循环里面遍历&#xff0c;另一个只有达到一定的条件才会累加&#xff08;移动到下一个变量&#xff09;&#xff0c;从言语也能看出来&#xff0c;主要是用在字符串和数组里面的&#xff0c;毕竟链表…...

解释为什么fetch(JavaScript)无法将读取的数据存入外部变量

&#xff08;一&#xff09;问题描述 你可能会遇到这样的情况&#xff1a;在fetch之外创建变量&#xff0c;将fetch获取到的数据赋值给这个变量以便在fetch外使用&#xff0c;但在使用这个变量的时候发现值是空的&#xff0c;这是为什么呢&#xff1f; &#xff08;二&#xf…...

Windows Subsystem for Linux (WSL)

目录 定义与功能 版本与特点 应用场景 启用 WSL 功能 更新WSL及其内核 下载Linux发行版本 WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软在Windows 10和Windows 11中引入的一项功能&#xff0c;使用户能够在Windows上原生运行Linux的命令行工具和应用程…...

Go的Slice如何扩容

在Go语言中&#xff0c;slice&#xff08;切片&#xff09;是一个动态数组&#xff0c;其底层实现是基于数组&#xff0c;但提供了更灵活的长度和容量管理。当向slice中添加元素并超出其当前容量时&#xff0c;Go会自动为其分配一个更大的底层数组&#xff0c;并复制现有元素到…...

使用云计算开发App 有哪些坑需要避免

当我们在云计算环境下开发App时&#xff0c;往往会觉得一切都变得“轻松”了。毕竟&#xff0c;云计算提供了无限的计算资源、灵活的存储方案&#xff0c;还有自动化的服务&#xff0c;仿佛有了一个万能的工具箱&#xff0c;啥都能搞定。可是&#xff0c;别被这种“轻松”外表骗…...

ARM 架构--通用寄存器状态寄存器控制寄存器特殊用途寄存器

目录 一?ARM 架构中的寄存器 ARM 架构中的寄存器 通用寄存器 状态寄存器 控制寄存器 特殊用途寄存器 总结 二 通用寄存器 ARM 架构中的通用寄存器 ARMv7 架构 ARMv8 架构 实例 ARMv7 架构 ARMv8 架构 三 状态寄存器 ARM 架构中的状态寄存器 状态寄存器 详细…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...