Windows10対応軽量シンプルな環境でARMマイコンをInsightとOpenOCDを使ってデバッグする(2019年度版)

OpenOCD for Windows is HERE!
↑ねむいさんは自前ビルドのOpenOCDバイナリ公開してます。
 解説はこのバイナリを基にすすめますので4649!



この記事は前回からの続きです。前回のものよりちょっと内容が難しくなってます。
前回の内容を基に環境を構築していることが前提で話を進めさせていただきます。
今回はOpenOCDを使用し実際にARMマイコンにJTAG/SWD経由でフラッシュ書き込み
そしてデバッグを行うところまでいきます。
もちろん今回も軽量動作,NO-Eclipse,NO-Cygwinです。

※今回の記事も時代に合わせて適宜加筆修正していきます。


●必要なもの
 1.ARMマイコンが実装されたターゲットボード
  凡例として、STM32F4シリーズであるSTM32F4Discoveryを使用します。
  私が配布しているSTM32F4向けのFatFs移植例は、デフォルトのターゲットボードが
  STM32F4Discovery、デバッガハードウエアがSTLink/V2となっています。
  Nucleo系板や2015年以降発売のDiscovery系板はSTLink/V2-1に変ってます。
  
↑とりあえず何も編集しなくてもよくなってます。

 2.JTAG/SWDデバッガハードウエア
  上記のCortex-M4はデバッグユニットとしてJTAGとSWDという接続方式の両方をサ
  ポートしています。ARM7TDMIはJTAGインターフェースのみでした。

  現在、ホビーユーザーが手軽に利用できるものとしてFT2232系を使ったJTAGデバイスが
  主流です。以後の解説はそれを利用したJTAGKey2互換の"JTAGKey2 Compatible"
  を使用しJTAG接続にて解説していきます。
  JTAGKey2 Comatibleを自作される方はこちらの解説を参考に。

  SWD接続についてはCMSIS-DAPが現在の主流となっています。NxP系の評価ボード
  にはmbed版としてデフォルトで搭載されているのでおなじみだと思います。
  その他の品種ではVersaloonや上記のJTAGKey2CompatibleでもSWD接続可能
  なっています。
  
  2019年現在はCortex系マイコンが花盛り、SWDが当たり前となっております!
  

 3.OpenOCD
  OpenOCDはターゲットMCU(ARMマイコン)と後述するgdb/insightの仲介役を果たす
  フラッシュ書き込み機能を持ったサーバープログラムです。
  ねむいさん謹製のビルド済みバイナリを用意しておりますので、
  OpenOCDのWindowsバイナリはこちらからダウンロードしてください。

  注意すべきはデバッガハードウエアに対するドライバで、上記リンクにある
  OpenOCDバイナリは下記のデバイスとドライバをサポートしています。
  (注:LibUSB->クラシックなLibUSB0.1系を指す
    WinUSB->バックエンドとなるLibUSB1.0系を指す)

  *JTAGKey2をはじめとしたFT2232系デバイス:(WinUSB or LibUSB)
  *Versaloon:(WinUSB)
  *STLink/v2:(STMicro純正/WinUSB)
  *TI-ICDI(Stellaris Launchpad):(TI純正/WinUSB)
  *J-Link(WinUSB)
  *J-Link On LPCLink2(WinUSB)
  *CMSIS-DAP(HIDとしてドライバレスだがmbed版はVCPドライバ必須)
  *STLink/V2-1(VCPドライバ必須)


  各ドライバのインストールは以前は、PID/VID調べてINFファイルを作って…と非常に
  めんどくさかったのですが、現在はWinUSB,LibUSB向けのGUIな汎用インストーラのzadig
  を使用することによりインストールが大幅に簡略化され、手軽になりましたのでこちらを
  使用してドライバのインストールを行ってください。
  公式のサイトにはインストール手順も英文で懇切丁寧に書かれていますが見る必要も
  無いくらい簡単にWinUSB/LibUSBが導入可能です。
  さらに、使用するドライバにLibUSBKを選択するとドライバの入れ替え無しに0.1系と
  1.0系のAPIが使用可能になります!…が2017年現在は全てLibUSB-1.0系に移行して
  いるのでLibUSBKを適用する強い理由はなくなりました。WinUSBのドライバを
  適用してください。


  注:このOpenOCDは32bit版ですが64bit版Windows環境でも問題なく動作します。
     64bit版OpenOCDと比べて速度的な面で大差はないです。


  ところでJtagKey2を売ってた所が夜逃げしたらしく現在ではFT2232系を使用したデバッガ
  ハードウエアはOlimexのARM-USB-OCD-Hが主流になりつつあります。
  こいつのデバイスドライバのインストールで詰まってる方が極めて多いのでついでに
  こいつを使った時の導入方法もお伝えします。と言っても難しい操作は全くなく、おなじみ
  Zadigを使用して"ARM-USB-OCD-H (Interface 0)"のデバイスにWinUSBもしくは
  LibUSBKのドライバを適用するだけです。間違っても"Interface 1"に適用しないでください。
  そちらは仮想COMとしてFTDIのドライバを普通に適用させてください。

  ARMは新旧の情報がweb上のいたるところで倒錯しすぎて何が正しい組み合わせか
  分からないと思います。Windows環境でOpenOCDを使われる方は私のぶろぐをしっかり
  見ていただければとにかく途方に暮れることだけは避けられるかと思います。


 4.Insight(gdb-gui)
  InsightはgdbのGUI版です。また、純粋なフロントエンドではなく内部にGDBそのものが
  取り込まれているので別途gdb.exeを用意する必要はありません。当ぶろぐではこれを
  使用しソースコードレベルのデバッグを行います。
  これも詳細は後述しますがバイナリが配布されていますのでビルドする必要はありません。



