1. 程式人生 > >添加自己的component

添加自己的component

查詢 編寫 sta 退出 sil 寫到 目錄 窗口 fflush

在之前講解esp-idf的文件結構時,曾經講過component是esp-idf集成的功能塊,這篇文章就來講解下,如何在esp-idf 中添加自己的component。

STEP1;

創建component文件夾結構

  這裏以linux下開發為例,這裏在esp-idf的工程中添加, 首先在component的文件夾中創建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文件夾下找。

技術分享

在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 已經添加成功了。

STEP7;

在eclipse添加自己創建的component路徑

顯而意見,添加了component後,如果要用eclipse打開工程,還需要將添加的component的路徑添加到eclispe中,添加方法如下

技術分享

至此,一個自己創建的component就添加完成了

添加自己的component