在以前講解esp-idf的文件結構時,曾經講過component是esp-idf集成的功能塊,這篇文章就來說解下,如何在esp-idf 中添加本身的component。php
這裏以linux下開發爲例,這裏在本身的的工程中添加, 首先在本身的工程下建立components文件夾(這個名稱不能錯)(或者直接用esp-idf下的components文件夾),而後在components的文件夾中建立my_com(這個文件夾可根據需求填寫)文件夾linux
並在其下建立include的子目錄,include目錄下主要用來存放組件所需的頭文件。express
若是你們對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)app
在my_comp 目錄下建立Kconfig文件,複製以下內容到該文件less
menu "MY_COM" config MY_COM_ENABLE bool "Enable my_com" default "y" endmenu
其中第一行表示在menucom中添加MY_COM這一選項,這是向用戶展現的用戶名,能夠本身定義。eclipse
第二行config命令表示該配置文件會在sdkconfig中生成CONFIG_MY_COM_ENABLE的宏定義。函數
第三行表示在menuconfig中進入組件選項後會顯示一個bool類型的選項,即yes or no。測試
第四行表示進入選項的默認狀態"y"表示默認宣紅,「n」表示非選中狀態。ui
第五行表示menu命令結束,關於Kconfig的更多語法和功能,你們能夠去網絡上查詢,這裏再也不贅述。
在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
打開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文件是同樣的),咱們能夠經過空格鍵選擇是否用*勾選,
設定完成後,選擇save而後exit退出,經過make flash 指令將程序燒寫到esp32開發板中,經過minicom查看輸出。觀察到的輸出以下所示
這說明咱們本身建立的組件my_com 已經添加成功了。
顯而意見,添加了component後,若是要用eclipse打開工程,還須要將添加的component的路徑添加到eclispe中,添加方法以下
至此,一個本身建立的component就添加完成了