●下準備
 1.OpenOCDの準備
  かつてWindows環境にてMSYS/MinGWを用いた手順を公開しておりましたが、
  OpnOCD0.8.0以降はビルドするまでの手順が大幅に煩雑になり慣れてない人には
  ビルドがほぼ不可能になってしまいましたので公開を廃止しました。代わりとしまして
  ビルド済のWindowsバイナリを公開しております。ご利用ください。
  インストール箇所は前回のビルド環境構築手順に倣い、  
  C:/devz/arm/ocdにあるものとします。


 2.Insightの準備
  SourceForgeにあるNetXのページのかなり下のほうにある
  "arm-none-eabi-insight-7.4.50.20111222-cvs-mingw32-netx.0.7z"をダウンロード
  し、任意のフォルダに展開してください。
  こちらもC:/devz/arm/insight/binにあるものとします。


●ターゲットデバイスにプログラムをダウンロード
  前回の手順を参考にSTM32F4-Discovery用のmain.elfが生成できてるものとします。
  デバッグ時は最適化オプションを必ず"-O0"にしてビルドしてください。

 1.makeファイルの編集
  前回も解説しましたが、makefileにあるOpenOCDとInsightがインストールされて
  いるパスを指定してください。
  
  

 2.PN2の設定
  PN2の"TOOL"から呼び出すことが出来るように前回と同じ要領で引数つきで登録
  てください。登録するのは"program"と"debug"です。

 3.書き込み
  "TOOL"から"make program"を呼び出し、OpenOCDからSTM32のフラッシュ書き込み
  スクリプトを呼び出しターゲットデバイスに"main.elf"をダウンロードします。
  OpenOCDのcfgファイルのパスの指定が間違っているとエラーが出ますので各自の環
  境に合わせてパスを修正してください。
  

 4.書き込み用のコマンドについて補足
  makefile内では以下のように記述されています。
  1.OpenOCDをJTAG・SWDデバイスのcfgファイル・ターゲットMCUのcfgファイルを
   -fコマンドで指定して起動する。
  2.同時に-cのコマンドでターゲットMCUのcfgに記述されているproc(関数)を呼び出す。
  3.procに記載されている順にコマンドが実行され書き込みを行う。

  上記一連の動作にてgdbやtelnetからの回りくどい操作は一切要せず、簡単に
  書き込み動作が可能です。


●ターゲットデバイスをInsightを使用しデバッグ
 1.makeファイルの編集
  正しくプログラムが書き込まれたことを確認したら次はデバッグです。
  makeでinsightをcmdウインドウ(DOSプロンプト)なしで呼び出すために
  ちょっと回りくどいですが下記のようにして記述しています。
  

 2.OpenOCD・Insightの呼び出し
  "TOOL"から"make debug"を呼び出すと、OpenOCDをターゲットデバイスに接続、その後
  insightが起動します。
  

 3.Insightの接続設定
  接続前にまずregisterウインドウを開いておいてください。
  これをやっておかないと接続後に開くとinsightがsegvで堕ちます。
  

  デバッグ開始前にFile->Target Selectionに進み、以下のように設定を行います。
  原因は不明ですが"Set Breakpoint at 'main'"が効かない事がよくあるので
  "Command issue after attaching"に"tbreak main"と記述し確実にmain関数の
  最初の行で止まるようにしてください。ここでmainに設定したブレークポイントは
  自動的に消去されるのでリソースの無駄になりません。
  
  

  このとき突然Insightが無反応になり操作不能に陥ることがありますが、何らかの
  要因でターゲット設定をシリアルにして保存してしまった場合に起こるようです。
  こうなってしまったらいったんユーザディレクトリ(C:¥Users¥(ユーザー名))に
  あるgdbtk.iniファイルを消去して最初から設定をやり直してください。

  その後"Run" -> "Connect to Target"へ進み、接続を開始します。ダイアログがまた
  出ることもありますがそのままOKを押してください。
  初めてOpenOCDと接続した時にWindowsのファイアウォールの警告画面が開くことが
  あります。接続は許可の設定しておいてください。
  
  OpenOCDとInsightの接続が成功すると"Successfuly Connected"とGDBのダイアログ
  が出ます。ここで"ok"をおすとプログラムがリセット直後にhaltした状態となります。
  

  さっきも言いましたが現在のOpenOCDではターゲット接続後にレジスタウインドウを
  開くとsegvで落ちることが確認されています。これを防ぐためには接続前にレジスタ
  ウインドウを予め開いておき、接続後いったん閉じて再度開き直すと落ちません。

  さらに"Continue"を押すとmain関数の最初の行、一時的にmain()に張った
  ブレークポイント(main()の最初の行)に飛びます。
  
  
  ここまできたらあとはInsight上でステップインとかステップアウトとかブレークポイント
  張って停止させたりレジスタとかメモリとか(条件付で)I/Oレジスタの値読み出した
  り自由自在です!

また、開きっぱなしのレジスタウインドウは接続後にいったん閉じて再度開き直すと
本来のレジスタがすべて見えるようになります。F4なので浮動小数点レジスタも参照
することができます!
  
  


  終了する時はTools->Stop Toolsで終了させたいところですがが、PN2ではひとつの
  プログラムしか終了できず、Insightだけが終了してOpenOCDが終了してくれません。
  私は下記の要領で強制的にタスクを殺すwindowsのtaskkillコマンドを使ったバッチ
  ファイルを作成してこれを呼び出して"確実に"終了させています。
  ↓呪文
  taskkill /F /IM openocd.exe
  taskkill /F /IM arm-none-eabi-insight.exe
  

Go to top of page