esp-idf 项目增加 components 方法

/ 0评 / 0

esp-idf项目使用components方式,可以把多个功能分开的做到多个组件里,这样可以做到松散耦合.

这里记录一下esp-idf如何增加component,增加LVGL移植层,首先确保目前Hello World是能跑的,不然接下来都没得谈了.

新建一个components目录,然后把需要的模块目录放进去,一般来说,兼容Cmake的都可以直接丢进去,这样我们发布时候可以按submodule发到GitHub,并且可以规避一些版权问题.

在顶层的CMakeLists.txt添加引用.

# The following lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.16)

set(EXTRA_COMPONENT_DIRS ./components/lvgl)

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

这时候直接编译也是可以过的,因为lvgl默认是被禁止的,这是他代码里的设定,为了不打乱lvgl的代码,部分设定会因内部的Kconfig自动提到menuconfig配置里,一部分移植硬件抽象层需要自己实现.

把lvgl移植目录内的lv_port_disp_template.h/lv_port_disp_template.c复制到main目录并改名.

通过内部宏定义使能这个文件,这个就具体看LVGL文档了,这里也不再多说,在内层的CMakeList.txt中引入文件.

idf_component_register(SRCS "hello_world_main.c"
                    SRCS "lv_port_disp.c"
                    INCLUDE_DIRS "")

从警告信息看到,已经参与了编译.

如果是自己的模块怎么处理呢?我现在新建了一个全空的组件.

就像之前添加源文件一样,写入一些代码,以及在CMakeList.txt添加对应的内容,因为这里用到了drivers库,所以这里还要增加一个依赖,REQUIRES跟着component名,可以是内部的也可以是外部的.

idf_component_register(SRCS "led.c"
                    REQUIRES driver
                    INCLUDE_DIRS ".")

在外面也要记得添加引用.

编译测试成功.

有没有必要把lv_port_disp这些单独做一个components呢,我认为是没必要的,主要他其实属于HAL层,并不通用,当然如果做成components也没问题.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注