news 2026/4/17 21:44:57

添加组件到idf项目中

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
添加组件到idf项目中

在 ESP-IDF 工程里,把“旧驱动”从工程里剔除、再把“新驱动”放进components/作为组件,核心就是两件事:组件目录结构 + CMake 注册/依赖关系。你给的这个工程本身就是标准 ESP-IDF 工程结构(根目录有components/main/、顶层CMakeLists.txt)。

下面按“最常见、最稳”的做法给你一套直接可落地的步骤。


1) 把新驱动做成一个组件(放到 components 里)

在工程根目录新建:

components/new_driver/

CMakeLists.txt

include/

new_driver.h

src/

new_driver.c (或 .cpp)

components/new_driver/CMakeLists.txt示例(最常用写法):

idf_component_register(

SRCS

"src/new_driver.c"

INCLUDE_DIRS

"include"

REQUIRES

driver

)

ESP-IDF 的 build-system 会自动扫描PROJECT_DIR/components下的组件并参与构建;顶层CMakeLists.txt默认甚至可以非常“极简”。


2) 让 main(或其它模块)改用新驱动

情况 A:旧驱动本来就是一个组件

比如旧驱动在components/old_driver/

  • 代码里把#include "old_driver.h"改成#include "new_driver.h"

  • main/CMakeLists.txt里显式声明了依赖(有些项目会写),把REQUIRES old_driver改为REQUIRES new_driver

main/CMakeLists.txt常见形态举例:

idf_component_register(SRCS "main.c"

INCLUDE_DIRS "."

REQUIRES new_driver)

提醒:REQUIRES/PRIV_REQUIRES不要依赖CONFIG_xxx做条件判断(ESP-IDF 依赖展开阶段更早),否则很容易“配置生效但依赖没带上”。

情况 B:旧驱动代码散落在 main/ 里(不是组件)

那就把旧驱动源文件从main/CMakeLists.txtSRCS列表里移除,把这些源文件移到components/new_driver/src/,头文件移到components/new_driver/include/,再按上面注册即可。


3) “取消原有驱动”的三种方式(选一种)

✅ 最推荐:直接删掉或改名旧组件目录

如果旧驱动是components/old_driver/

  • 直接删除该目录,或改名(避免同名组件被扫描到)

这是最干净的“取消”。

✅ 可控做法:顶层 CMakeLists 用 EXCLUDE_COMPONENTS 排除

如果你暂时不想删目录(比如留着对比),可以在顶层CMakeLists.txt里,在include(project.cmake)之前加:

set(EXCLUDE_COMPONENTS old_driver)

cmake_minimum_required(VERSION 3.16)

include($ENV{IDF_PATH}/tools/cmake/project.cmake)

project(RoPet_ESPS3_AI_EYE)

EXCLUDE_COMPONENTS在 ESP-IDF CMake build 体系里就是用来把组件从构建列表里排除的(社区/官方 issue 里也常用这个方式)。

注:它主要减少“参与构建/编译”的组件,是否减少最终 bin 大小取决于链接裁剪与实际引用关系。

✅ 如果旧驱动来自 managed_components(组件管理器下载的)

不要改managed_components/(官方建议避免手改),做法是:

  1. 把它复制到components/下改成你的版本(同名可覆盖优先级)

  2. idf_component.yml(如果项目用了)里移除该依赖

  3. idf.py reconfigure或删build/重配

ESP-IDF 文档明确提到:需要改 managed 组件时应复制到components,并且“同名组件按优先级覆盖”;覆盖后要reconfigure


4) 顶层 CMakeLists.txt 需要怎么改?

大多数情况下不需要改。
因为components/本来就是默认扫描目录,顶层 CMakeLists 最小只要三行也能工作。

你只有在下面两种情况才需要动顶层 CMakeLists:

  • 新驱动不放在components/,而放在别的目录:用EXTRA_COMPONENT_DIRS加路径(文档里有说明)。

  • 你想“保留旧驱动目录但不编译”:用上面的EXCLUDE_COMPONENTS


5) 最后别忘了:清理 + 重配一次

组件增删/覆盖后,按文档建议做一次:

idf.py fullclean

idf.py reconfigure

idf.py build

(或直接删除build/目录再idf.py build


如果你把“旧驱动”的名字(组件目录名或源文件路径)贴出来,比如它在components/xxx还是main/xxx,我可以按你这个工程的实际结构,把要改的文件清单 + 每个 CMakeLists 具体改哪几行直接给你对照版。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 10:51:29

SIEMENS同步电机1FT7105- 5WF71-4NH1

SIEMENS同步电机1FT7105-5WF71-4NH1与普通电机在结构设计、控制方式、性能表现和应用场景上存在本质区别。该电机作为高性能永磁同步伺服电机,专为精密工业自动化系统打造,而普通电机(如异步电机)则更适用于对动态响应和控制精度要…

作者头像 李华
网站建设 2026/4/17 14:37:53

内核子系统、SoC控制器驱动、驱动与内核的关系

这是一个关于Linux内核架构的核心问题,涉及内核子系统、SoC控制器驱动、驱动与内核的关系。让我用清晰的层次结构为您解释: 一、整体架构关系图 ┌─────────────────────────────────────────────────…

作者头像 李华
网站建设 2026/4/18 5:15:02

【C/C++】线程池详解

线程池详解 (Thread Pool Deep Dive) 什么是线程池?(What is a Thread Pool?) 线程池是一种多线程处理模式,它预先创建一定数量的线程,将任务放入队列中,由空闲的线程从队列中取出任务并执行。 为什么需要线程池? …

作者头像 李华
网站建设 2026/4/18 14:21:17

决策陷阱:混淆平均与边际,汤姆该让多少艘渔船出海?

决策陷阱:混淆平均与边际,汤姆该让多少艘渔船出海? 清晨的渔港风平浪静,汤姆盯着码头边的三艘渔船,心里盘算起新的生意经:“三艘船每天总收益 600 美元,平均每艘赚 200 美元;总成本…

作者头像 李华
网站建设 2026/4/18 6:30:29

建议收藏|千笔·专业论文写作工具,最受欢迎的一键生成论文工具

你是否曾为论文选题而烦恼,反复修改却仍不满意?文献查找耗时耗力,格式排版总是出错,查重率又让人焦虑不已?面对这些学术写作的“老大难”,很多研究生都感到束手无策。而如今,一款专为论文写作设…

作者头像 李华