ラズパイで電子工作

ラズパイにOpenOCDを入れてデバッグアダプタにする

ラズパイをもっとプログラミング目的に使いたいなー。

 

 

 

 

そんな方のために、今回はラズパイで他のCPUボードをデバッグできるようにします。

プログラムがどのように動作しているか分かるようにするには動かすことが近道です。

今回は環境構築までを説明します。

 

エンジニアブロガーのプロコアラです。

10年間エンジニアとして働いており、プログラマ向けの開発支援ツールの開発も経験しました。

JTAG ICE、JTAGエミュレータとかデバッグアダプタとか言われているものです。

簡単に言えば、CPUへプログラムを書き込んだり、プログラムのデバッグを行うために使用するツールです。

 

CPUの動きを解説する際に良い方法ないかなと模索していのですが、やはり僕らの大好きラズパイから

今回は、ラズパイにOpenOCDというオープンソースのソフトを入れてエミュレータにしたいと思います。

JTAGを接続するのは面倒なため、CMSIS-DAPに対応したmbedボードを使用します。

 

用語・技術の説明

用語をざっくり説明します。

 

プログラムが動く仕組み

私たちの使用している家電、スマートフォンなどは中にCPU、メモリ、周辺のデバイスなどが入っています。

簡単にプログラムが動く仕組みを説明すると、メモリに命令とデータが入っていて、CPUは1命令ずつメモリから呼び出して実行しているだけです。

メモリのどこから読めば良いかはプログラムカウンタ(PC)レジスタというものが教えてくれます。

CPUの動きは単純です。電源が投入されると、PCから命令を取得(フェッチ)して解析(デコード)後、実行(エグゼキュート)を繰り返します。

命令読み出し後、PCはインクリメントされて次のメモリのアドレスを指します。

 

プログラムを制御する仕組み

CPUは馬鹿なので、プログラムを実行し続けます。

CPUは止まることはできません。プログラムの実行を止めるためにはデバッグ例外を発生させてプログラムを停止させなければなりません。

 

JTAG

JTAGはCPUを外から制御するためのインターフェースです。5本の信号線でIEEE1149.1で規定されています。

CPUを停止させたり、メモリやレジスタを参照変更したりすることができます。よくデバッグと言われるものです。

 

CMSIS-DAP

CMSIS-DAPとは、ARMコアへのDAP(デバッグアクセスポート)への標準化された
アクセス方法を提供するものです。
ターゲットをホストコンピュータとUSBで接続することで、JTAGエミュレータを使用せずに
デバッグすることができます。

 

OpenOCD

Open On-Chip Debuggerの略。
OpenOCDとは、GDBもしくはtclスクリプトによってARM、MIPS、その他コアへの
JTAGアクセスを提供するオープンソースソフトウェアです。

OpenOCDがCMSIS-DAP対応したため、CMSIS-DAPを搭載しているmbedボードなどは
JTAGエミュレータを使用せずにデバッグできます。

 

 

環境構築

依存ツールのインストール

OpenOCDのために必要なツールを下記コマンドでインストールします。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install autotools-dev make libtool pkg-config autoconf automake texinfo libudev1 libudev-dev libusb-1.0-0-dev libfox-1.6-dev

 

HIDAPIライブラリのインストール

CMSIS-DAPを使用するにはHID APIが必要になります。

HID APIをビルドするために、ソースをgitで取得します。
gitがインストールされていない場合は、gitをインストールしてください。
sudo apt-get install git

cd ~/
git clone https://github.com/signal11/hidapi.git

 

作成されたディレクトリに移動後、makefileを作成します。

コンパイル等の処理をします。

 

インストールします。
/usr/local/libにHIDAPIライブラリがインストールされます。

 

HIDAPIライブラリのパスを追加します。

nano ~/.profile

 

PATHを追加します。
nanoは、Ctrl+X後にYで保存できます。

PATH="$HOME/bin:/usr/local/lib:$PATH"

 

共有ライブラリのキャッシュを更新します。

インストール後は、ソースディレクトリは不要なため削除します。

OpenOCDのインストール

OpenOCDのソースをgitで取得します。

 

作成されたディレクトリに移動後、makefileを作成します。

 

コンパイル等の処理をします。

make

 

インストールします。
/usr/local/bin/openocdにインストールされます。
設定ファイルは、/usr/local/share/openocd/scriptsに作成されます。

sudo make install

 

インストール後は、ソースディレクトリは不要なため削除します。

UDEVルールの追加

OpenOCDをIDE等で使用するためにUDEVルールを設定しておきます。

 

まずは、USBのVendorIDとProductIDを調べます。

この例では、以下のようになります。
新規にファイルを作成します。

 

以下のように作成します。

OpenOCDの実行

下記コマンドでOpenOCDを起動します。

 

接続に成功すると、以下のようなメッセージが表示されます。

スクリーンショット 2016-04-02 10.29.46

telnetから制御

telnetからOpenOCDを制御できます。
telnetがインストールされていない場合は、telnetをインストールしてください。
sudo apt-get install telnet

 

スクリーンショット 2016-04-02 10.29.46

コマンドは以下のようなものがあります。

コマンド 説明
targets ターゲットの情報を表示します
halt ターゲットプログラムを停止させます
resume ターゲットプログラムを再開させます

コマンド詳細は下記をご覧ください。
http://openocd.org/doc/html/General-Commands.html

 

GDBから制御

下記コマンドでgdbから制御できます。
gdbがインストールされていない場合は、gdbをインストールしてください。
sudo apt-get install gdb-arm-none-eabi

arm-none-eabi-gdb
target remote localhost:3333

 

コマンドは以下のようなものがあります。

コマンド 説明
info reg レジスタを表示します
load ターゲットにプログラムをロードします
list ブレークしている行の周辺を表示します

コマンド詳細は下記をご覧ください。(よく使用するコマンド)
http://www.kumikomi.net/interface/sample/201503/if03_100.pdf
※ help allで全コマンドが表示されます。

 

スクリーンショット 2016-04-02 12.20.42

 

まとめ

ラズパイをプログラミング学習として使用する方法を紹介しました。

まずは導入編として紹介させていただきました。

今後、CPUの制御方法を紹介していきたいと思います。

ではでは!

ABOUT ME
律野桜哉
RPAコンサルタントのプロコアラです。長年のエンジニア経験を活かしてして外資系コンサルファームでRPAコンサルしてます。 転職ノウハウ、プログラミング、英語の勉強方法など分かりやすいように解説していきます。