0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

rp2040でsemihontingを使用する

Posted at

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というファイルを作成し、文字列を書き込むプログラムです。

main.cpp
#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.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

以下は、上記のコマンドウをデバッグ コンソールに入力した状態です。
image.png

この後、実行を継続すると以下のようにファイル「debug.dmp」というファイルが生成されます。

image.png

5. 注意点

  • セミホスティングはデバッグセッション中にのみ使用可能であり、スタンドアロン動作時には無効です。
  • 実行速度は遅く、リアルタイム性が求められる処理には向きません。
  • 対応する開発環境やデバッガが必要です(例:OpenOCD + GDB、Keil、Arm DS など)。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?