ESP32开发(4):构建自己的工程
ESP32开发初学者,文章内容纯属个人经验,有错误在所难免,望见谅! 2019-4-12更新: 有网友反映,那个宏编译没有起作用,经过测试的确存在这样的问题,改正方法是,将宏判断写在主函数所在的文件中。
最小工程
ESP32通过Makefile和component.mk编译和组织工程文件。 下图是一个最小的可编译的工程框架 我们来看各个文件的内容
# # "main" pseudo-component makefile. # # (Uses default behaviour of compiling all source files in directory, adding include to include path.)
对的,你没看错,只有几行注释,但是这个文件却是必须有的,没有这个文件,Makefile在编译工程时就会找不到app_main这个启动函数。在这个文件中也可以写入main文件夹下的头文件和源文件路径,这个后面再说。 user_app_main.c
#include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" static const char* TAG = "APP MAIN"; void app_main() { uint8_t count = 0; ESP_LOGI(TAG,"=====this is a test project======"); while(1) { ESP_LOGI(TAG,"count:%d",count++); vTaskDelay(1000); } }
一个比较简单的测试例程,每隔一段时间在终端打印一次count Makefile
# # This is a project Makefile. It is assumed the directory this Makefile resides in is a # project subdirectory. # PROJECT_NAME := my_project include $(IDF_PATH)/make/project.mk
每个ESP32工程都会有这样一个Makefile文件,用来配置整个项目。没有这个文件,就不能使用make命令来编译你的工程。 第一行PROJECT_NAME := my_project用来设置工程编译完成后的bin文件的名称; 第二行include $(IDF_PATH)/make/project.mk用来设置编译所需的组件库的路径,将你的工程文件和esp-idf这个组件库链接起来。 现在,我们在终端输入make来编译整个工程 会发现多了一个build文件夹和sdkconfig文件,build文件夹用来放编译过程中产生的输出文件,sdkconfig文件用来存放menuconfig的配置文件,就是上面那个菜单的有关配置。 编译完成后,会产生三个bin文件,其中一个就是我们刚才在Makefile中设置的my_project.bin
添加自己的组件
我们在工程主目录下,建立一个components文件夹用来放置我们自定义的组件 然后在components中创建如下目录,文件作用我们后说。 在component,mk中输入以下内容
COMPONENT_ADD_INCLUDEDIRS := include
表示组件源文件所需的头文件都到component.mk所在目录的include文件夹下找,别的组件如果引用到本组件的所包含的头文件也会到这个include文件夹下找。如果组件框架比较复杂,我们可能还需要添加其他路径,假如my_comp组件下还含有lib/inc(.h文件)和lib/src(.c文件)文件夹,那我们就需要将其路径添加在component.mk中,以便编译器能找到它们。
COMPONENT_ADD_INCLUDEDIRS := ./lib/inc ./include COMPONENT_SRCDIRS := ./ lib/src
在Kconfig文件中输入如下代码
menu "MY_COMP" config MY_COMP_ENABLE bool "Enable my_comp" default "y" endmenu
这段代码的作用,是在menuconfig主菜单下添加一个我们自定义的组件MY_COMP,在这个组件中有一个宏MY_COMP_ENABLE,它的默认值为“y”(意思就是选中),通过这样的方式,我们就可以配置和裁剪我们的工程,这将非常有利于我们的开发工作,在ESP32自带的组件中,我们可以看到很多这样的文件。 我们可以在程序中通过这个宏来控制程序的条件编译,我们来看 my_comp.c
#include <stdio.h> #include "my_comp.h" void my_comp_test(void) { #if(CONFIG_MY_COMP_ENABLE == y) printf("my_comp is configed "); #else printf("not config"); #endif }
标准格式的头文件…… my_comp.h
#ifndef _MY_COMP_H_ #define _MY_COMP_H_ void my_comp_test(void); #endif
然后在app_main函数中执行测试函数,编译下载到开发板,我们直接来看运行结果 至此,我们就实现了一个ESP32开发的最基本框架。我们可以在此基础上,再添加其他组件,比如wifi、TouchPad和LED等等。