一、项目的创建
方式一:基于IDF示例创建
在ESP-IDF中有example示例库,以其中的一个示例为模板创建项目。
1、打开示例库
查看 - 命令面板(也可以按住Ctrl+Shift+P 或 F1)
输入 show examples projects
2、以 hello_word 示例为模板,创建项目
方式二:直接创建项目
注意:直接创建项目要在文件夹中
1、用Vscode打开一个文件夹
文件-打开文件夹, 这里我们选了刚才放示例的文件夹“test”
2、开始创建
查看 - 命令面板(也可以按住Ctrl+Shift+P 或 F1)
输入 Create project from extension template 创建项目模板
第1项:将项目放在当前的test文件夹中。第二项:选择其他文件夹放置项目。
选择"template-app"
二、项目架构
这是一个最基本的hello-world工程,一个工程里,包含着很多的文件以及目录
.vscode目录:
这个目录是用来存放配置内容,比如:
settiong.json:用来控制诸多工作项的配置。如:工作空间设置、代码格式化配置、插件配置。
tasks.json:辅助程序编译的模块,我们只要在图形界面下操作即可生成可执行文件,即可代你执 行类似于在命令行输入 “gcc hello.c -o hello” 命令的操作。
launch.json:用于调试的配置文件,比如指定调试语言环境,指定调试类型等等。
c_cpp_properties.json:用于配置编译器环境的,包括启动器代号、位数(这些是自定义的)、编 译选项、启动设置、编译模式等。
build目录:
这个目录是用来存放编译输出的地方,如果没有这个目录,idf.py 在编译时会自动创建。CMake配置项 目后会在这个目录下生成临时的文件。此目录通常不会添加到项目的源码管理系统中,也不会随项目源 码一同发布。
main目录:
这个目录包含项目本身的源代码,main是一个默认名,意为主目录。
CMakelists.txt
这个文件设置了项目的全局变量,一般的CMakelists.txt分为顶层和其他层。 顶层的CMakelists.txt会导入esp-idf/tools/cmake/project.cmake 文件,由它负责实现构建系统的其余 部分。该文件最后会设置项目的名称,并定义该项目。说简单点,他就是CMake的配置文件。指定了由源码到目标文件的规则,十分重要。可以说有代码的地 方就有他。
Makefile
(由于使用的是CMake编译,在这里不需要使用Makefile,可删)
makefile工具被用来自动完成编译工作。包括:如果仅修改了某几个源文件,则只重新编译这几个源文 件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化 开发工作,避免不必要的重新编译。
sdkconfig
使用CMake编译时,从sdkconfig文件中加载项目配置信息,生成 sdkconfig.cmake 和 sdkconfig.h 文 件,分别用在 CMake 和 C/C++ 中定义配置项。如果项目配置发生了更改,CMake 会自动重新运行,重 新生成上述两个文件,接着重新配置项目。通过idf.py menuconfig可以修改配置项。
README.md
项目的描述说明,markdown文档。 除了上面说的这些目录,还有部分文件是后期创建,但经常会用到的。
component
目录中是项目的部分自定义组件,并不是每个项目都需要这种自定义组件,但它组件有助于构建可复用 的代码或者导入第三方(不属于 ESP-IDF)的组件。 最基础的组件包含着一个.c文件和对应的.h文件,以及一个CMakelists.txt。
三、CMakelists.txt
esp-idf在4.0版本之后是采用cmake来建立工程的,一般的工程中cmake都分为最外层(顶层)和内层 (其他层)。 我们最小工程helloworld中的cmake来简单分析一下cmake中的代码。
打开工程根目录编译脚本CMakeLists.txt可以看到下图我用蓝色标识出来的那条语句,其中IDF_PATH就是ESP-IDF在本机中的安装路径,例如我的安装路径就是这样的:“IDF_PATH”: “E:/Espressif/esp-idf”。
最外层分析
在cmake中,井号#表示注释的意思,等同于c语言中的//。
cmake_minimum_required 指的是cmake需要的最小版本,上面表示cmake版本需要3.5
include 表示需要导入esp-idf中的某个cmake文件,这个文件的作用是把esp-idf中所有的库放到我们的 工程中,只有这样我们才能在工程里面调用esp-idf库中的函数
project 这里是工程的命名,这个名字可以自取
最外层的CMakelists.txt 一般无需修改
内层分析
idf_component_register 这个函数是来自外层导入的文件,我们通过这个函数将自己的文件加入工程。
SRCS就是添加.c文件,而INCLUDE_DIRS则是用来添加.h文件所处的文件夹,这里加入.表示自身路径。
由于工程中.c文件的名字修改需要cmakelists.txt同步修改,所以我们直接用file函数利用正则将自身路 径下的所有.c文件列出来赋值给 SOURCES变量,并在SRCS中引入,这样就可以省去在cmakelists.txt中 修改.c名字的步骤。
CMakelists.txt 万能模板
最外层:
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(project_name)
其他层:
file(GLOB_RECURSE SOURCES *.c)
idf_component_register(SRCS ${SOURCES}
INCLUDE_DIRS “.”)