3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SPRESENSE SDKに独自の拡張機能を追加する【External Library】

Last updated at Posted at 2022-09-13

SPRESENSEを使ってIoTシステムを開発していく中で、アプリケーション共通の機能をライブラリとして実装したくなることがあります。独自の拡張機能を追加できるよう、Visual Studio CodeベースのSPRESENSE開発環境である「SPRESENSE SDK」はExternal Libraryという仕組みを備えています。

スクリーンショット 2022-09-13 18.03.16.png

既存のExternal Library

2022年9月現在、External Libraryとして既に以下の機能が提供されています。これらは、SDKコンフィグにてON/OFFを切り替えることにより、アプリケーションとリンクすることができます( https://github.com/sonydevworld/spresense/tree/master/externals )。

  • mbedtls
  • awsiot
  • cmsis
  • libjpeg
  • wakaama:LightWeight M2M protocol (LWM2M)
  • mqtt
  • tensorflow

など

External Libraryを追加する

動画

手順

自前のExternal Libraryを作成・追加することは非常に簡単です。こちらのテンプレート( https://bit.ly/spresense_extlib_sample )をダウンロードし、External Libraryディレクトリ内に展開してください。その後、externalディレクトリにあるKconfigに1行追加します。

menu "Externals"
source "/Users/shino/spresense/externals/sample_extlib/Kconfig"
...
endmenu # Externals

これだけで、sample_extlibという名前のExternal Libraryが定義されます。内容物を更新することで、独自のライブラリへと進化させてください。サンプルのExternal Libraryを構成しているファイルの意味と内容は以下の通りです。

Kconfig

SDKコンフィグのメニューを定義しています。
「config EXTERNALS_SAMPLE_EXTLIB」は、DefineとしてCONFIG_EXTERNALS_SAMPLE_EXTLIBをON/OFFする設定項目です。if文を利用可能で、項目が選択されている場合に、子項目を表示するといった設定が可能です。

config EXTERNALS_SAMPLE_EXTLIB
	bool "Sample External Libraries"
	default n
	---help---
		Enable Sample External Libraries.
    
if EXTERNALS_SAMPLE_EXTLIB
config EXTERNALS_SAMPLE_EXTLIB_DEBUGON
	bool "Enablke Debug Print in Sample External Libraries"
	default n
	---help---
		Set log enable of sample extlib component.

endif # EXTERNALS_SAMPLE_EXTLIB

Makefile

ビルドするソースコードや、関連するディレクトリ、生成するライブラリ名を決定します。一般的なMakefileですが、ビルドする処理についてはSPRESENSE SDK全体で共通の定義がありますので省略されています。

-include $(APPDIR)/Make.defs
-include $(SDKDIR)/Make.defs

BIN = libsample_extlib$(LIBEXT)

SAMPLE_EXTLIB_ROOT    = sample_extlib_src

SAMPLE_EXTLIB_DIRS    := $(shell find $(SAMPLE_EXTLIB_ROOT) -type d)
SAMPLE_EXTLIB_SRCS    := $(foreach dir, $(SAMPLE_EXTLIB_DIRS), $(wildcard $(dir)/*.c))
SAMPLE_EXTLIB_OBJS    := $(SAMPLE_EXTLIB_SRCS:.c=.o)

CSRCS         := $(SAMPLE_EXTLIB_SRCS)
CFLAGS        += -std=c99 -DENABLE_SAMPLE_EXTLIB
CFLAGS        += $(addprefix "-I", $(SAMPLE_EXTLIB_DIRS))

VPATH         := $(SAMPLE_EXTLIB_DIRS)
ROOTDEPPATH   := $(foreach dir,$(SAMPLE_EXTLIB_DIRS), --dep-path $(dir))

include $(APPDIR)/Application.mk

Make.defs

Makefileにincludeされます。ここで、対象のライブラリをビルド対象に設定しています。SDKコンフィグのON/OFFに合わせてビルド対象or対象外を選択できるようにしています。

ifeq ($(CONFIG_EXTERNALS_SAMPLE_EXTLIB),y)
CONFIGURED_APPS += sample_extlib
endif

Library.mk

ビルド結果のライブラリをリンクする設定を記述するファイルです。SDKコンフィグのON/OFFに合わせてリンクを付け外しできるようにしています。Makefileのビルド製生物と名前を一致させる必要があります。例えば、Makefileでlibsample_extlib.aを生成する場合、このファイルでは、-lsample_extlibを指定します。

ifeq ($(CONFIG_EXTERNALS_SAMPLE_EXTLIB),y)
  EXTRA_LIBPATHS += -L "$(EXTLIBDIR)$(DELIM)sample_extlib"
  EXTRA_LIBS     += -lsample_extlib
endif

LibIncludes.mk

ライブラリを含めてビルドする場合に、他のソースコードのビルドオプションに追加するものがあれば、追記するファイルです。主に-Iオプションを指定し、ライブラリ内のincludeフォルダをincludeできるようにしておきます。その他、追加Define(以下例ではENABLE_SAMPLE_EXTLIBを追加Define)などを指定します。

ifeq ($(CONFIG_EXTERNALS_SAMPLE_EXTLIB),y)
CFLAGS += -std=c99 -DENABLE_SAMPLE_EXTLIB
endif

ifeq ($(CONFIG_EXTERNALS_SAMPLE_EXTLIB),y)
CFLAGS   += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" "$(SDKDIR)/../externals/sample_extlib/sample_extlib_src"}
endif

以上を加えて、SDKコンフィグでExternal Libraryを選択し、ビルドしてください。

スクリーンショット 2022-09-13 17.57.36.png

アプリケーションからの利用方法

アプリケーションからExternal Libraryを使う場合、includeを追加し、利用したい関数を呼び出してください。LibIncludes.mkによりincludeのパスが通っていますので、<>で宣言可能です。

#include <stdio.h>
#include <stdint.h>
#include <sample_extlib.h>

int
main
(int argc, char *argv[])
{
    int a = 10;
    int b = 20;
    int c;
    /* call Sample External Lib */
    c = sample_extlib_add(a, b);
    return 0;
}

最初に述べました通り、MQTTなどの便利機能をライブラリ化するためのものですので、複雑な実装ももちろん入れることが可能です(むしろ複雑な実装を入れることが目的ですね)。SPRESENSE SDKにこの機能を入れたい!とアイデアをお持ちの方、是非お試しください。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?