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也没问题.