職業はシステムエンジニアです。日々忙しいので、もっとゆとりのある生活を求めてます。趣味は、読書、イラスト、写真。最近は電子工作も楽しんでいます。二人の男の子がいるので、たまにイクメンのネタも書いています。ICEがほしくなります。ICEを使えばレジスタ状態などから、どこで止まっているか把握しやすくなります。ブート後のプログラムでも、printデバッグコードを仕込むことなく変数の値を確認したりブレークをかけて見たいところで止めることができ便利です。OlimexのARM-USB-TINY-Hというモデルです。ICEは本格的なものだと100万円以上します。個人で買う余裕はありません。それに対して、このOlimexのARM-USB-TINY-Hは5000円程度で購入できます。今回はストロベリーリナックスから購入しました。2でも実績があります。2009年ころにBeagleboardが流行ったころから使用例はあったようです。OpenOCDというオープンソースのデバッグ環境を使います。ICEとして動作します。OpenOCDはGDBサーバーの形でターゲットのボードに接続します。TCPのポート3333を使います。OpenOCDがUSBからJTAGへの変換を行います。FT2232にはUSBシリアル変換アダプタはシリアル通信の他、JTAGと同期する機能も入っています。ターゲットボードにGDBサーバー機能を追加しなくてもOpenOCDがその肩代わりをしてくれます。5つの端子を接続する必要があります。個々の端子をジャンパ線で直接つなぎました。20pinの接続コネクタを作れば、もっと簡単に脱着できますが、一度、ジャンパ線でつなげれば、しばらくはそのままにするので、今回はジャンパ線にしました。ICEが壊れる可能性があるので、接続時には確認を何度も行いました。ジャンパ線にも端子のどこにつなぐかを示すタグを一本一本つけて間違わないようにしました。16.04LTSをメインに使っていれば、OpenOCDはパッケージとしてインストールできます。(luna)以降を別途インストールしました。インターフェース2017年2月号に詳しい設定が掲載ARM-USB-TINY-HによるOpenOCDの解説がインターフェース2017年2月号に掲載されていました。2へ接続する方法が記載されています。なんてタイムリーなんでしょう。Metalプログラミングする機会も多くなるからかもしれません。64bit環境へ接続する方法が2月号には記載されていませんでしたので、色々と試行錯誤してみました。3の64bitモードでも接続できます。インターフェース2017年2月号の付録DVDのUbuntu環境に入っているOpenOCDだと64bitのaarch64での接続はサポートされていないので、以下の環境を別途取得しました。3.まず、OpenOCDのソースコードを取得し、ビルドします。makeビルドした実行ファイルはopenocd-armv8/src/openocdに出力されます。環境ファイルはopenocd-armv8/tclフォルダの中にあります。以下のようにするとaarch64でOpenOCDに接続できます。openocd-armv8/tcl/target/rpi3.cfg以下のようにエラーが色々と出ますが、この状態でgdbに接続することができます。16.04LTSの標準パッケージのbinutils-aarch64-linux-gnu、gcc-aarch64-linux-gnuをインストールしただけでaarch64のビルドはできますが、gdbを使ったaarch64のデバッグができません。そこで以下を参考に64bitのクロス環境(aarch64-linux-gnu)を構築しました。3の64bitコードを、aarch64-linux-gnuでそのままビルドするとlibcが動的リンクされたコードができてしまい正常動作しません。そこで、リンカ(ld)の引数に-staticをつけて、libcが静的リンクされるようにしました。gdbに接続すると、以下のように止まります。EclipseからのOpenOCDの呼び出しとGDBの接続方法は、インターフェース2017年2月号の内容を参考にしました。Piの場合は、起動後にJTAGポートの設定が必要になるので、設定直後にwaitフラグでビジーループするようにしてからGDBで接続し、そこでwaitフラグを落としてプログラムを先に進めるのが良いようです。記事では、以下からbootsect.binとstart.elfをダウンロードし、ビルドして生成されたkernel8.imgと一緒にmicroSDにコピーして起動することになっています。raspberrypi/firmwareしかし、このままだと起動した後に反応しませんでした。そこで、config.txtに以下の2行を加えて同じ階層にコピーして起動することで動作を確認しました。start.elf)は時期によって動作が変わるらしく、記事の執筆時点とうまく合っていなかったのかもしれません。kernel_old=1disable_commandline_tags=1kernel_oldが1になっていないと、全コアが0x0から始まらないようです。0だと、32bit環境(aarch32)なら0x8000からkernel7.imgを実行、64bit環境(aarch64)なら0x80000からkernel8.imgを実行するようになっているようです。Treeを特定の領域にロードしてしまうようです。Piを使っているうえで気になる点ですね。ICEもUARTも使えるようになったので、ずいぶん開発しやすくなりました。Metal開発を進めていきたいと思います。ライブドアブログ↑このページのトップヘ。