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