OpenOCD小ネタ13 -ビルド環境のアップデートとWindows8.x一部対応-

20150106追:
現在おきぱにあるopenOCDバイナリはWindows8系にも完全対応してます。
20150106追:



OpenOCD等のWindows版バイナリをビルドする際は、私はMsys/MinGWを使用し、
GCCのバージョンは4.7.3でずっと使用してきておりました。
しかしこれからのツールの趨勢に備え、相変わらずの重い腰を上げてビルド
環境のアップデートを試みました。

●msys-coreのアップデート
yamidori98氏のレポートによるとパラレルでmakeした時(-j2とかの
スイッチかました時)にハングする可能性が指摘されていてパッチを当てた
msys-1.0.dllに差し替える必要があるそうです。OpenOCDをビルドする際は最後の
makeが並列化してますのでこれは適用すべきかと思います。
(64bit版Win7ではまだハングに遭遇してませんが)

ビルドに関してはコマンド一発でdllその他諸々をアーカイブしてくれるスクリプト
ファイルが提供されていたので非常に助かりました。ありがとうございます。

●makeを3.82に
同じくレポートを参考に現状最新v3.82のmakeをmakeしました。
そうだね駄洒落だね。こちらもスクリプトファイルを用意してくれていたので
ありがたく利用させていただきました。


●GCCをアップデート

最初に述べたとおり、従来よりrubenvbさん所の個人ビルドのGCC4.7.3
使用していました。実はGCC4.8系に上げてビルドすることを過去に何度か
試してみたことがあったのですが、libgcc_s_sjlj-1.dllが無いとか
InterlockedCompareExchange@12が見つかりませんだとかそういうエラーに
阻まれてとりあえず動くの優先!ということでそれらのエラーが出ない
4.7.3を使ってきた次第です。

これらのエラーはバージョンが上がる際の一時的なものだろうとスルーして
いましたがアップデートを考えていた4.9.2でも同じようにlibgcc_s_sjlj-1.dllが
無い問題が発生したので仕方なくいろいろ調べているとlibstdcとlibgccを
明示的にスタティックリンクにしてやればdllを求められることがなくなる
ことがわかりました。
libusbでいうとCFLAGS,CPPFLAGS,CXXFLAGSに"-static-libgcc -static-libstdc++"
を付与すれば終わりです("-static"は特に付けなくても大丈夫でした)

しかしそれだけではうまくいかなくて得られたlibusb-1.0.dllを差し替えると
今度はlibftdi1.dllでInterlockedCompareExchange@12が見つからないと
エラーを吐いてきました!
こちらに関してはdllとそれ呼び出すexeが異なるバージョンのGCCでビルド
されていた場合に発生することがわかりEXEもDLLも全て同じGCC4.9.2で
ビルドするようにして解決しました。
最終的にOpenOCDをはじめとしてUrJTAG,vsprog,Flashrom,avrdude
GCC4.9.2版のビルドで安定して動作せしめられるようになりました♥


●Windows8でSTLink/V2-1がOpenOCDから繋がらないこともなくはない
環境がGCC4.9.2化出来たので、今度は使用するユーザーが増えて多数報告を
戴くようになった"Windows8.x系でSTLink/V2-1が載ったNucleo板がOpenOCD
から繋がらない問題"に漸くまともに取り組みました。

といっても私はWin8機を所持しておらず副業先のPCたちも全部Windows7機
だったので、不具合を再現させるための環境が全くなく問題の切り分けも
困難を極めておりました。で、唯一Windows8.1を所持している知り合いの方に
頼んで3〜4日オーダーのフィードバック速度でああでもないこうでもないを
繰り返し、ついにlibusb-1.0をビルドするときに当てているAsmedia対策
パッチが原因だったことを突き止めました!またAsmediaか!!

最初にAsmedia対策パッチを検証した際にXPと64bit版Win7では全く問題
ないことを確認していたのですがWin8ではUSBデバイスの取り扱いもさらに
厳しくなった(?)ことからパッチを適用した部分が仇になってデバイスを
Open出来なくなっていたようです。
幸いにも2014年11月現在は別の切り口でAsmedia対策のパッチが提供
されていてそちらのパッチに変更してビルドしたlibusb-1.0.dllでは
Windows8でもばっちり動作しました♥長かった…

というわけでWindows8.1系OSでもOpenOCDが利用できるとっかかりが出来ました。
現在Win8環境下で私が動作保証できる組み合わせは以下のデバッガ
アダプタです。
1:STLink/V2-1(Nucleo板,STM32F053Discovery)
2:STLink/V2(Discovery系板たくさん)

何れもSTマイクロ配布の公式ドライバ(WinUSB)を適用したものです。

もしあなたの環境で上記の場合でもうまくいかない場合、Zadigを使用し以下の
手順でSTLink/V2-1のUSB複合デバイスの親("composite parent") に無理やり
WinUSBを適用して単独の”STLink/V2”として使用する荒業もあります。
ただしこれをやると仮想COMやmbedのマスストレージ書き込みが一切使用
できなくなりますのでご了承ください。

とりあえず通常のドライバを適用した後Zadigを起動し、
"List All Devices"にチェック入れる、
"Ignore Hubs or Composite Parents"のチェック外す

すると"STM32 STLink (Composite Parent)"が現れるのでこれをWinUSBに
置き換える

入れ替えの際に間違えて違うデバイスにWinUSBを適用してしまうと復帰
できなくなる危険性がありますので細心の注意を払って作業してください。

Go to top of page