2019年8月12日スポンサーリンクラズパイをもっとプログラミング目的に使いたいなー。そんな方のために、今回はラズパイで他のCPUボードをデバッグできるようにします。プログラムがどのように動作しているか分かるようにするには動かすことが近道です。今回は環境構築までを説明します。エンジニアブロガーのプロコアラです。10年間エンジニアとして働いており、プログラマ向けの開発支援ツールの開発も経験しました。ICE、JTAGエミュレータとかデバッグアダプタとか言われているものです。簡単に言えば、CPUへプログラムを書き込んだり、プログラムのデバッグを行うために使用するツールです。CPUの動きを解説する際に良い方法ないかなと模索していのですが、やはり僕らの大好きラズパイから今回は、ラズパイにOpenOCDというオープンソースのソフトを入れてエミュレータにしたいと思います。JTAGを接続するのは面倒なため、CMSIS-DAPに対応したmbedボードを使用します。用語をざっくり説明します。プログラムが動く仕組み私たちの使用している家電、スマートフォンなどは中にCPU、メモリ、周辺のデバイスなどが入っています。簡単にプログラムが動く仕組みを説明すると、メモリに命令とデータが入っていて、CPUは1命令ずつメモリから呼び出して実行しているだけです。メモリのどこから読めば良いかはプログラムカウンタ(PC)レジスタというものが教えてくれます。CPUの動きは単純です。電源が投入されると、PCから命令を取得(フェッチ)して解析(デコード)後、実行(エグゼキュート)を繰り返します。命令読み出し後、PCはインクリメントされて次のメモリのアドレスを指します。プログラムを制御する仕組みCPUは馬鹿なので、プログラムを実行し続けます。CPUは止まることはできません。プログラムの実行を止めるためにはデバッグ例外を発生させてプログラムを停止させなければなりません。JTAGJTAGはCPUを外から制御するためのインターフェースです。5本の信号線でIEEE1149.1で規定されています。CPUを停止させたり、メモリやレジスタを参照変更したりすることができます。デバッグと言われるものです。CMSIS-DAPCMSIS-DAPとは、ARMコアへのDAP(デバッグアクセスポート)への標準化されたアクセス方法を提供するものです。ターゲットをホストコンピュータとUSBで接続することで、JTAGエミュレータを使用せずにデバッグすることができます。Debuggerの略。OpenOCDとは、GDBもしくはtclスクリプトによってARM、MIPS、その他コアへのJTAGアクセスを提供するオープンソースソフトウェアです。OpenOCDがCMSIS-DAP対応したため、CMSIS-DAPを搭載しているmbedボードなどはJTAGエミュレータを使用せずにデバッグできます。依存ツールのインストールOpenOCDのために必要なツールを下記コマンドでインストールします。APIが必要になります。APIをビルドするために、ソースをgitで取得します。gitがインストールされていない場合は、gitをインストールしてください。https://github.com/signal11/hidapi.git作成されたディレクトリに移動後、makefileを作成します。hidapi/./bootstrap./configureコンパイル等の処理をします。make1makeインストールします。/usr/local/libにHIDAPIライブラリがインストールされます。installHIDAPIライブラリのパスを追加します。~/.profilePATHを追加します。nanoは、Ctrl+X後にYで保存できます。PATH="$HOME/bin:/usr/local/lib:$PATH"1PATH="$HOME/bin:/usr/local/lib:$PATH"共有ライブラリのキャッシュを更新します。ldconfigインストール後は、ソースディレクトリは不要なため削除します。hidapiOpenOCDのインストールOpenOCDのソースをgitで取得します。openocd-code作成されたディレクトリに移動後、makefileを作成します。--enable-bcm2835gpioコンパイル等の処理をします。make1makeインストールします。/usr/local/bin/openocdにインストールされます。設定ファイルは、/usr/local/share/openocd/scriptsに作成されます。installインストール後は、ソースディレクトリは不要なため削除します。openocd-codeUDEVルールの追加OpenOCDをIDE等で使用するためにUDEVルールを設定しておきます。USBのVendorIDとProductIDを調べます。lsusb1lsusbこの例では、以下のようになります。新規にファイルを作成します。/etc/udev/rules.d/CMSIS.rules以下のように作成します。下記コマンドでOpenOCDを起動します。/usr/local/share/openocd/scripts/board/st_nucleo_f0.cfg接続に成功すると、以下のようなメッセージが表示されます。telnetから制御telnetからOpenOCDを制御できます。telnetがインストールされていない場合は、telnetをインストールしてください。4444コマンドは以下のようなものがあります。ターゲットプログラムを再開させますコマンド詳細は下記をご覧ください。下記コマンドでgdbから制御できます。gdbがインストールされていない場合は、gdbをインストールしてください。localhost:3333コマンドは以下のようなものがあります。ブレークしている行の周辺を表示しますコマンド詳細は下記をご覧ください。allで全コマンドが表示されます。まとめラズパイをプログラミング学習として使用する方法を紹介しました。導入編として紹介させていただきました。今後、CPUの制御方法を紹介していきたいと思います。MEプロコアラRPAコンサルタントのプロコアラです。長年のエンジニア経験を活かしてして外資系コンサルファームでRPAコンサルしてます。転職ノウハウ、プログラミング、英語の勉強方法など分かりやすいように解説していきます。元エンジニア・RPAコンサルプロコアラRPAコンサルタントのプロコアラです。長年のエンジニア経験を活かしてして外資系コンサルファームでRPAコンサルしてます。転職ノウハウ、プログラミング、英語の勉強方法など分かりやすいように解説していきます。