ラズパイをもっとプログラミング目的に使いたいなー。
そんな方のために、今回はラズパイで他の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を作成します。
cd hidapi/ ./bootstrap ./configure
コンパイル等の処理をします。
make
インストールします。
/usr/local/libにHIDAPIライブラリがインストールされます。
sudo make install
HIDAPIライブラリのパスを追加します。
nano ~/.profile
PATHを追加します。
nanoは、Ctrl+X後にYで保存できます。
PATH="$HOME/bin:/usr/local/lib:$PATH"
共有ライブラリのキャッシュを更新します。
sudo ldconfig
インストール後は、ソースディレクトリは不要なため削除します。
cd ~/ sudo rm -R hidapi
OpenOCDのインストール
OpenOCDのソースをgitで取得します。
cd ~/ git clone git://git.code.sf.net/p/openocd/code openocd-code
作成されたディレクトリに移動後、makefileを作成します。
cd openocd-code/ ./bootstrap ./configure --enable-cmsis-dap --enable-sysfsgpio --enable-bcm2835gpio
コンパイル等の処理をします。
make
インストールします。
/usr/local/bin/openocdにインストールされます。
設定ファイルは、/usr/local/share/openocd/scriptsに作成されます。
sudo make install
インストール後は、ソースディレクトリは不要なため削除します。
cd ~/ sudo rm -R openocd-code
UDEVルールの追加
OpenOCDをIDE等で使用するためにUDEVルールを設定しておきます。
まずは、USBのVendorIDとProductIDを調べます。
lsusb
この例では、以下のようになります。
新規にファイルを作成します。
sudo nano /etc/udev/rules.d/CMSIS.rules
以下のように作成します。
KERNEL=="hidraw*", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", MODE="0666" SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", MODE="0666" SUBSYSTEM=="usb_device", ATTRS{idVendor}=="0483", MODE="0666"
OpenOCDの実行
下記コマンドでOpenOCDを起動します。
sudo openocd -f /usr/local/share/openocd/scripts/board/st_nucleo_f0.cfg
接続に成功すると、以下のようなメッセージが表示されます。
telnetから制御
telnetからOpenOCDを制御できます。
telnetがインストールされていない場合は、telnetをインストールしてください。
sudo apt-get install telnet
telnet localhost 4444
コマンドは以下のようなものがあります。
コマンド | 説明 |
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で全コマンドが表示されます。
まとめ
ラズパイをプログラミング学習として使用する方法を紹介しました。
まずは導入編として紹介させていただきました。
今後、CPUの制御方法を紹介していきたいと思います。
ではでは!