在之前讲解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() / ( * ),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external"); for (int i = ; i >= ; i--) {
printf("Restarting in %d seconds...\n", i);
vTaskDelay( / 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就添加完成了

添加自己的component的更多相关文章

  1. 【社交系统ThinkSNS+研发日记三】基于 Laravel Route 的 ThinkSNS+ Component

    [社交系统ThinkSNS+研发日记系列] 一.<ThinkSNS+ 基于 Laravel master 分支,从 1 到 0,再到 0.1> 二.<基于 Laravel 开发 Th ...

  2. ionic UI Component Slides使用:手动滑动后自动滑动失效解决

    在使用ionic的UI组件Slides时,发现手动滑动后,自动滑动失效 然后历经一点点的艰辛查找后找到方法,如下: 页面代码使用 <ion-slides pager loop="tru ...

  3. 基于 Laravel Route 的 ThinkSNS+ Component

    这里是传送门: <ThinkSNS+ 基于 Laravel master 分支,从 1 到 0,再到 0.1[ThinkSNS+研发日记系列一]> <基于 Laravel 开发 Th ...

  4. [Android]使用Dagger 2进行依赖注入 - Producers(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6234811.html 使用Dagger 2进行依赖注入 - P ...

  5. QML 从无到有 (基础)

    小公司,没办法,什么都得自己亲自来. 服务端是MVC,现在需要可PC客户端和移动APP. 考虑到网页应用有很多界面框架,可以做出很漂亮的界面来,就尝试着使用nwjs来实现,可是在使用了2天的nwjs后 ...

  6. Spring中常见的bean创建异常

    Spring中常见的bean创建异常 1. 概述     本次我们将讨论在spring中BeanFactory创建bean实例时经常遇到的异常 org.springframework.beans.fa ...

  7. [Unity3D]巧妙利用父级子级实现Camera场景平面漫游

    本文系作者原创,转载请注明出处 入门级的笔者想了一上午才搞懂那个欧拉角的Camera旋转..=.= 在调试场景的时候,每次都本能的按下W想前进,但是这是不可能的(呵呵) 于是便心血来潮想顺便添加个Ke ...

  8. Spring 通过配置文件注入 properties文件

    当我们需要将某些值放入 properties文件 key=value 的方式,获取文件信息使用spring 注入的方式会变得很便捷 1. spring 配置文件需要导入 <?xml versio ...

  9. 导出excel失败,提醒提示加载类型库/DDL出错

    导出excel失败,提醒提示加载类型库/DDL出错 www.MyException.Cn   发布于:2012-08-17 02:08:34   浏览:1538次   导出excel失败,提示提示加载 ...

随机推荐

  1. Ubuntu16.04下修改MySQL数据的默认存储位置

    由于在Linux下MySQL默认是存储在/var/lib/mysql目录下,mysql的数据会非常大,由于/var所划分的空间不够大,所以我们需要将mysql数据存放路径修改一下,放到大分区里面,以便 ...

  2. Android开发 assets目录

    Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.Java里面自动生成该资源文件的ID,所以访问这种资源文件 ...

  3. nginx+python+windows 开始_02

    接上文:http://www.cnblogs.com/tacyeh/p/4790112.html 一.改造helloWorld.py import web urls = ('/', 'Home', ' ...

  4. HttpWebResponse远程服务器返回错误: (500) 内部服务器错误 的解决办法

    在工作中用C#开发了一个小程序,不断访问去请求一个网站的页面,在循环过程中有时会报“远程服务器返回错误: (500) 内部服务器错误”,有时不会,出现的时机也不太一样.开始以为是网站的问题,后来网站是 ...

  5. [C语言]进阶|指针与字符串

    ------------------------------------------------------------------------------------ 回顾:[C语言]指针与字符串 ...

  6. centos安装tree命令

    centos安装tree命令 sudo yum -y install tree windows安装tree命令 我的另一篇

  7. git clone Failed to connect to 127.0.0.1 port 43213: Connection refused

    不知道为什么使用git clone 的时候报了上面的错误,后面发现是 127.0.0.1 port 43213的端口被代理占用了,可以这样查看: $ env|grep -i proxy 结果是: NO ...

  8. Python利用PIL生成随机验证码图片

    安装pillow: pip install pillow PIL中的Image等模块提供了创建图片,制作图片的功能,大致的步骤就是我们利用random生成6个随机字符串,然后利用PIL将字符串绘制城图 ...

  9. 在网站中使用UEditor富文本编辑器

    UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器,具有轻量.可定制.用户体验优秀等特点. 官网链接 进入到下载页面,选择相应的版本下载 这里我们使用ASP.NET开发,所以选择 ...

  10. python生成器(generator)、迭代器(iterator)、可迭代对象(iterable)区别

    三者联系 迭代器(iterator)是一个更抽象的概念,任何对象,如果它的类有next方法(next python3)和__iter__方法返回自己本身,即为迭代器 通常生成器是通过调用一个或多个yi ...