🤭

なんとSpresenseでviが使える件(驚)

2022/02/08に公開

これは何?

Spresenseでviが使えたので紹介です。
※私、viを普段使いしていないので簡単なコマンドの確認になります。

viのコンフィギュレーションがあった!!!

先日会期が終了した技術書典12で【Spresenseデジタルカメラ開発】という本を書きました。

本の内容としてはSpresenseを使ってデジタルカメラのアプリケーションを作る、というものです。

https://techbookfest.org/product/6145133823131648?productVariantID=6677722182975488

コンフィギュレーションはどんなものがあるのだろうと思い、コンフィギュレーション一覧を表示する次のコマンドを実行してみました。

$ 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を使ってみるのは如何でしょうか?

最後まで読んでいただきありがとうございました。

脚注
  1. SpresenseはNuttXというOS上で動作します。 ↩︎

Discussion