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
« LPCXpresso IDEでのC++コードサイズ肥大化の対策 | トップページ | iPhoneからmbedをBluetooth LE (BTLE)で制御する »
「Fujitsu-ARM」カテゴリの記事
- FM3マイコンをOpenOCD + Eclipseでデバッグ(2012.05.06)
コメント
この記事へのコメントは終了しました。
« LPCXpresso IDEでのC++コードサイズ肥大化の対策 | トップページ | iPhoneからmbedをBluetooth LE (BTLE)で制御する »
現在のOpenOCDではMB9B618Tの全てのFlash領域に書き込みは出来ません。MB9B506Nまでのが入っていてFlash容量は512MBまでです。
set CHIPNAME mb9bfxx6
この定義がFlash容量を表しています。
1MB全領域書き込むにはOpenOCDのソースコードを編集してビルドする必要があります。Interfaceの7月号では対応したOpenOCDとソースコードが公開されるのではないかと思ってます。
投稿: jujurou | 2012年5月 6日 (日) 22時12分
さっそくコメントありがとうございます。
現在のOpenOCDではFlash容量1MBを使えないというのはjujurouさんのブログで拝見したのですが、512MBまでなんですね。定義ファイルの読み方などOpenOCDの詳細はこれから勉強です。
投稿: todotani | 2012年5月 6日 (日) 22時41分
はじめまして
最近STM32をいじり始めた者です。
eclipseとOpenOCDでの開発環境を整えようと、このブログを参考にさせていただきました。
わかりやすく解説されており、非常に役立ちました。
ありがとうございます。
環境を整えているときに気づいたことがあったので報告させて頂きます。
ブログ記事に書いてあるようにRun → External ToolsでOpenOCDを起動した後、コンソールでhaltをかけなければGDBがうまく動きません。毎回コマンドを打つのが面倒に感じたため以下のようにOpenOCDの起動と同時にhaltコマンドを実行するようにしました。
・OpenOCD起動用のスクリプト(hoge.cfg)に以下のhalt用関数を追加
proc halt_mpu {} {
init
reset halt
}
・Run → External Tools → External Tools Configuration → mainタブ の Arguments の最後に
以下のコマンドを追加(OpenOCDの起動時にhalt_mpu関数を呼び出す)
-c halt_mpu
これでOpenOCDの起動と同時にMPUがHaltするのでコンソールでhaltしなくても、そのままデバッグを開始できます。
あと、些細な事ですが、Run → Debug Configurations のCommandsに指定する文字列が一部間違っておりました。
(ブログの文字列をコピペして使わせてもらったので、mainで止まらず少し手間取りました^^;)
誤"brake main" → 正"break main"
EclipseとOpenOCDでのデバッグ情報がまとめられている日本語解説はなかなか少ないので非常に助かりました。
ありがとうございます。
投稿: mokeshi | 2012年9月 7日 (金) 14時59分
mokeshiさん、
コメントありがとうございました。
なるほど、起動スクリプト内で自動Haltさせることができるのですね。情報ありがとうございます。誤記の件混乱させてしまいすいませんでした、修正いたしました。
投稿: todoani | 2012年9月 8日 (土) 06時58分
todotaniさん
修正ありがとうございます。
オープンソースでの開発の情報はネット上に有るには有るのですが、情報が散らばってたり、英語であったり(これは私の能力の問題ですが)が多いので、コンパクトにまとめられている情報は非常に助かりました。
これからもブログ記事楽しみに読ませてもらいます。
投稿: mokeshi | 2012年9月 9日 (日) 18時33分
初めまして、KONと申します。
Interface6月号付属のFM3マイコンのデバック方法についてネットで調べていたら、このサイトにたどり着きました。
現在、ARM-USB-TINY-Hでデバッグを行うための環境を構築しているのですが、"Eclipseからのflash書き込みとデバッグ"のところで詰まっており、この場をお借りして質問させていただきました。
ねむいさんのブログからLチカのソースコードをダウンロードしてきて、EclipseのRun → External Tools → External Tools Configuration… でLocatiom、Argumentsの設定をして"Run"を押したのですが、コンソールにエラーが表示されました。
Makeファイルの修正を行うのは初めてなので、何をどうすれば良いのか分かってない状態です。
また、Eclipseでコンパイルする場合、アセンブラの拡張子を.sから.asmに変更した方が良いのでしょうか?
よろしくお願いします。
以下はEclipseのコンソールに出力された内容です。
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
Error: unable to open ftdi device: unable to claim usb device. Make sure the default FTDI driver is not in use
in procedure 'init'
投稿: KON | 2012年11月 2日 (金) 13時56分
KONさん、
コメント回答遅くなり申し訳ありません。
まずデバッガが起動できない件ですが、以下のエラーメッセージを見るに、OpenOCDがARM-USB-TINY-Hを認識できていないようです。
mb9bfxx6.cfgファイルの格納場所を確認してください。このファイルはopenocdをインストールしたフォルダ配下に格納する必要があります。すなわち:
openocdの実行ファイル: open_ocdのパス\bin\openocd.exe
openocdのcfgファイル: open_ocdのパス\mb9bfxx6.cfg
というファイルの配置になっているかを確認して下さい。
Eclipseでアセンブラファイルを使用する場合、拡張子が.asmであることは絶対的な要件ではありません。File→ New → C Projectでプロジェクトを起こす場合は、.asmにする必要があります(この場合makefileは自動生成されます)。File→ New → Makefile project with existing codeを使う場合、.s .asmどちらでもかまいませんが自分でmake fileを作成して、make file内にアセンブラソースの拡張子を指定する必要があります。
投稿: todotani | 2012年11月10日 (土) 07時04分
todotaniさん、お返事ありがとうございます。
教えていただいた手順でやってみたいと思います。
投稿: KON | 2012年11月13日 (火) 23時26分
今日は
私は、以前、EcllipseでSTMのARMをDebugした経験がありますので
LPCXpessoは簡単に動くと思っていましたが、Debug即ちStep実行等が
できません。
code-Redの説明文を見てもこの肝心なところの説明がありません。
貴方のサイトで、Debugの為の設定を拝見して(Run Configuration)
の設定で、何とかDebugができないかと考えています。
(サンプルプロジェクトは、これらの設定なしで動くと考えていましたが....)
LPCXpessoで、サンプルプロジェクトでも簡単に動くと思うのは早計で
原理、原則はわきまえておくことが大切であることを痛感しています。
以前は、森田さん書籍を拝見して、曲がりなりにもEcllipseを
動かすことができました。
red_codeの説明文は、だけでは無理ですね、Foramも気長に
待つ必要がありますね!
やはり、ジェネラルな開発環境を利用できるSTMを選択すべきでしたかね?
仕方がないので、LPCXpessをやり、最終的にSTMなるとも考えますが
途中で、中断かな?
重松
投稿: 重松 宏昌 | 2012年12月12日 (水) 14時08分
ご存知かとは思いますが、LPCXpressoであれば専用IDEでデバックをサポートしており、この記事で書いたようなEclipse + OpenOCDのデバック環境をわざわざ構築する必要はありません。
既にLPCXpresso用IDEを使っておられ、デバックができないということであれば、IDEの設定もしくはドライバあたりが怪しいです。「LPCXpresso + デバック」のキーワードでヒットするサイトを参考にしても解決策が分からない場合、当方も具体的な解決策をご呈示するのは難しいと思います。
投稿: todoani | 2012年12月13日 (木) 19時56分
コメント有難うございます。
了解
投稿: 重松 宏昌 | 2012年12月16日 (日) 11時29分
FM3の開発環境を立ち上げる際にはこのHPの情報はとても参考になりとても助かりました。
さて、プログラムのROM容量が110KB程度のものをデバッグしようとしたら(28KB程度までは問題なかったです)
デバッグコンフィグレーションのコマンドのload実行時に以下の様なエラーになってしまいました。
なにか、問題回避の情報はお持ちではございませんか?
load
Error erasing flash with vFlashErase packet
ちなみにtelnetセッションで flash write_image erase *****.elf では書き込みできていますのでデバグ自体は可能なようですが。
投稿: taka | 2013年10月23日 (水) 10時27分