在之前讲解esp-idf的文件结构时,曾经讲过component是esp-idf集成的功能块,这篇文章就来讲解下,如何在esp-idf 中添加自己的component。
STEP1;
创建component文件夹结构
这里以linux下开发为例,这里在自己的的工程中添加, 首先在自己的工程下创建components文件夹(这个名称不能错)(或者直接用esp-idf下的components文件夹),然后在components的文件夹中创建my_com(这个文件夹可根据需求填写)文件夹
并在其下创建include的子目录,include目录下主要用来存放组件所需的头文件。
STEP2;
添加makefile文件和Kconfig文件
如果大家对linux开发比较熟悉的话,那么肯定对内核编译需要的.config文件不陌生,在.config文件中,我们发现有的模块被编译进了内核,有的只是生成了一个module。这中间,我们如何让内核发现我们编写的模块呢,这就需要在Kconfig中进行说明。至于如何生成模块,那么就需要利用Makefile告诉编译器,怎么编译生成这个模块。所以每个component目录下都需要有make文件。
在my_com目录下创建一个名为component.mk(名字不能更改)的make文件,并在文件中输入COMPONENT_ADD_INCLUDEDIRS:=include,这表示逐渐源文件所需的文件都到component.mk所在的目录的include文件夹下找,别的组件如果引用本组件所包含的头文件,也会到这个include文件夹下找。(对于Makefile,这里有篇基础教程讲解的不错,可以看看http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=16880)
在my_comp 目录下创建Kconfig文件,复制如下内容到该文件
menu "MY_COM" config MY_COM_ENABLE bool "Enable my_com" default "y" endmenu
其中第一行表示在menucom中添加MY_COM这一选项,这是向用户展示的用户名,可以自己定义。
第二行config命令表示该配置文件会在sdkconfig中生成CONFIG_MY_COM_ENABLE的宏定义。
第三行表示在menuconfig中进入组件选项后会显示一个bool类型的选项,即yes or no。
第四行表示进入选项的默认状态"y"表示默认宣红,“n”表示非选中状态。
第五行表示menu命令结束,关于Kconfig的更多语法和功能,大家可以去网络上查询,这里不再赘述。
STEP3;
创建组件源文件
在my_com目录下创建my_com.c文件,复制以下代码到该文件中
#include <stdio.h>
#include <my_com.h>
void my_com_test()
{
#if(CONFIG_MY_COM_ENABLE==y)
printf("my_com is configed\n");
#else
printf("not config\n");
#endif
}
这是一个测试程序,用来测试menuconfig中的my_com组件是否已经配置成功。
在include文件夹中添加my_com.h头文件,头文件中对my_com_test函数进行申明,代码如下
#ifndef _MY_COM_H_ #define _MY_COM_H_ void my_com_test(void); #endif
STEP4;
修改顶层文件对组件文件进行调用
打开hello_world.c文件,将文件修改为如下所示
/* Hello World Example This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_spi_flash.h" #include "my_com.h" void app_main() { printf("Hello world!\n"); /* Print chip information */ esp_chip_info_t chip_info; esp_chip_info(&chip_info); printf("This is ESP32 chip with %d CPU cores, WiFi%s%s, ", chip_info.cores, (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "", (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : ""); printf("silicon revision %d, ", chip_info.revision); printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024), (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external"); for (int i = 10; i >= 0; i--) { printf("Restarting in %d seconds...\n", i); vTaskDelay(1000 / portTICK_PERIOD_MS); } printf("Restarting now.\n"); my_com_test(); fflush(stdout); esp_restart(); }
此时到hello_world 的工程目录下,运行指令
cd ~/esp32/workspace/hello_world/hello_world
make menuconfig
可以打开如下配置窗口,选择component config
选择进入之后可以看到一个MY_COM选项
选择进入之后有一个[*]Enable my_com(进入默认状态是勾选的,这和我们编写的Kconfig文件是一样的),我们可以通过空格键选择是否用*勾选,
STEP5;
程序烧写验证
设定完成后,选择save然后exit退出,通过make flash 指令将程序烧写到esp32开发板中,通过minicom查看输出。观察到的输出如下所示
这说明我们自己创建的组件my_com 已经添加成功了。
STEP6;
在eclipse添加自己创建的component路径
显而意见,添加了component后,如果要用eclipse打开工程,还需要将添加的component的路径添加到eclispe中,添加方法如下
至此,一个自己创建的component就添加完成了