# 手元のボードで全章をまとめて確認する サンプルコードには、**全章をビルドして実機に書き込み、シリアル出力が 書籍の記載どおりかを自動で突き合わせる**スクリプトが同梱されています。 「自分のボードでも本と同じ結果になるか」を一括で確かめられます。 Linux / macOS / Windows のいずれでも同じコマンドで動きます。 ## 使い方 ```bash # 章ごとのサポートの手順どおりなら、すでに docs/os-on-arduino/code にいます uv sync # 初回のみ uv run python scripts/verify_chapters.py --list # 章と期待値の一覧 uv run python scripts/verify_chapters.py --build-only # ボード無しでビルドだけ uv run python scripts/verify_chapters.py # 実機で全章 ``` シリアルポートは Arduino の VID から自動で探します。ほかの USB シリアル機器が ある場合は `--port` で指定してください(`COM3` / `/dev/ttyACM0` / `/dev/cu.usbmodem...`)。 出力の例です。 ```text OS: Darwin 25.5.0 Python: 3.14.2 ボード: /dev/cu.usbmodemXXXXXXXXXXXXX === 01_boot ===================================================== -> PASS (13.4s) OK === Boot Sequence Check === OK BSS がゼロクリアされている OK DATA が Flash からコピーされている OK ベクタテーブルが RAM 上にある OK If you see this, boot sequence completed! ``` 確かめているのは出力の文字列そのものではなく、**書籍が主張している性質**です。 たとえば第1章なら「BSS がゼロクリアされている」「DATA が Flash からコピーされて いる」を値で確認します(BSS は初期値のないグローバル変数の領域、 DATA は初期値つきのグローバル変数の領域です。どちらも第1章で説明します)。 アドレスや時刻のように環境で変わる値は正規表現で幅を持たせてあります。 正規表現では書けない検査も 3 つ入っています。 | 検査 | 何を確かめるか | 書籍の該当箇所 | |---|---|---| | `cpu_sum` | `ps`(第5章で作るシェルのコマンド)の CPU% の合計が 100% を超えない | 第4章 4.7「合計がほぼ 100% になっているのが目印」 | | `preemption` | 重い計算が回っていても 1 秒周期タスクの間隔が崩れない | 第4章の主張そのもの | | `philosophers` | 5 人の哲学者が全員食事を進める(食事する哲学者は応用編1で扱う問題) | 応用編1 のデッドロック回避 | ## LED を見ながら 1 章ずつ進める `-i` を付けると対話モードになります。1 章ずつ書き込んで、**実機の LED を 見ながら Enter で次へ進めます**。LED やマトリクスの動きは自動検査では 見られないので、目視の確認はこちらを使ってください。 ```bash uv run python scripts/verify_chapters.py -i ``` | 入力 | 動き | |---|---| | Enter だけ | 次の章へ | | 文字を打つ | そのままボードに送る(`ps`、`kill 1` など。第5章で作るシェルのコマンド) | | `!` | その章の「試せること」を上から順に自動で送る | | `r` / `b` / `q` | 焼き直し / 前の章へ / 終了 | 章ごとに「目で見るポイント」が出ます。 ```text ======================================================================== [7/20] 07_led_matrix 本編 第7章 LEDマトリクス可視化 ======================================================================== 目で見るポイント: ・マトリクス上半分に CPU 負荷グラフ(左が古い、右が新しい) ・マトリクス下半分にタスクごとの実行状況 ・kill 3 で Heavy を止めると、負荷グラフが目に見えて下がる 試せること: ps / kill 3 / ps / exec 3 ``` ## シェルに変な入力を投げてみる `scripts/fuzz_shell.py` は、シェル(第5章で作る、シリアルからコマンドを打つ仕組み)や REPL(入力を読んで実行し、結果を表示するのを繰り返す対話環境。第11章の TinyPython など)に行儀の悪い入力(長すぎる行、 存在しないタスク ID、制御文字、閉じていない括弧など)を投げて、**OS が 生き残るか**を確かめます。1 つ送るたびに生存確認をするので、どの入力で 固まったかが分かります。 ```bash uv run python scripts/fuzz_shell.py ``` ## 動作確認済みの環境 | | | |---|---| | macOS(Apple Silicon) | 全 20 プロジェクト PASS | | Windows 11(ARM64) | 全 20 プロジェクト PASS | | Ubuntu | ビルド検証を CI で実施 | 第1章の出力と第13章の `iktest`(四脚ロボットの脚の角度の計算を往復で確かめるコマンド)の出力は、 macOS と Windows で 1 バイトも違いませんでした。