LinuxでAVRの開発環境を構築する

AT90USB162でLED点滅


先日、ひょんなことから、ストロベリーリナックスAT90USB162を使った基盤を売っている事に気付きました。

AT90USB162はAtmel社のAVRシリーズのマイコンの一つです。フルスピード対応のUSBデバイスコントローラを内臓していますので、マイコンにプログラムを書き込むことで、任意のUSBデバイスとして動作させることができます。また、16Kの内臓ROMのうち、保護されている4Kには初めから、USB接続で動く自己書き換えのプログラマが入っていますので、USBケーブル一本で、基板への給電もプログラムの送り込みもできてしまいます。

ストロベリーリナックスで売っているのは、このAT90USB162の石に、USBデバイスとして動作するための最低限の周辺回路を付け、汎用IOはすべて自由に使えるよう引き出してあるという、90USB評価基盤のリファレンス実装と言えそうな商品です。開発に必要なソフトウェアは付属していませんが、Windowsで動作する開発環境一式はAtmelのWebサイトで、フリーで公開されていますので問題ありません。

……そう、Windows版のソフトはAtmelが配っています。Linux版はありません。

というわけで、本日のエントリは、そんな不遇のLinux環境でAVR開発をするのに使えるツール群をご紹介します。

なお、ここでは、ハードウェアはストロベリーリナックスのAT90USB162基盤、LinuxUbuntuを前提に紹介しますが、基本的にどのAVRチップでも、どのLinuxディストリビューションでも流用の効く内容のはずです。

Linuxでの開発に使えるソフトウェア

初めに言いますが、いわゆる「統合開発環境」的なものはありません。そういったものが欲しい人は素直にWindowsで開発していた方が幸せでしょう。Linuxでやろうと思う人は「エディタは自分の好きなものを使わせろ!」とか「GUIだといちいちマウスに持ち替えなきゃあかんやろ。CUIでやらせろ!」とか言い出すような人です。

GCC

Linuxでプログラムを書く人にはお馴染みのコンパイラgccです。C言語で書いたプログラムのソースコードを実行可能バイナリに変換してくれます。

ただし、普通のパソコン(Intel x86系CPU)用にコンパイルされたgccではAVR用のコードは出力できませんので、AVRのコードが出力できるようにconfigureされたgccを別途インストールする必要があります。

また、単にgccといった場合は、純粋なコンパイラ部分だけを指すわけですが、実際に使う場合には、実行可能バイナリを操作するための各種ツール(asとかobjcopyなど)を集めた binutils のAVR版や、AVRのレジスタ定義やCの標準ライブラリ関数などを実装している avr-libc も同時にインストールする必要があるでしょう。

Ubuntuのパッケージ名 説明
gcc-avr avr用GCC(インストールされるコマンド名は"avr-gcc"と語順が違うので注意)
binutils-avr avr-as, avr-objcopy などコンパイラの裏で使われるツール群
avr-libc 標準Cライブラリ。ヘッダなど(レジスタ定義なども含まれているので実質必須)
SDCC

small device c compiler。文字通り、小型のデバイス向けのCコンパイラ。AVRだけでなく、PICやZ80などにも対応しているので、そちらの方面から知っている人は多いかもしれませんね。ただ、せっかくAVR使ってるなら、普通のコンパイラであるgccを使いたいよね、ってことで、私はSDCCは試していません。

Ubuntuのパッケージ名 説明
sdcc* 「sdccなんちゃら」という名前でたくさんパッケージがある。(前述のとおり使ってないので詳細不明)
AVRA

AVRAは、AVR用のアセンブラです。アセンブリ言語の仕様が、Atmel社謹製のアセンブラと互換になっています。

binutils に avr-as が入っていますので単にアセンブラを使いたいだけならそちらで良いのですが、avr-asはGNU流儀のアセンブリ言語なので、Atmel謹製アセンブラ向けに書かれたソースを扱うことはできません。誰かが公開しているソースを拾ってきて使う場合にはこのアセンブラが必要になることもあるでしょう。

ただし、1200.incなどのレジスタ定義の書かれたヘッダは同梱されていませんので、自分でなんとかする必要があります。

