ESP-IDFプロジェクトへコンポーネントを追加する手順
ESP-IDF プロジェクトでは、ライブラリはコンポーネントと呼ばれる単位で管理される。自分の ESP-IDF プロジェクトで外部のライブラリを利用する場合は、ライブラリをコンポーネントとして定義し、そのコンポーネントをアプリから呼び出してやる。 簡単なコンポーネントの作成と、アプリから呼び出す方法を調べてまとめた。
はじめに
コンポーネントとは?
ESP-IDFプロジェクト内の各ソフトウェアコンポーネントをESP-IDFの「コンポーネント」として定義する
コンポーネントを組み合わせることでESP-IDFプロジェクトを構成する
用語
プロジェクト
単一のアプリを構築するための全てのファイルと設定
プロジェクト設定
プロジェクトルートの sdkconfig ファイル
アプリ
ESP-IDFによりビルドされる実行可能ファイル
1プロジェクトで2つのアプリがビルドされる
プロジェクトアプリ(メインの実行ファイル = カスタムファームウェア)
ブートローダーアプリ(プロジェクトアプリを起動する初期ブートローダー)
コンポーネント
静的ライブラリとしてコンパイルされ、アプリにリンクされるコードのモジュール部分
ターゲット
アプリケーションが構築されるハードウェア
idf.py --list-targets を実行すると表示される
コンポーネントを用いたプロジェクトの構成例
アプリは main へ、コンポーネントは components へ配置する。
code:tプロジェクト例
- myProject/
- CMakeLists.txt
- sdkconfig
- bootloader_components/ - boot_component/ - CMakeLists.txt
- Kconfig
- src1.c
- components/ - component1/ - CMakeLists.txt
- Kconfig
- src1.c
- component2/ - CMakeLists.txt
- Kconfig
- src1.c
- include/ - component2.h
- main/ - CMakeLists.txt
- src1.c
- src2.c
- build/
コンポーネントを追加する手順
プロジェクトへ新規コンポーネントを追加する手順は以下の通り。
idf.py create-component で新規コンポーネントを作成
アプリから呼び出し
新規コンポーネントを作成
プロジェクトのルートディレクトリへ components ディレクトリを作成し、idf.py create-component コマンドを利用して foo コンポーネントの雛形を作成する。
code:sh
mkdir components
cd components/
idf.py create-component foo
生成したコンポーネントの雛形には処理が何も記述されていないので適当な処理を追加。
code:diff
diff --git a/components/foo/CMakeLists.txt b/components/foo/CMakeLists.txt
new file mode 100644
index 0000000..ce8fe65
--- /dev/null
+++ b/components/foo/CMakeLists.txt
@@ -0,0 +1,2 @@
+idf_component_register(SRCS "foo.c"
+ INCLUDE_DIRS "include")
diff --git a/components/foo/foo.c b/components/foo/foo.c
new file mode 100644
index 0000000..41d375f
--- /dev/null
+++ b/components/foo/foo.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#include "foo.h"
+
+void foo(void)
+{
+ printf("foo\n");
+}
diff --git a/components/foo/include/foo.h b/components/foo/include/foo.h
new file mode 100644
index 0000000..ee83a3d
--- /dev/null
+++ b/components/foo/include/foo.h
@@ -0,0 +1 @@
+void foo(void);
コンポーネントはコンポーネント検索ディレクトリへ配置する必要がある。デフォルトの検索ディレクトリは以下の2つ。
IDF_PATH/components
PROJECT_DIR/components
また、COMPONENT_DIRS変数で検索ディレクトリを追加することもできる。
アプリから呼び出し
アプリからのコンポーネントの呼び出しに特別な処理は不要、ヘッダファイルを include して関数を呼び出すだけで良い。
code:diff
diff --git a/main/hello_world_main.c b/main/hello_world_main.c
index 7010f3e..749739b 100644
--- a/main/hello_world_main.c
+++ b/main/hello_world_main.c
@@ -12,10 +12,11 @@
+#include "foo.h"
void app_main(void)
{
- printf("Hello world!\n");
+ foo();
/* Print chip information */
esp_chip_info_t chip_info;
以下のように foo が出力される。
https://gyazo.com/dbe6494be87d1860bfd54ddf54bfb12d
参考
コンポーネント