在之前讲解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. how find out what is causing Visual Studio to think each project is out of date

    You can find out what is causing Visual Studio to think each project is out of date, and then addres ...

  2. gentoo usb serial ch340 16进制读写

    首先安装包含 lsusb 命令的 usbutils, emerge -v usbutils. 使用 lsusb后,可以查看到 ch340 的信息: Bus 001 Device 004: ID 1a8 ...

  3. 学习笔记:Stage.js(又叫Cut.js)——2D canvas 开发库,游戏方面的

    http://piqnt.com/stage.js/ http://www.bootcdn.cn/stage.js/ Stage.js(可能又叫Cut.js)是一个2D HTML5 JavaScrip ...

  4. py库: GUI(tkinter)

    图形用户界面(Graphical User Interface,简称 GUI) http://www.runoob.com/python/python-gui-tkinter.html Python ...

  5. canal 配置 详细说明

    git hub  https://github.com/alibaba/canal canal.properties介绍:https://agapple.iteye.com/blog/1831873

  6. leetcode287

    public class Solution { public int FindDuplicate(int[] nums) { ) { ]; ]]; while (slow != fast) { slo ...

  7. linux使用privoxy将55转为http代理

    =============================================== 2018/3/21_第3次修改                       ccb_warlock 更新 ...

  8. Android Studio2.0 教程从入门到精通Windows版 - 提高篇

    第二篇我们开发了一个Hello World应用,并介绍Android Sutdio的界面和如何调试应用,接下来将介绍一些常用的快捷键和必备插件. 常用快捷键 代码跳转 描述:跳转是为了方便代码位置的定 ...

  9. node起一个简单服务,打开本地项目或文件浏览

    1.安装nodejs 2.在项目文件夹目录下创建一个js文件,命名server.js(自定义名称),内容如下 var http = require('http'); var fs = require( ...

  10. Quartz基础知识了解(一)

    一.QuartZ是什么? 二.获取 三.核心接口 Scheduler - 与调度程序交互的主要API. Job - 由希望由调度程序执行的组件实现的接口. JobDetail - 用于定义作业的实例. ...