はじめに
Arm 社のデバッガーにはセミホスティングと呼ばれる便利な機能が搭載されています。SoC FPGA のソフトウェア開発環境も Arm 社の Arm® Development Studio 5 Intel® SoC FPGA Edition(以後 DS-5)デバッガーが標準採用されているため、この機能を活用することができます。
この記事では、セミホスティング機能の概要ならびに便利な使い方について紹介します。
セミホスティングの概要
ソフトウェアのデバッグやログの出力において、printf() はよく使われます。通常、printf() 文は UART 経由で出力することが多いですが、この場合は UART の設定をするまでは printf() が使用できません。
セミホスティングとは、DS-5 にて Arm 上のアプリケーション・コードから発行される入出力要求を、DS-5 が実行されているホスト・コンピューターに JTAG 経由で伝達するメカニズムです。これにより、デバッグ時に UART の設定をしていない状態でも printf() を使用することができます。
詳細につきましては、下記の Arm 社の web をご確認ください。
参考: セミホスティングとは | Arm® Developer
参考: Semihosting: a life-saver during SoC and board bring-up | Arm® Community
セミホスティングを使用するケース
セミホスティングを使用するケースとして、以下 2 つが考えられます。
ケース 1 : UART 未設定時のデバッグ
UART 初期化前・もしくはそもそも UART が無く使用できない場合、セミホスティングの機能を使用することでログを JTAG 経由で確認することができます。
この場合、BSP-Generator(bsp-editor)にて設定する必要があります(以下の図参照)。
BSP Generator(bsp-editor)についての詳細は、Intel® SoC FPGA Embedded Development Suite (SoC EDS) User Guide をご参照ください。
注記:
最終的にスタンドアローン・ブート時にはセミホスティングを OFF にしてコンパイルしたバイナリが必要になります。
尚、Arria® 10 SoC がターゲットの場合は、bsp-editor に該当のオプションが存在しません。そのため、U-Boot のソースツリー以下で CONFIG_SEMIHOSTING を有効化することで対応します。
具体的には、下記のファイルに定義される CONFIG_SEMIHOSTING を #undef から #define に変更することで有効化します(セミホスティングを OFF とする場合は #undef に戻します)。
uboot-socfpga/include/configs/socfpga_arria10.h:39:#undef CONFIG_SEMIHOSTING
※ こちらのケースは、ボード立ち上げ時のデバッグにも役立ちます。正常にブート完了せず、UART ターミナルにも何もログが表示されない場合にお試しください。セミホスティングを有効化したブートローダーをデバッガー経由で実行することで、もう少し詳細な情報が得られる可能性があります。
デバッガー経由でブートローダーを実行する方法については以下のコンテンツを参照ください。
参考: 簡易デバックに最適!DS-5 で U-Boot を起動する方法
参考: Arria® 10 SoC 向け DS-5 で U-Boot を起動する方法
ケース 2 : PC の USB ポートを節約したいケース
ベアメタルアプリケーション開発時、USB ダウンロード・ケーブルを使用しているかと思います。さらに UART を接続するとなると 2 つの USB ポートを使用することになるため、場合によっては USB ポートが不足するケースがあるかと思います。
このような場合、セミホスティングであれば JTAG なので UART 用のケーブルを用意する必要がないため USB ケーブルは 1 本でログ確認までできます。
USB ポートやケーブルの都合以外にも、単純に検証環境の準備(ターゲットボードとのケーブル接続)の手間を省きたいという場合にも便利です。
DS-5 におけるセミホスティング/UART にて printf 文出力するサンプル
SoC FPGA エンベデッド開発スイート(SoC EDS)に付属するソフトウェア・サンプルは、いずれもセミホスティングを使用する設定が適用されていますので、付属のサンプルにてセミホスティングを試してみることが可能です。
付属サンプルとは別に、以下のリンクにてセミホスティングと UART の両方に対応したサンプルを用意しています。
参考: SoC FPGA ベアメタル All-in-One アプリケーション・サンプル
このサンプルでは、printf() 文の出力先を UART/ セミホスティングから選択することができるようになっていますので、UART 出力、セミホスティングの違いを理解したい場合にご活用ください。
UART/ セミホスティングの切り替えは、プロジェクト直下に格納されている comfig.mk を編集することで切り替え可能となっております。
※ 以下の PRINTF_UART の設定値( 0 or 1 )で切り替えます。
##############################################
# Select printf target (0:Semihost / 1:UART) #
##############################################
PRINTF_UART := 1