1. ARMのSemihostingとは
Semihosting(セミホスティング) とは、組み込み開発において、ターゲットマイコン(たとえばCortex-Mシリーズ)からホストPCに対して標準入出力(printf など)やファイル操作、システム情報の取得などを依頼する仕組みです。これは、ターゲット側のリソースが限られていて、フル機能のファイルシステムやコンソールI/Oが用意できない環境で非常に有用です。
Semihostingは、デバッガと連携して動作し、例えばGDB + OpenOCD、またはKeil MDKやArm DSなどの開発環境を用いることで、ホストPCのコンソールにprintfの出力を表示したり、ファイルの読み書きを行ったりすることが可能です。
この記事ではrp2040でSemihostingを使用する方法について説明します。
2. Semihostingの特徴と用途
- 標準出力(printf)の表示
組み込みターゲットにUARTなどを用意しなくても、printfでのデバッグが可能になります。 - ホストPC上のファイルにアクセス
ファイルの読み書きをターゲット側から要求でき、ログ出力や設定ファイルの読み込みに使えます。 - 簡易なホスト連携機能
time()やclock()など、標準Cライブラリの一部関数をホスト経由で動かすこともできます。
Semihostingには以上の機能がありますが、他の方法で代替が難しい「ホストPC上のファイルにアクセス」の使用例を選びました。
3. Semihostingの使用例
Earle Philhower版 Arduinoコアでは、ホストPC上のファイルにアクセスがSemiFSというクラスで提供されています。以下はSemiFSを使って、ホスト上のファイルシステムにdebug.dmpというファイルを作成し、文字列を書き込むプログラムです。
#include <Arduino.h>
#include <stdlib.h>
#include <SemiFS.h>
Stream *console;
void
setup()
{
console = &Serial;
Serial1.begin(115200);
console->printf("build [%s %s]\n", __DATE__, __TIME__);
SemiFS.begin();
}
void
loop()
{
static bool isFirst = true;
if (isFirst) {
isFirst = false;
console->printf("First time\n");
File f = SemiFS.open("debug.dmp", "w");
static const char buffer[] = "abcde\n";
f.write(buffer, strlen(buffer));
f.close();
}
console->printf("File I/O sample\n");
delay(1000);
}
platformio.iniの内容は、以下の通りです。
[platformio]
default_envs = pico
[env:pico]
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
platform_packages = framework-arduinopico@https://github.com/earlephilhower/arduino-pico.git
board = pico
board_build.core = earlephilhower
framework = arduino
debug_build_flags = -D USE_DEBUGGER -g3
upload_protocol = cmsis-dap
debug_tool = cmsis-dap
debug_init_break = tbreak setup
4. 実行
Semihostingの機能を使用するには、デバッガが必須ですので、デバッグを開始します。
デバッグを開始するとsetup関数の先頭で停止します。ここでSemihostingを有効にするため、以下のコマンドをデバッグ コンソールに入力します。
monitor arm semihosting enable
以下は、上記のコマンドウをデバッグ コンソールに入力した状態です。
この後、実行を継続すると以下のようにファイル「debug.dmp」というファイルが生成されます。
5. 注意点
- セミホスティングはデバッグセッション中にのみ使用可能であり、スタンドアロン動作時には無効です。
- 実行速度は遅く、リアルタイム性が求められる処理には向きません。
- 対応する開発環境やデバッガが必要です(例:OpenOCD + GDB、Keil、Arm DS など)。