組み込みLinuxのデバッグをやってみよう!

  • (*1)低解像度で再生した場合、動画内の文字が見えづらくなることがあります。
  • (*2)今回は、アプリのデバッグを行うために、JTAGコネクタを搭載したボードを使用する必要がありましたので、Cyclone V SoC Develoment Boardを使用しております。ボードのRivisionによっては、ジャンパ設定の変更や半田付けの作業が必要なものもあります。

デバッガとは

CPUが持つデバッグ機能を使って高度なデバッグをしたり、ターゲット上でデバッガを動かすリソースがないシステムでデバッグを行うためのツールです。

組み込みシステムの開発で一般的なクロス コンパイル環境では、コンパイル~実行~コード修正~コンパイルのTATを短くすることが効率化の第一歩です。PRINT文デバッグとデバッガを使ったデバッグではこの差が顕著に現れるのでデバッガの使い方はぜひ覚えてください。

Lauterbach TRACE32とは

組み込みシステムの開発で世界で最も使われているデバッガです。Lauterbach社について詳しく知りたい人は、Wikiを見てね!(デバッガ専業ベンダーでWikipediaがあるって凄いよね)

組み込みLinuxの開発で大きなメリットになるポイントは3つあります。

  • ●統合開発環境ではなく、デバッガである!
    • ・コンパイルはGNU toolchainで行うことが多いので、統合開発環境ではなくデバッガであることが使い勝手や調達コストの点でメリットです。
    • ・さらに、GCCのバージョンやLinuxディストリビューションにも依存しないため、すぐに使うことができます。
  • ●Linux PCでデバッガが動作する!
    • ・Linux PCでコンパイルするので、PC 1台でコンパイルからデバッグまで出来、デバッグに必要なソースやオブジェクトのコピーが不要な点がメリットです。
  • ●SoCの周辺レジスタが簡単に確認できる!
    • ・Cyclone V SoCの周辺レジスタがGUIで簡単に確認できて、SoCのリファレンス マニュアルと関数電卓を駆使しながらビットを読む必要がないため、デバッグの時間を大きく短縮できます。

開発環境のセットアップ

カーネルのビルド

TRACE32はターゲットのコードへデバッグのためのパッチが不要でオブジェクトのデバッグ シンボルとカーネルからデバッグに必要な情報を取得します。

そのため、まずはカーネルをビルドします。※カーネルのビルドについては、次回詳しく説明します。

							カーネル ソースのダウンロード
							$ git clone https://github.com/altera-opensource/linux-socfpga.git

							Yoctoの環境変数の設定
							$ . /opt/poky/2.1.1/environment-setup-cortexa8hf-neon-poky-linux-gnueabi

							ビルド
							$ cd linux-socfpga
							$ make socfpga_defconfig
							$ make zImage dtbs

							ビルドしたイメージをSDカードへコピー
							$ cp arch/arm/boot/zImage SDカードのFATパーティションのマウントポイント
							$ cp arch/arm/boot/dts/socfpga_cyclone5_socdk.dtb SDカードのFATパーティションのマウントポイント
						

TRACE32のセットアップ

インストレーション メディアのinstallation.pdfの通りにインストールしてください。Linuxについては、PC_LINUXの項に記載されています。デバッガ ハードウェアがUSB接続の場合は、Install Drivers (USB)の項も読んでください。

Cyclone V SoC用、Linux用の設定ファイルを.cmmファイルに保存してください。

							Cyclone V SoC用の設定
							aps_cyclone5_socdk.cmm

							SYStem.RESet

							SYStem.CPU CYCLONEVSOC
							SYStem.JtagClock 1MHz
							SYStem.Option IMASKASM ON
							SYStem.Option IMASKHLL ON
							SYStem.Option TRST OFF
							TRACE.DISable
						
							Linuxデバッグ用の設定
							aps_linux.cmm

							SYStem.Option DACR ON          ; give Debugger global write permissions
                               ; add hardware specific options here
							TrOnchip.Set DABORT OFF        ; used by Linux for page miss!
							TrOnchip.Set PABORT OFF        ; used by Linux for page miss!
							TrOnchip.Set UNDEF OFF         ; may be used by Linux for FPU detection
							SYStem.Option MMUSPACES ON     ; enable space ids to virtual addresses

							Data.LOAD.Elf ~/work/linux-socfpga.git/vmlinux /GNU /NoCODE

							TRANSlation.RESet
							MMU.FORMAT LINUXSWAP3 swapper_pg_dir 0xc0000000--0xdfffffff 0x0
							TRANSlation.COMMON 0xbf000000--0xffffffff
							TRANSlation.TableWalk ON
							TRANSlation.ON

							TASK.CONFIG ~~/demo/arm/kernel/linux/linux-3.x/linux3.t32
							MENU.ReProgram ~~/demo/arm/kernel/linux/linux-3.x/linux.men

							TERM.Mode VT100
							TERM.METHOD COM /dev/ttyUSB0 115200. 8 NONE 1STOP NONE
							TERM.SIZE 100. 1000.
							TERM.SCROLL ON
						

準備が整いました。TRACE32を起動してみましょう!

							$ cd /opt/t32
							$ ./bin/pc_linux64/t32marm-qt
						

Linuxアプリのデバッグ

詳しくは冒頭のビデオで見てね!

補足

今回使用したLEDのサンプル アプリは、Altera SoC DKのソフトウェアです。このページの「Kit installation (ZIP) (Linux)」からダウンロードできます。

今回はHPSのLEDを点滅させたので、ソースを下記のように変更します。

							blink.cを変更
							sprintf(dir, "/sys/class/leds/fpga_led%d/trigger", ledno);
							↓
							sprintf(dir, "/sys/class/leds/hps_led%d/trigger", ledno);

							Linuxならコマンドで一発変換できます
							$ sed -e 's/fpga_/hps_/g' blink.c > blink_hps.c
						

コンパイルは下記の通り行います。

							$ . /opt/poky/2.1.1/environment-setup-cortexa8hf-neon-poky-linux-gnueabi
							$ $CC -g -O0 -Werror -Wall –lpthread –o blink_hps blink_hps.c