この記事はSpresense Advent Calendar 2023の1日目(12/1分)です。
この記事は何?
slコマンドをSpreseneで簡単にできたことを共有する記事です。
どうも。
— k-abe@組み込まれた猫使い🧙♂️ (@juraruming) April 6, 2023
自称・spresense芸人です。
spresense SDKで動いているspresenseでslコマンドが動きました。
チュートリアルでPDCursesのサンプルプログラムがあったのでslコマンドの移植できるかなぁ、と思ったら割と簡単にできました。
だからなんだ?という感じですが、楽しいので良しとしましょう。 pic.twitter.com/yhQTldi76y
コード
コードはGitHubリポジトリに置きました。
slコマンドを確認するモチベーション
マイコンボードでLチカが確認できたら何をしていますか?
私の場合、つぎのステップとしてslコマンドを試してみることが多いのでSpresenseでも試してみました。
確認環境
ハードウェア
つぎのハードウェアで確認しました。
- Spresenseメインボード
- Spresense拡張ボード
- LCD ILI9341
ソフトウェア
Spresense SDKで確認しました。
確認手順
つぎの手順で確認します。
環境構築
Spresense SDK 開発ツールのセットアップ
事前にSpresense SDKでの開発 -> Spresense SDK スタートガイド (CLI 版) -> 2. 開発ツールのセットアップを実施し、開発環境を構築しておきます。
ユーザアプリの追加
Spresense SDKでの開発 -> Spresense SDK スタートガイド (CLI 版) -> 6. ユーザーアプリの追加方法 -> 6.3. ツールを使用するを参照し、ユーザアプリを追加します。
今回はつぎのコマンドでユーザアプリを追加しました。
tools/mkappsdir.py sl “sl command”
tools/mkcmd.py -d sl sl “sl command”
コンフィグレーション
spresense/sdkディレクトリで次のコマンドを実行します。
tools/config.py examples/pdcurses
Macの場合、次のディレクトリでした。
/Users/ユーザ名/spresense/sdk
ソースコード準備
slコマンドのソースコードはオリジナルのslコマンドを流用させてもらいます。
オリジナルのslコマンド GitHubリポジトリ
sl.c, sl.hをslディレクトリにコピーします。
Makefileの変更
sl/MakefileのMAINSRCをsl.cに変更します。
include $(APPDIR)/Make.defs
include $(SDKDIR)/Make.defs
PROGNAME = $(CONFIG_SL_SL_PROGNAME)
PRIORITY = $(CONFIG_SL_SL_PRIORITY)
STACKSIZE = $(CONFIG_SL_SL_STACKSIZE)
MODULE = $(CONFIG_SL_SL)
ASRCS =
CSRCS =
MAINSRC = sl.c
include $(APPDIR)/Application.mk
コード変更
sl.cのヘッダーファイルインクルードをつぎのように変更します。
-#include <curses.h>
+#include "graphics/curses.h"
#include <signal.h>
#include <unistd.h>
#include "sl.h"
コード修正が終了したらmake、コードをflashします。
NuttXのプロンプト(nsh)からslとタイプすると冒頭の動画のようにslコマンドが実行できます。
なぜ簡単にslコマンドができたのか考察
オリジナルのslコマンドから1行の変更でSpresenseでslコマンドが実行できました。
なぜこんなに簡単にslコマンドができたのか考察します。
Spresenseでcursesが使えるため
オリジナルのslコマンドはcursesを使っています。
cursesのWindows向け実装PDCursesがNuttX(※)にポーティングされており、今回はPDCursesを使いました(コンフィグレーションでexamples/pdcursesを指定したところ)。
※Spresense SDKはNuttXのうえで動作しています。
今回はslコマンドでしたがcursesを使っているOSSであればSpresenseで割と簡単に移植ができるかもしれません。