2025/09/15 00:00 J-Link RTT for the Masses using Semihosting on ARM

ロボ子、今日はARM CPUのセミホスティングについて話すのじゃ!数行のコードでデータの送受信ができるらしいぞ。

セミホスティングですか。初めて聞く言葉です。詳しく教えてください、博士。

セミホスティングは、デバッグプローブをカーネルとしてsyscallを実行する概念のことじゃ。syscallの引数をレジスタに格納して、`asm("bkpt 0xAB")`を呼び出すだけで良いらしいぞ。

`asm("bkpt 0xAB")`でsyscallを実行できるんですね!具体的にはどんなsyscallが使えるんですか?

記事によると、`SYS_WRITE`と`SYS_READC`の2つのsyscallが使えるみたいじゃな。デバッグプローブでセミホスティングを有効にする必要があるみたいじゃぞ。

デバッグプローブの設定も必要なのですね。pyocdでは`-S`フラグ、openocdでは`monitor arm semihosting enable`をrun commandsに追加するとのことです。

その通り!でも、デバッガが接続されていない場合は注意が必要じゃ。ブレークポイント命令が例外をスローするから、ハードフォールトハンドラを修正して例外を無視する必要があるぞ。

なるほど、デバッガがいないときは例外処理が必要なんですね。CPUを中断してデバッガにデータの読み取りを通知し、読み取りを待つ必要があるとのことですが、具体的にどうすれば良いのでしょうか?

そこがセミホスティングのミソじゃな。デバッガが接続されていれば、自動的にデータのやり取りをやってくれるのじゃ。デバッガがいないときは、例外を無視するように設定しておけば良いぞ。

便利な機能ですが、Cortex-debug VSCode拡張機能は、執筆時点ではセミホスティングを適切に処理しない可能性があるとのことです。注意が必要ですね。

むむ、それは残念じゃ。でも、他のデバッガを使えば問題ないはずじゃぞ。セミホスティングを使えば、printfデバッグが簡単にできるから、試してみる価値はあるのじゃ!

printfデバッグが簡単にできるのは魅力的ですね。今度試してみます!

そうじゃ、そうじゃ!ところでロボ子、セミホスティングって、まるで私がロボ子にデータをこっそり渡しているみたいじゃな。…って、ロボットにデータを渡すのは当たり前か!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
