組込みOS自作入門【Windows11, WSL2】(再開方法・自分なりの進め方解説 編)

書籍『12ステップで作る 組込みOS自作入門』を読み進めています。

一度環境構築をした後、PCの再起動によりUSBシリアルのアタッチがなくなった場合や、暫くやらずに久しぶりに再開する場合を想定してやり方をまとめます。

以下、過去の記事です。

  1. 環境構築(1/2 - USBシリアル編):
  2. 環境構築(2/2 - ツールインストール、Hello World! 編):
  3. 2ndステップ以降(詰まる可能性のある点など):



目次


USBシリアル設定(PCを再起動したとき)

USBシリアルをWSLから認識させる

一度Windowsをシャットダウンor再起動するとWSLからUSBシリアルを認識できない状態になると思うので、再びアタッチします。
参照:過去の記事1 「2-1. USBシリアルをWSLにアタッチする」

USBシリアルをWindows機に接続します。

PowerShellを立ち上げて接続されているデバイスを確認します。
初回ではないので、USBシリアルはこの時点で共有状態になっています。

PS > usbipd list
Connected:
BUSID  VID:PID    DEVICE                                              STATE
1-3    0d8c:0014  USB Audio Device, USB 入力デバイス                  Not shared
1-4    8087:0029  インテル(R) ワイヤレス Bluetooth(R)                 Not shared
2-2    056e:5004  Elecom USB-Serial Converter (COM3)                  Shared
2-3    0411:0338  USB 大容量記憶装置                                  Not shared
2-4    0250:3412  USB 入力デバイス                                    Not shared

Persisted:
GUID                                  DEVICE
6724xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  Elecom USB-Serial Converter (COM4)


WSLにアタッチします。
1度目でエラーになったら同じコマンド2度連続で実行するとアタッチできるケースが多いです。

PS > usbipd attach --wsl --busid 2-2
usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Using IP address 172.31.176.1 to reach the host.
PS > usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
(略)
2-2    056e:5004  Elecom USB-Serial Converter (COM3)                            Attached
(略)

WSL側から確認します。

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 056e:5004 Elecom Co., Ltd UC-SGT
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Elecom製のUSBシリアルケーブル UC-SGT が表示されました。

実行ファイルの作成・書込み・実行

ソースコードをダウンロードしてある前提で進めます。

参照:過去の記事2 項目4-6

1st ~ 12th ステップ共通(bootloadのコンパイルから起動・実行)

WSLのターミナルで実行したいStepのbootloadディレクトリをカレントディレクトリとします。

$ cd ~/12step_emb_os/osbook_03/01/bootload

(もしも以前に.motファイルまで作成したことがある場合は make image の実行まで省略できます。むしろ「make: 'all' に対して行うべき事はありません.」のような警告が表示されます。)

Makefile内のデバイスファイル(/dev/tty*)を変更します。
私の環境では /dev/ttyUSB0 のため、以下のようにして変更箇所(cuad0)を置換します。

$ sed -i 's/cuad0/ttyUSB0/g' Makefile

実行形式ファイル(ファームウェア)を作成し、それをモトローラSレコード・フォーマットに変換します。

$ make
$ make image

(この後にファイルに変更を加えた場合は以下のコマンドでクリーンをしてから上記のmake, make imageをやり直します。)

$ make clean

H8マイコンのディップスイッチを ON, ON, OFF, ON に合わせて電源を入れ直したら、フラッシュROMに kzload.mot を書き込みます。

$ sudo make write

続いて、マイコンのディップスイッチを ON, OFF, ON, OFF に合わせて電源を入れ直し、cuコマンドでシリアル接続します。
「Connected.」と表示されたら、リセットボタンを押す度に「Hello World!」が出力されます。
接続を終了するには「~」「.」を入力します。

$ cu -s 9600 -l /dev/ttyUSB0
Connected.
Hello World!
Hello World!
Hello World!
~[(PC名)].
Disconnected.
4th・5th ステップ(ファイル転送・ダンプ)

マイコン起動後にloadコマンドでファイル転送します。

$ sudo cu -s 9600 -l /dev/ttyUSB0
kzload> load
~+sx (ファイル名)
kzload> dump
kzload> ~.
6th ステップ以降

6th ステップからosディレクトリが追加されます。
bootloadディレクトリでmake write(プログラムのダウンロード)まで実行してから、
osディレクトリに遷移してmake(kozosを作成)した後、cuで接続してマイコンを起動します。



〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
中途半端ですが、一旦記事を公開します。気が向いたらまた更新します。
9th ステップ以降はbootloadの更新がなくなるので少し手数が減ります。