Ubuntuのパッケージ名 説明
avra ATMEL謹製アセンブラの互換品。若干機能拡張あり
DFU Programmer

AT90USB162は前述の通りUSB接続することでプログラムを書き込むことができるわけですが、その書き込みに使うプログラムが dfu-programmer です。

ちなみに、 DFUは Device Firmware Update の略で、 usb.org できちんと規格化(仕様書はこちら http://www.usb.org/developers/devclass_docs/DFU_1.1.pdf )されている仕様の名前です。AT90USBもこの規格にのっとったデバイス……のように一見すると見えるのですが、実は微妙に違っていて、汎用のDFUローダーでは書き込みができません。dfu-programmer はこれに対応するための細工が入った、Atmelチップ専用ツールです。汎用のDFUローダーは dfu-util という名前で別に存在していたりします。

Ubuntuのパッケージ名 説明
dfu-programmer AT90USBシリーズ用書き込みソフト
Avrdude

Avrdude は、Atmel謹製のJTAG ICEから、どこかの誰かが自作した怪しいプログラマにいたるまで、幅広いプログラマに対応した書き込みソフトです。日本で趣味でAVRを触っている人は大抵 ELM の ChaN さんの作ったプログラマを持っているかとおもいます(←偏見?)が、Avrdudeはちょっと設定をするだけで、それにも対応できます。

AT90USBを使う限りは上記のdfu-programmerだけで良いのですが、他の普通のAVRチップを使う場合は、基板上にISP端子をつけて、なんらかのISPプログラマを準備したうえで、avrdudeで書き込むことになるでしょう。

ストロベリーLinuxのAT90USB162ボードにもISP端子が付いているので、DFU経由ではできないこと(たとえば内臓16KのROMをすべて使う、など)をしたい場合には、これを使うことで実現できます。

Ubuntuのパッケージ名 説明
avrdude AVR用書き込みソフト
avrdude-doc そのドキュメント
gdb

gdbは、gccと並ぶGNUツールで、一般にはデバッガと呼ばれるプログラムです。

普通のPC用のアプリケーションをデバッグする場合には、gccなどでコンパイルしたプログラムを、gdb上で実行させることで、ブレイクポイントをしかけてプログラムを途中で停止させたり、ステップ実行させたり、実行中の変数の値を監視したりできます。ところが、avr用プログラムの場合、PCの上で実行することはできないので、gdb単体で使うことはできません。

では、どうするかというと、選択肢は2つあります。1つ目は、シミュレータと組み合わせる方法です。シミュレータでAVRのプログラムを動作させつつ、avr-gdb をそのシミュレータに接続させてやれば、あとは普通にgdbが動作します。ただし、この用途に使える simulavr は対応しているチップの種類が少なく、また、周辺回路のエミュレーションをしてくれる訳でもないので、あまり多くは期待できません。

もう一つの選択肢は、実際のAVRに接続して使う方法です。AVR は JTAG ICE によるデバッグに対応していますので、 Atmel社のJTAG ICE (や、その互換JTAG ICE)を持っていれば、それを使って、PCとAVRをつないで本物の回路上でデバッグすることもできます。この場合、動作速度が変わってしまうなど、多少欠点はあるものの、覚えて損は無いテクニックです。

とはいえ、私はどちらも試したことないんですけどね(笑)

Ubuntuのパッケージ名 説明
gdb-avr デバッガ。ただし、これ単体ではコード実行はできないので以下のいずれかが必要
simulavr AVRのシミュレータ。対応チップは少ない。
avarice Atmel の JTAG ICE を使ってデバッグする際に、ICEとgdbをブリッジしてくれる。

今日はここまで

と、手元で書き溜めていたらずいぶんな量になってしまったので、今回はここまで。

Linuxで普通にAVR開発を行うのに必要なプログラムは大体列挙したので、あとはこれを組み合わせれば大抵事足りるでしょう。

一応、後日、このエントリの続きとして、これらのツールを使って実際に簡単なプログラムを動かすまでの作業の流れを紹介する予定です。(が、いつ書くかは未定です) (2010-05-07 追記: 続きを書きました → LinuxでAVR開発 (ビルド編) - 玉虫色に染まれ! )