ARM用クロス開発環境を作る
出典: Wikimura
CANSATで使うARMマイコンを導入するに当たって、クロス開発環境が必要になりました。開発環境の構築と言えば、とてもいやな経験ばかりが思い出されます。負け越しどころか負けっぱなし...結局誰かの開発したものを使わざるを得ないのが現状です。
「ソフトをネットから拾ってきて、既存の基板のコンフィギュレーションを使って動いた」は開発環境を使い始める第一歩ではありますが...大抵は動きません。これまで、その原因を探すのに苦労させられてきました(三端子レギュレータの~SHDNをLowにして残念賞だったこともありました)。やはり既製品であったとしても、どういう仕組みで動いているのか知ることが、安心して開発できる第一歩だと思いました。
そこで、巷で流行のARM+Eclipse+JTAGがどういう仕組みなのか、どう構築するのかについて調べました。本来なら情報の大本を参照すればよいのですが、現在のところ断片情報のつぎはぎ状態です。どなたか本家本元の情報元を見つけてくださったら、この記事を書き加えてください。
→ARM開発環境構築手順にまとめました。ここのページは原理をまとめるにとどめます。
目次 |
始めに
ARMをEclipseベースで開発し、JTAGで書き込み、デバッグを行うためには以下のものが必要なのだそうです。詳しいことは、参考文献[4][5][6]に書かれています。
- Eclipse
- フリーのIDEであるEclipse。この上に開発環境が構築される。
- Eclipse用CDT(
Cross Development ToolsC/C++ Development Tools)プラグイン - EclipseにC/C++開発環境を追加するプラグイン。GDBと連携したデバッグ機能を実現したり、生成バイナリの設定ができる。現時点でのEclipse最新版Ganymedeでは、は、はじめからZylin(組み込みに使えるCDT)が付いている。
- ツールチェイン
- gcc/ld/gdbなど、ターゲットデバイス用のツールチェイン。CDT上ではCygwin系とかMinGW系とかいう分類がある。
- OpenOCD
- JTAGへの操作をポートから行うことを可能とし、具体的なコネクタによらず同じように操作できるようにしてくれる。JTAG速度やIDの設定などはスクリプトによって行うため、ターゲット毎に設定ファイルが必要となる。
- OpenOCD対応JTAGコネクタ
- ARM-USB-TINY、ARM-USB-ODTなど。
クロス開発環境の仕組み
前述のコンポーネントの役割、連携については[4][6]に詳しく書かれています。
これによれば、効率的なクロス開発環境にはGUIが必須であることから、Eclipseをベースとした開発環境が流行っているそうです。従来のコマンドラインで使用する、make/gcc/ld/gdbといったツールチェインを、GUI経由で操作しようというものです。 GUIとツールチェインの架け橋を担うのが、CDTなのだそうです。
CDTはターゲット毎に必要というわけではなく、1つだけ用意すればよい事になっています。後からターゲットにあわせたツールチェインを割り当てることで、機能を完成させるという仕組みです。というのも、同じツールチェイン(Cygwin系、MinGW系など)でいくつものターゲットに対応しているためです。CDTはメジャーなツールチェインに対応し、自動的にmakefileを作ってくれます。 それ以外のツールチェインに対してはmakefileを自分で作ることになります。
JTAGデバッグの仕組み
クロス開発で気になるのがデバッグの仕組みです。 組み込みに対応したCDTがあれば、デバッグもGUIからコマンドを発行できます。しかし、ターゲットをつなぐ手段は色々あります。 シリアル、Ethernet用なら大丈夫ですが、JTAG用デバッガなど、通信手段毎にデバッガを用意するのは大変なので、デバッガ自体は通信手段に依存しないよう作られているようです。 シリアル通信の場合、ターゲット上でGDBのコマンドに応答するためのプログラムが動いていないといけないらしく、それをGDBスタブと言います。 (確かGDBはシリアルとEthernetから通信手段を選択する設定があったような...)
ターゲットとの通信手段が特殊(PCに元々付いていない通信手段...JTAGなど)な場合は、自身のIP(127.0.0.1)の○○ポートへコマンドを送ります。 パケットで送られるコマンドをデーモンが受け取り、実機とのやり取りをするしくみです。デーモンとは、サーバとかサービスとか呼ばれる、バックグラウンドで動くプログラムのことです。 木村研ではリモートデスクトップで「localhost:port番号」を接続先にすることで、SSHクライアントが「port番号」との通信をSSHでの通信にしてくれていますが、それと同じようです。
JTAGの場合、GDBからのコマンドはJTAG操作に置き換えられ、JTAGコネクタを通してターゲットに送られます。この場合、GDBスタブのようなソフトは必要なく、ターゲット内のJTAGデバッガがそれを担うようです。 そして、JTAGコネクタとつなぐためのデーモンが、OpenOCDです。OpenOCDはいくつかのタイプのJTAGコネクタに対応するために設定が必要で、cfgファイルでそれを行うようになっています。
関連
- ARM開発環境構築手順: ARMでCを開発できる環境を作る手順をまとめました。プログラムの開発手順はまた別途。
- OpenOCDが動くまで: OpenOCDが動くようになるまでの試行錯誤の結果です
- STM32開発習得メモ

