# 第5章: 対話型シェル シリアル越しに OS と会話するための小さなシェルを作ります。 ## サンプルコード - ディレクトリ: `docs/os-on-arduino/code/05_shell` - ビルドと書き込み: ```bash uv run pio run -d 05_shell -t upload uv run pio device monitor -b 115200 ``` コードを見る: [docs/os-on-arduino/code/05_shell](https://github.com/iory/learning-os-from-arduino/tree/main/docs/os-on-arduino/code/05_shell) ## ソースコード この章のスケッチです。ファイル名をクリックすると開きます。コードは原稿リポジトリから自動で同期されているので、ここに出ているものが常に最新です。 :::{dropdown} `src/main.cpp` — 96 行 :icon: code [GitHub で開く](https://github.com/iory/learning-os-from-arduino/blob/main/docs/os-on-arduino/code/05_shell/src/main.cpp) ```{literalinclude} ../../../../code/05_shell/src/main.cpp :language: cpp :linenos: ``` ::: :::{dropdown} `include/os_kernel.h` — 79 行 :icon: code [GitHub で開く](https://github.com/iory/learning-os-from-arduino/blob/main/docs/os-on-arduino/code/05_shell/include/os_kernel.h) ```{literalinclude} ../../../../code/05_shell/include/os_kernel.h :language: cpp :linenos: ``` ::: :::{dropdown} `include/shell.h` — 23 行 :icon: code [GitHub で開く](https://github.com/iory/learning-os-from-arduino/blob/main/docs/os-on-arduino/code/05_shell/include/shell.h) ```{literalinclude} ../../../../code/05_shell/include/shell.h :language: cpp :linenos: ``` ::: :::{dropdown} `src/os_kernel.cpp` — 281 行 :icon: code [GitHub で開く](https://github.com/iory/learning-os-from-arduino/blob/main/docs/os-on-arduino/code/05_shell/src/os_kernel.cpp) ```{literalinclude} ../../../../code/05_shell/src/os_kernel.cpp :language: cpp :linenos: ``` ::: :::{dropdown} `src/shell.cpp` — 186 行 :icon: code [GitHub で開く](https://github.com/iory/learning-os-from-arduino/blob/main/docs/os-on-arduino/code/05_shell/src/shell.cpp) ```{literalinclude} ../../../../code/05_shell/src/shell.cpp :language: cpp :linenos: ``` ::: ## 実機での出力 Arduino UNO R4 WiFi の実機で実際に取得した出力です(macOS / Windows の 両方で同じ結果を確認しています)。手元の出力と見比べてください。 `help` と `ps` を送ったところです。CPU% の合計がほぼ 100% になるのが、計測が正しく動いている目印です。 ```text help Available commands: ps - List all tasks kill N - Suspend task N exec N - Resume task N info - System information reboot - Reboot system help - Show this help > ps ID NAME STATE CPU% -- ---- ----- ---- 0 idle READY 99% 1 LED1 BLOCKED 0% 2 LED2 BLOCKED 0% 3 Heartbeat BLOCKED 0% 4 Shell RUNNING 0% > ``` 実機ではこう光ります。 ```{raw} html
kill 1 で LED1 タスクを止めると L LED の点滅が止まり(止めたときの状態のまま)、exec 1 で戻ります。マトリクス左半分(LED2)はその間も 0.5 秒ごとに点滅を続けます。(UNO R4 WiFi を Web カメラで 30 fps で撮影)
``` ### シミュレータで見る 実機が無くても、同じファームウェアを {doc}`シミュレータ <../getting-started/simulator>` で動かすとこう見えます。 ```{figure} ../_static/sim_ch05_kill.gif :name: fig-ch05-sim :width: 80% L(LED1)とマトリクス左半分(LED2)が点滅する中で、シェルから `kill 1` を送ると L だけが止まり、`exec 1` でまた点滅し始めます。左半分は止まりません。(シミュレータで撮影) ``` ## つまずきやすいポイント (読者からの質問に応じて随時追記します。質問は [GitHub Issues](https://github.com/iory/build-your-own-arduino-rtos/issues) へどうぞ)