FM3マイコンをOpenOCD + Eclipseでデバッグ
OpenOCD + Eclipseを使って、インタフェース6月号付録の富士通製FM3マイコン(MB9BF618T)用のデバック環境を構築してみました。これまでは、LPCXpresso, STM32 Primer2などのデバッグ環境込みのIDEを使っており、OpenOCDを使うのは今回が初めてです。備忘録を兼ねて環境構築の手順を記載します。
2012/5/12: デバッグ時のプログラム書き込み手順を修正。Managed Projectにアセンブラファイルを追加する方法を追記。
OpenOCD用USB JTAGインタフェースの購入
価格がお手ごろなOLIMEX製ARM-USB-TINY-Hを仙石電商さんで購入。2012年5月時点で税込み6825円でした。あとで分かったのですがStrawberry Linuxさんの方が4620円で2000円も安かった・・メーカー希望価格€39.95らしく、Strawberry Linuxさんの方がユーロ安反映価格ですね。
Sourcery CodeBench Lite Editionのインストール
CodeSourcery G++(Mentor Graphicsに買収されてタイトルが変わった)のインストールとmake環境をインストールします。
- Sourcery CodeBench Lite Editionのwebページから、Download the EABI Releaseをクリック。所定の項目を入力してファイルをダウンロード&インストール
- このリンクからDownload mingw-get-instをダウンロードして、MinGW + MSYSをインストール。MinGW\binとMinGW\msys\1.0\binにパスを通しておく。今回は使いませんが、x86用のgccもインストールしておく
Eclipseのインストール
2012年5月時点で最新版の3.7.2(Indigo)インストールしました。
- 先ずは、EclipseのダウンロードサイトからEclipse Classic 3.7.2をDL(Eclipse IDE for C/C++ Developersを使うという手もあるのですが、Classic + CDTを個別にインストールした方がよいとZylinのサイトに記載があったのでそれに従う)
- CDTのインストール: Eclipseを起動して、Help → Install New Software → Work with:にhttp://download.eclipse.org/tools/cdt/releases/indigoを入力。CDT Main Features全部とCDT Optional Featuresを選択(選択したオプションはここを参考にしました。IndigoのProgramming LanguagesメニューからでもCDT本体はインストールできるのですが、オプション機能をインストールできないため(必要か否かは不明ですが・・)前者のurlから追加インストールします
- Zylin Embedded CDTのインストール: Help → Install New Software → Work with:にhttp://opensource.zylin.com/zylincdtを入力
- GNU ARM C/C++ Development Supportのインストール: Help → Install New Software → Work with:にhttp://gnuarmeclipse.sourceforge.net/updatesを入力。このプラグインを入れると新規プロジェクトの作成でSourcery G++ Toolchainが選択できるようになり、includeパスなどが自動設定され便利です。またcpuタイプの選択がプロジェクトプロパティから選択できるようになります(マイコン風雲録さんより)
OLIMEX ARM-USB-TINY-H用ドライバのインストール
- OLIMEXのサイトから、OLIMEX ARM DEVELOPMENT PACKAGEをダウンロード
- JTAGインタフェースをPCのUSBポートに接続すると2つ不明なデバイスが見えます
- ドライバの更新メニューから、DRIVERSフォルダ配下のolimex-libusb-1.2.2.0をインストール
(最新版がこのURLにあるため、こちらを使ってもよいかと) - CDM20808フォルダ配下のドライバはARM-USB-OCD-H用のため使用しません
- 2つのデバイス個々に更新を行うと、以下のように認識されます
OpenOCDのインストール
- このサイトから、Windows用のコンパイル済みファイルをダウンロードして適当なフォルダに展開します(OpenOCD 0.5.0を使用しました)
- targetフォルダにFM3.cfgが既に入っているのですがMB96F506用です。jujurouさんのブログにMB9BF618用の設定ファイルが公開されており、ありがたく使用させていただきました
- OpenOCD起動用のスクリプトを以下の通り作成(mb9bfxx6.cfg)
telnet_port 4444 gdb_port 3333 set CHIPNAME mb9bfxx6 source [find interface/olimex-arm-usb-tiny-h.cfg] source [find target/fm3.cfg]
OpenOCDの動作テスト
WiKimurAさんのOpenOCDが動くまでを参考に以下の通り動作を確認。ちゃんと動いているみたい!(実際はここまでの道のりは長かったのですが)
- openocd –f mb9bfxx6.cfgでOpenOCDデーモンを起動
- もう一つコンソールを開いて、telnet localhost 4444でOpenOCDデーモンに接続
- OpenOCDのコマンドを入力してターゲットを操作
--- 起動時のメッセージ --- C:\Tools\openocd>openocd -f mb9bfxx6.cfg Open On-Chip Debugger 0.5.0 (2011-08-09-23:21) Licensed under GNU GPL v2 For bug reports, read http://openocd.berlios.de/doc/doxygen/bugs.html Info : only one transport option; autoselect 'jtag' adapter_nsrst_delay: 100 jtag_ntrst_delay: 100 trst_only separate trst_push_pull Info : ******HWE* FLASH CMD Parameter mb9bfxx6.cpu Info : ******HWE* fm3 Variant set to: mb9bfxx6 500 kHz cortex_m3 reset_config sysresetreq Info : max TCK change to: 30000 kHz Info : clock speed 500 kHz Info : JTAG tap: mb9bfxx6.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0x ba00, ver: 0x4) Info : mb9bfxx6.cpu: hardware has 6 breakpoints, 4 watchpoints Info : accepting 'telnet' connection from 4444 --- 以下Telnetセッションからの操作 ---- C:\>telnet localhost 4444 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Open On-Chip Debugger > poll background polling: on TAP: mb9bfxx6.cpu (enabled) target state: running > > halt target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x21000000 pc: 0x00000218 msp: 0x1ffffff0 > > reset JTAG tap: mb9bfxx6.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4) >
Eclipseからのflash書き込みとデバッグ
先ずはLチカあたりのサンプルコードを作る必要があります。インタフェース6月号のサンプルにLチカコードがあるのですが、Keil用となっておりスタートアップコードがARMアセンブラなので、このままではgcc環境で使用できません。ねむいさんのブログ、FM3マイコンはぢめましたにLチカのサンプルコードがありましたのでこちらを使用させていたきました。
Makeファイルを自分の環境用に修正してEclipseのMakefile projectからビルドすれば、当然正しくコンパイル・リンクができます。Managed project (ファイルを追加するとEclipseが自動的にmake fileを生成する) - ARM Windows GCC (Sourcery GLL Lite) - を使用する場合、コンパイル・リンクは通っているのですがうまく動きません。どうも、スタートアップ用のアセンブラファイル(.s)のコンパイル・リンクを行っていないようです(自動生成されるmakefileに.sファイルが入らない)アセンブラソースファイルの拡張子を”.s”でなく”.asm”とします。拡張子が.sのままでは自動生成されるmakefileにアセンブラのソースファイル(今回の例では、startup_mb9bf61xt)が追加されません。
先ずは、ねむいさん版のmakefileプロジェクトでデバッグの動作確認を行います。
手順は以下の通りです:
- EclipseのRun → External Tools → External Tools Configuration…を開き、以下の設定を追加
- Run → External Tools → OpenOCD (上記で登録した名前)でOpenOCDデーモンを起動
- ここで、OpenOCD経由で
flashのプログラムを行い、ターゲットをhalt状態にしておきます。プログラムがrun状態ですと、Eclipseを使ったデバッグセッションの起動時にgdbとOpenOCDデーモン間の通信がエラーとなってデバッグができません(私はこれに気がつかず結構悩みました)。書き込みたいelfファイルがあるフォルダーに移動して、telnetセッションから以下のようにhaltコマンドを実行します:
2012/9/8追記: mokeshiさんより起動スクリプトでhaltコマンドを自動実行させる方法をコメントいただきました(手順はコメント欄を参照下さい)
C:\Tools\openocd>telnet localhost 4444 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Open On-Chip Debugger > > halt target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x21000000 pc: 0x00000726 msp: 0x1fffffe8 >
- Run → Debug ConfigurationsからMain、DebuggerとCommandsタブを以下のように設定
C/C++ Applicationにelfファイルを指定
-
Debuggerはarm-none-eabi-gdbを指定
-
Commandsは以下を指定
<Initialize commands>
target remote localhost:3333
load
monitor soft_reset_halt
break main
<Run commands>
continue
-
デバッグを開始すると、以下のようにめでたくEclipseでソースコードデバッグが動きました。
-
2012/5/12追記: Flashへの書き込みはDebug configurationで指定したelfファイルをloadコマンドで自動的に書き込んでくれます。そのため、telnetセッションからflash write_image erase xxx.elfで書き込みを行う必要はありません。また、flash write_imageコマンドで指定したファイルは、OpenOCDデーモン起動時に指定した.cfgファイルのパスを検索するようで、プロジェクトのビルドターゲットパスにカレントディレクトリを移動してもフルパスでelfファイル名を指定しない限りfile openエラーになります。そのため、flashへの書き込みはDebug Configrationの指定で行うのがよいです。
おわりに
インタフェースの次回特集に先立ち、Eclipse + OpenOCD環境にてデバッグができるようになりました。LPCXpressoのようにGPIOやコントロールレジスタ類の表示ができないのですが、configファイルを書けばできるのかも(今後の課題)。自動makeプロジェクトでアセンブラファイルを認識しない問題を解決せねばはファイルの拡張子が間違っていた(.sでなく、.asm)という初歩的な問題でした。
参考資料
-
WKimurA: ARM開発環境構築手順
-
WKimurA: OpenOCDが動くまで
-
ねむいさんのぶろぐ: FM3マイコンはぢめました
-
電子工作マスターへの歩み: MB9BF618T対応(?) OpenOCDの作成
-
マイコン風雲録: OpenOCD: Eclipseを倍...orz
-
CodeZine: OpenOCD
最近のコメント