なんとSpresenseでviが使える件(驚)
これは何?
Spresenseでviが使えたので紹介です。
※私、viを普段使いしていないので簡単なコマンドの確認になります。
viのコンフィギュレーションがあった!!!
先日会期が終了した技術書典12で【Spresenseデジタルカメラ開発】という本を書きました。
本の内容としてはSpresenseを使ってデジタルカメラのアプリケーションを作る、というものです。
コンフィギュレーションはどんなものがあるのだろうと思い、コンフィギュレーション一覧を表示する次のコマンドを実行してみました。
$ tools/config.py --list
Available configurations:
default
feature/asmp
feature/audio_player
feature/audio_recognizer
feature/audio_recorder
feature/audio_synthesizer
feature/awsiot
feature/bas
feature/bluetooth
feature/cmsis
feature/crashdump
feature/debug
feature/digital_filters
feature/dnnrt
feature/dnnrt_mp
feature/ethernet
feature/externals_mbedtls
feature/fb
feature/fwuputils
feature/gnss
feature/gpiotool
feature/i2ctool
feature/imageproc
feature/libcxx
feature/libjpeg
feature/loadable
feature/lte
feature/lte_stub_mbedtls
feature/minibasic
feature/mqtt
feature/nx
feature/pmictool
feature/ramlog
feature/ramlog_circular
feature/rndis
feature/setlogmask
feature/smp
feature/spitool
feature/stackmonitor
feature/startup_script
feature/step_counter
feature/subcore
feature/sysutil
feature/tasktrace
feature/tensorflow
feature/unixsocket
feature/usbcdcacm
feature/usbmsc
feature/usbnsh
feature/vi
feature/vtun
feature/wifi
feature/wifi_telnetd
feature/xmodem
feature/zmodem
device/accelerometer
device/adc
device/bcm20706
device/camera
device/charger
device/colorsensor
device/emmc
device/hostif
device/lcd
device/lightsensor
device/magnetometer
device/pressure
device/proximity
device/pwm
device/sdcard
device/sdcard_spi
examples/accel
examples/adc_monitor
examples/alarm
examples/asmp
examples/audio_beep
examples/audio_dual_players
examples/audio_oscillator
examples/audio_pcm_capture
examples/audio_pcm_capture_objif
examples/audio_player
examples/audio_player_objif
examples/audio_recognizer
examples/audio_recorder
examples/audio_recorder_objif
examples/audio_sound_effector
examples/audio_through
examples/ble_central
examples/ble_peripheral
examples/bt_spp
examples/camera
examples/charger
examples/colorsensor
examples/configdata
examples/decimator
examples/digital_filter
examples/dnnrt_lenet
examples/embedlog
examples/fb
examples/fft
examples/ftp
examples/fwupdate
examples/geofence
examples/gnss
examples/gnss_atcmd
examples/gnss_factory
examples/gnss_pvtlog
examples/gyro
examples/hello
examples/helloxx
examples/hostif_i2c
examples/hostif_spi
examples/ini_dumper
examples/jpeg_decode
examples/json
examples/light
examples/lowpower
examples/lte_awsiot
examples/lte_azureiot
examples/lte_http_get
examples/lte_lwm2m
examples/lte_mqtt
examples/lte_tls
examples/lte_websocket
examples/lvgldemo
examples/mag
examples/mm
examples/mpcomm_prime
examples/multiwebcam
examples/multiwebcam_eth
examples/nx
examples/nxdemo
examples/nxhello
examples/nximage
examples/nxlines
examples/nxterm
examples/nxtext
examples/pdcurses
examples/pipe
examples/power_sleep
examples/press
examples/prime
examples/proximity
examples/pwm
examples/setjmp
examples/sixaxis
examples/smp_asmp
examples/step_counter
examples/tcpblaster
examples/tcpecho
examples/tf_example_helloworld
examples/tf_example_micro_speech
examples/tf_example_persondetect
examples/tflmrt_lenet
examples/tilt
examples/udgram
examples/udp
examples/watchdog
examples/webserver
examples/wget
examples/wifi_awsiot_gnsslogger
うーん、いろいろな機能があるなぁ・・・と思って眺めていると気になる文言を見つけました。
feature/vi
vi???
まさかあのviなのだろうか?、と思いコンフィギュレーションの説明を表示してくれるコマンドを実行してみたところ次の出力となりました。
$ ./tools/config.py -i feature/vi
=== feature/vi ===
[Description]
This configuration contains required options to use "vi" editor.
[Differences]
+SYSTEM_VI=y
はじめviと見たときには信じられなかったですがやはりviエディタのコンフィギュレーションのようです。
ビルド
コンフィギュレーション
これは是非試してみたい、ということで【feature/vi】コンフィギュレーションを有効にしてmakeしてみます。
$ tools/config.py examples/camera feature/usbmsc feature/vi
make
makeします。
makeが成功すると書込みファイル【nuttx.spk】が作成されます。
make
書込み
USB-シリアル変換ICのファイル名確認
今回はSpresense拡張ボードにメインボードを接続した環境で確認します。
拡張ボードにはマイクロSDカードを挿入しておきます。
SpresenseメインボードとUSBケーブルとPCを接続します。
USB-シリアル変換ICのファイル名を次のコマンドで確認します。
$ ls /dev/cu.usb*
/dev/cu.usbserial-14140
書込み
書込みコマンドを実行しSpresenseのFlashROMに書込みます。
$ tools/flash.sh -c /dev/cu.usbserial-14140 nuttx.spk
>>> Install files ...
install -b 115200
Install nuttx.spk
|0%-----------------------------50%------------------------------100%|
######################################################################
237888 bytes loaded.
Package validation is OK.
Saving package to "nuttx"
updater# sync
updater# Restarting the board ...
reboot
事前動作確認
viを使う前の状態を確認しておきます。
シェルに接続
書込みが完了したらシリアルターミナル(今回はminicom)でNuttXのシェル(nsh)に接続します。
$ minicom -D /dev/cu.usbserial-14140 -b 115200
シェルに接続できると次のメッセージが表示されます。
Welcome to minicom 2.8
OPTIONS:
Compiled on Jan 4 2021, 00:04:46.
Port /dev/cu.usbserial-14140, 23:11:08
Press Meta-Z for help on special keys
NuttShell (NSH) NuttX-10.1.0
nsh>
helpでコンフィギュレーションしたコマンドの確認
シェルで【help】を入力します。
使えるコマンドが表示されます。
コンフィギュレーションで指定したviがコマンドとして登録されています。
【Builtin Apps:】にviの表示があります。
nsh> help
help usage: help [-v] [<cmd>]
. cmp false ls nslookup sleep usleep
[ dirname free mkdir poweroff source xd
? date help mkfatfs ps test
basename dd hexdump mkfifo pwd time
break df ifconfig mkrd reboot true
cat echo ifdown mksmartfs rm uname
cd exec ifup mount rmdir umount
cp exit kill mv set unset
Builtin Apps:
camera msdis nsh vi
msconn myfirstcameraapp sh
マイクロSDカードのパスを確認
ディスクの空き容量を表示するコマンドを実行します。
マイクロSDカードのパスは【/mnt/sd0】です。
マイクロSDカードにviでファイルをつくってみます。
nsh> df -h
Filesystem Size Used Available Mounted on
vfat 7493M 2944K 7490M /mnt/sd0
smartfs 4M 28K 4068K /mnt/spif
procfs 0B 0B 0B /proc
マイクロSDカードの内容を確認します。
nsh> ls /mnt/sd0
/mnt/sd0:
System Volume Information/
VIDEO001.JPG
VIDEO002.JPG
VIDEO003.JPG
PICT000.JPG
PICT001.JPG
PICT002.JPG
.fseventsd/
.Spotlight-V100/
._PICT000.JPG
._VIDEO001.JPG
trace.log
test.txt
._PICT001.JPG
._PICT002.JPG
._trace.log
vi動作確認
vi起動
viを起動します。
nsh> vi /mnt/sd0/vi_test.txt
次はコマンド実行後の画面です。
vi起動後の画面
インサートモードに遷移
【i】キーを押下しインサートモードに遷移します。
--INSERT--と表示されています。
インサートモード
文字を入力します。
文字を入力
インサートモード⇛ノーマルモードに遷移
【esc】キーを押下しノーマルモードに遷移します。
インサートモードからノーマルモードに遷移
移動系コマンド
行頭
行頭へ移動するコマンド【0】キーを押下します。
カーソルが行頭へ移動しました。
行頭へ移動
行末
行末へ移動するコマンド【$】キーを押下します。
カーソルが行末へ移動しました。
行末へ移動
上下左右
k(上)・j(下)・h(左)・l(右)にも移動できました。
編集系コマンド
コピー
行のコピーをしてみます。
【yy】を押下し、1行コピーします。
貼り付け
コピーした行を【p】キー押下し貼り付けます。
【p】キー押下で貼り付け
ファイル保存
【:wq】キーを押下し編集したファイルを保存します。
【:wq】キー押下でファイル保存
【:wq】キー押下するとファイル保存した旨のメッセージが表示されました。
【:wq】実行後の画面
ファイル内容確認
ファイルが作成されたか確認します。
nsh> ls /mnt/sd0
/mnt/sd0:
System Volume Information/
VIDEO001.JPG
VIDEO002.JPG
VIDEO003.JPG
PICT000.JPG
PICT001.JPG
PICT002.JPG
.fseventsd/
.Spotlight-V100/
._PICT000.JPG
._VIDEO001.JPG
trace.log
test.txt
._PICT001.JPG
._PICT002.JPG
._trace.log
vi_test.txt
ファイル【vi_test.txt】が作成されています。
ファイル内容を確認してみます。
nsh> cat /mnt/sd0/vi_test.txt
vi test file!!!
vi test file!!!
viで編集した内容が確認できました。
最後に
非常に簡単・少ないですがviの基本コマンドが確認できました。
Linuxと比べると小型・軽量の組込みRTOS Nuttx[1]でまさかviが使えるとは思っていなかったのでviのコンフィグレーションを見つけて、実際に使えたときはテンションあがりました。
私はvi使いではないですが、馴染みのあるエディタが組込みRTOSのシェルでも使えるのはなにげに嬉しいのではないかと思いました。
ご興味ある方はSpresenseでviを使ってみるのは如何でしょうか?
最後まで読んでいただきありがとうございました。
-
SpresenseはNuttXというOS上で動作します。 ↩︎
Discussion