LinuxでAVRのプログラムを作成する(eclipse + avr-plugin)

 Linux上のPICのプログラム開発環境「piklab」を別記事で紹介しましたので、AVRのGUI開発環境(もちろんLinux上で使えるもの)についても簡単に紹介いたします。Linux上のAVR開発ツールは、クロスコンパイル環境としてGCC、ダウンローダとしてAVRDudeがあり、どちらも非常に多くのユーザーに支持されています。しかし、コマンドラインでの操作は私のような初心者にはとっつきにくく、また、GUI環境でのプログラミングという魅力ある要素を楽しむことが出来ません。

 今回は、GUI開発環境の土台としてEclipseを使用して、AVR GCCのプログラミング環境をインストールしてみたいと思います。


使用するソフトウェアについて

 ここでは、以下のソフトウェアをLinux(使用しているのはFedora12)にインストールして、AVRのソフトウェア開発環境を作っています。

  • AVR GCC
  •  AVR GCCは、GNU C CompilerによるAVRのクロス開発環境です。名称はCコンパイラですが、アセンブラのソースファイルを直接コンパイルすることもできます。内部的には、C言語のソースをアセンブリ言語(GNU Assembler)のソースに変換してアセンブルし、リンカにより結合させています。おおまかな、コンパイラ等ツールと入力ファイル、生成ファイルの関係図を下記に示します。


    AVR GCC ツールチェイン概念図 (AVR Freaksより)

    AVR GCC toolchainについては、
    AVR GCC/AVR GCC Tool Collection (AVR Freaks)
    AVR LIBCの詳細については、
    AVR LIBC User's Manual (http://www.nongnu.org/avr-libc/user-manual/)
    などを参照してください。

  • AVRDude
  •  AVRDudeは、オープンソースのAVRマイコン用ダウンロード・ツールです。コマンドラインで動作しますが、GUI対応したものが色々とあるようです。今回は、EclipseからバイナリをターゲットのAVRにダウンロードするために使用します。

    AVRDudeのホームページは → こちら: http://savannah.nongnu.org/projects/avrdude/

     AVRDude以外にも様々な書き込みツールが存在しますが、AVR Eclipseで対応しているのは今のところAVRDudeだけのようです。


  • Eclipse
  •  Eclipseは、オープンソースの統合開発環境です。単体でもJavaプロジェクトの優れた開発環境ですが、多くのプラグインが開発・提供されており、C/C++をはじめ、様々な言語、プラットフォームに対応したプログラム作成が可能です。もはや、GCCなみに説明不要かもしれませんね。ここでは、AVR Eclipse Pluginというプラグインを使うことで、AVRのプログラム開発を行います。

     Eclipseのホームページはこちら:http://www.eclipse.org/


  • AVR Eclipse Plugin
  •  AVR Eclipse Pluginは、Eclipse上でAVRマイコンのクロス開発を行うためのオープンソースのプラグインです。下記で紹介する様に、Eclipse本体から機能追加によって簡単にインストールできます。最大の利点は、Eclipseの機能を存分に利用することができることです。今回は、単純なプログラミングのみの紹介しかできませんが、それでも自分でMakefileを書くことなくビルド環境ができてしまうのは、ありがたい限りです。

    AVR Eclipse Pluginのホームページは こちら: The AVR Eclipse Plugin

AVR GCC, AVRDudeのインストール

 AVR関連のGCCコンパイラ・ツール一式とダウンロード・ツールAVRDudeを、Linuxデスクトップから「ソフトウェアの追加」によりインストールします。今回導入したパッケージは下記の通り。

  • avr-binutils-2.20-2.fc12
  • avr-gcc-4.4.2-2.fc12
  • avr-gdb-6.6-11.fc12
  • avr-libc-1.6.7-2.fc12
  • avra-1.2.3-4.fc12
  • avrdude-5.10-1.fc12

 ちなみに、これだけ(+テキスト・エディタ)で、あとはビルド、ダウンロード用のスクリプトやmakefileを整えるだけで、コマンドラインからAVRの開発環境は出来上がってしまいます。

AVR GCCの動作確認

 AVR GCCを用いて、C言語ソースが正しくコンパイルできることを確認します。簡単なソースを用意して(ここでは、ポートBに8ビットの出力をくり返すもの)、コンパイルしてみます。以下、動作例です。avr-gccでコンパイル、リンクしてELF形式のバイナリを生成し、avr-objcopyによりHEXファイルを作成、その後、確認のため、avr-objdumpで逆アセンブル出力をしているところです。 (AVRDudeの動作確認は、ターゲット準備のところで説明します。)

動作確認用ソースコード (avrgcctest.c)

動作確認例
$ avr-gcc -O2 -Os -mmcu=attiny2313 -o avrgcctest.elf avrgcctest.c
$ avr-objcopy -R .eeprom -O ihex avrgcctest.elf avrgcctest.hex 
$ cat avrgcctest.hex 
:1000000012C02AC029C028C027C026C025C024C0CD
:1000100023C022C021C020C01FC01EC01DC01CC0E4
:100020001BC01AC019C011241FBECFEDCDBF10E0F8
:10003000A0E6B0E0EAE6F0E002C005900D92A0363E
:10004000B107D9F710E0A0E6B0E001C01D92A036DC
:10005000B107E1F702D007C0D3CF8FEF87BB80E0B5
:0A0060008F5F88BBFDCFF894FFCF3F
:00000001FF

$ avr-objdump -d avrgcctest.elf

avrgcctest.elf:     file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
   0:	12 c0       	rjmp	.+36     	; 0x26 <__ctors_end>
   2:	2a c0       	rjmp	.+84     	; 0x58 <__bad_interrupt>
   4:	29 c0       	rjmp	.+82     	; 0x58 <__bad_interrupt>
   6:	28 c0       	rjmp	.+80     	; 0x58 <__bad_interrupt>
-----------------------------------------------------------
	 (以下略)
 単一ファイルのコンパイルであれば、上記のコマンド(avr-gccとavr-objcopy)でできてしまいます。

 コマンドラインで開発を行う場合は、makefileを作成してmakeで管理するのが一般的です。しかし、makeのリファレンスをみてイチから勉強するよりも、今はとりあえずAVRマイコンを動かしたい、という(私のような)せっかちには、意外に大きなハードルだったりします。でも大丈夫。ここでは、makeの役割をEclipseにやってもらいましょう。


Eclipseのインストール

 私が普段使用してるFedora 12では、リポジトリにあるEclipseパッケージを導入するだけで、Eclipseに関する基本的な設定(つまり、Java, C/C++のPC向け開発環境)は完了しました。他のディストリビューションでは状況が異なるかもしれませんが、Eclipse 本体とEclipse CDT(C/C++開発環境)があれば大丈夫と思います(執筆時点で未確認)。Javaも、デフォルト設定のOpenJDKのままで、Sun Javaには切り替えずに使っています。

 EclipseやCDTについての詳細は、インストール方法をはじめ、多くの参考資料や文献が豊富にありますので、ここでは詳細を割愛させてください。

 リポジトリから導入したEclipse本体は

  • eclipse-platform-1:3.5.1-22.fc12 (Galileo / 3.5.1)
でした。

 Eclipseを起動して、workspaceを指定します。私は、workspaceというフォルダをすでに別用途でつくっていたので、eclipse_workspaceに変更しましたが、特に変更する必要はありません。

 さて、ちょっと、Eclisep CDT の動作確認をしてみましょうか。開発環境をセットアップしたら、Hello, worldをビルドするのは、お約束というか、通過儀礼ですね。脱線のようですが、Eclipse + GCCが正しく動作していることを確認するのは重要です。Hello, worldの作成はプロジェクト作成ウィザードのみで簡単にできてしまいます。

  1. Eclipseを起動して、[Window] → [Open perspective] → [Other...] → [C/C++]を選択
  2. [File] → [New] → [C Project] でプロジェクト作成ウィザードを起動
  3. 下記の項目を入力、または選択します。

    [Project Name]: Hello
    [Project type]: [Executable] → [Hello World ANSI C Project]
    [Toolchains]: Linux GCC Linux GCC
  4. [Next] → [Finish] でプロジェクト完成です。
とても簡単ですね。


Eclipse C/C++ "Hello world"プロジェクト(クリックで拡大)


 以上は、ツールチェインとしてPC Linux用のGCCを使用したプログラミングです。この環境にツールチェインとしてAVR-GCCを追加するのが、AVR Eclipse Pluginです。

AVR Eclipse プラグインのインストール

 AVR Eclipse Plugin のホームページにあるインストール方法にしたがい、Eclipseの機能追加を利用してインストールします。以下、Eclipse 3.5 (Galileo)での操作になります。他バージョンでは、少々メニューやダイアログの名称が異なるかもしれません。

  1. 機能追加ダイアログ
  2.  Eclipseのメニューから、[Help] → [Install New Software]で機能追加の[Install]ダイアログを開きます。

  3. Download siteを追加
  4.  [Work with]の横にある[Add...]ボタンから、ダウンロードするサイトとしてAVR Eclipse Pluginのアップデート・サイトを追加します。

    (注:執筆時点では、AVR Eclipse PluginのページにはGalileo (Eclipse 3.5系)での手順説明がありませんでした。が、Upadte siteとして、3.4, 3.3ともに同じURL( http://avr-eclipse.sourceforge.net/updatesite/ )を入力すると、自動的に認識してインストールできます。)



    Eclipse 機能追加インストール


  5. AVR Eclipse Pluginを選択
  6.  [CDT Optional Features]の下にある[AVR Eclipse Plugin]を選択して、画面指示にしたがいインストールします。完了後、Eclipseを再起動。



    Eclipse AVR Plugin をインストールする


  7. 再起動して確認
  8.  再起動後、パースペクティブをC/C++にすると、AVR関連のメニューアイテムやボタンが追加されています。



    Eclipse AVR Plugin の追加ボタンとメニュー


 以上でインストールは完了。なお、インストールしたAVR Eclipse Pluginのバージョンは"2.3.4.20100807PRD"でした。では、以下、ターゲットを用意して、プロジェクトを作ってみます。

ターゲットの準備

プログラマ

 今回使用しているプログラマは、Olimex AVR-ISP500です。
 参考ページ: Olimex AVR-ISP500 (http://www.olimex.com/dev/avr-isp500.html)



Olimex AVR-ISP500
ISP(シリアル・プログラミング)のみ可能ですが、USBに直結でき、USBシリアルポートとして認識するので、特殊なドライバも必要ありません。AVRStudioや、AVRDudeでは、"STK500 version2 firmwawre"として認識します。


AVR-ISP500: ICSP6コネクタ
ISP信号が2x5、および2x3のコネクタで利用できます。今回は2x3を使用。標準的なSPI信号、ターゲット電源、リセット端子を接続します。(ターゲット回路図参照)


ターゲット

 ターゲットとして用意したものは、ATtiny2313とLEDをブレッドボードに配線したものです。



ターゲット基板 回路図概要
 LED 8個をPort Bに、LED 2個をPort Dに接続し、ISP端子を引き出しているだけです。クロックは内蔵RC、電源は乾電池 x2本です(回路図中では3.3V)。

 ATtiny2313の詳細やデータシートなどについては、こちら → Atmel ATtiny2313のページ (http://www.atmel.com/dyn/products/product_card.asp?part_id=3229)



ターゲット外観

ブレッドボードへのISP書き込み用に、簡単な変換コネクタを作成しています。


ブレッドボード用コネクタ

AVRDudeの動作チェック

 AVR Eclipse Pluginは、EclipseからAVRDudeを呼び出してターゲットと通信をします。 まず、コマンドライン上でAVRDudeをきちんと単体で使えるかどうか確認しておきましょう。

 以下は、olimex AVR-ISP500での私の環境での確認例です。ターゲットの接続確認をした後、AVR GCCの確認で作成したHEXファイルを書き込んでいます。(お使いのプログラマ、PC環境にあわせて、各オプションを変更する必要があります。)

プログラマ (オプション -c) "stk500v2" (STK500 version2互換)
ポート (オプション -P) "/dev/ttyACM0" (ls /dev/ttyACM* で確認)
ターゲット・デバイス (オプション -p) "t2313" (ATtiny2313)


$ ls -l /dev/ttyACM*
crw-rw----. 1 root dialout 166, 0 2010-09-03 08:58 /dev/ttyACM0

$ avrdude -c stk500v2 -P /dev/ttyACM0 -p t2313

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x1e910a

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

$ avr-gcc -O2 -Os -mmcu=attiny2313 -o avrgcctest.elf avrgcctest.c
$ avr-objcopy -R .eeprom -O ihex avrgcctest.elf avrgcctest.hex 
$ avrdude -p t2313 -c stk500v2 -P /dev/ttyACM0 -U flash:w:avrgcctest.hex:a

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x1e910a
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "avrgcctest.hex"
avrdude: input file avrgcctest.hex auto detected as Intel Hex
avrdude: writing flash (106 bytes):

Writing | ################################################## | 100% 0.37s

avrdude: 106 bytes of flash written
avrdude: verifying flash memory against avrgcctest.hex:
avrdude: load data flash data from input file avrgcctest.hex:
avrdude: input file avrgcctest.hex auto detected as Intel Hex
avrdude: input file avrgcctest.hex contains 106 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.31s

avrdude: verifying ...
avrdude: 106 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

$ 

 なお、プログラマのオプション、デバイスのオプションに指定する文字列の一覧は、各オプションに適当な(ありえなさそうな)文字列を指定すると表示されます。(例:"avrdude -p hogehoge", "avrdude -p stk500v2 -c hogehoge")

注意:
 AVRDudeからAVR-ISP500へは、USB CDCシリアルポート(/dev/ttyACM*)で接続するため、デバイス・ファイルへアクセスします。 AVR-ISP500ほか、USBシリアルポート経由で通信するプログラマでは、/dev/ttyACM*への書き込みアクセス権が必要になります。 必要に応じて、自分のアカウントにグループ(Fedora12の環境では、group = "dialout"でした)を追加してください。

AVRのプロジェクト作成

 さて、以上ですべての準備が整いました。いよいよEclipse上でプロジェクトを作成していきます。

新規プロジェクト(AVR-GCCツールチェイン)の作成

  1. 新規C Projectを作成
  2.  Eclipse(C/C++ パースペクティブ)のメニューから、[File] → [New] → [C Project]で、プロジェクト作成ウィザードを起動します。

  3. AVR GCCツールチェインの選択
  4.  [Project type]のなかから、[AVR Cross Target Application] → [Empty Project]を選択します。[Toolchains]は、[AVR-GCC Toolchain]となります。


    AVR Eclipse Cプロジェクト作成 (1)

     [Project name]に、作成するプロジェクト名を入力して、[Next]をクリック。コンフィギュレーションとして、DebugビルドとReleaseビルドが設定されます。確認して、[Next]をクリック。

  5. ターゲット・デバイスの設定
  6.  つづいて、ターゲットのデバイスを選択します。
    [MCU Type]に、チップ名を(ここでは、[ATtiny2313])、[MCU Frequency(Hz)]には、動作クロック周波数を(ここでは、[1000000] = 1MHz、出荷時設定:「内蔵RC発振器8MHzを8分周したもの」)選択します。[Finish]をクリックすると、プロジェクトが作成されます。


    AVR Eclipse Cプロジェクト作成 (2)

ソースファイル作成

  1. ソースファイルの追加
  2.  画面左の[Project Exploler]で、新規作成したプロジェクトを選択した状態にします。そして、メニューから、[File] → [New] → [Source File]を選択して、ソースファイルを追加します。なお、C言語ソースの場合は、拡張子を".c"に、アセンブラ・ソースの場合は"*.S"にしておく必要があります。


    AVR Eclipse Cソースファイル作成(1)

  3. ソースコードを書く
  4.  ソースファイルを開いて、コードを書いていきます。Eclipseの支援機能が使えるので、非常に快適です。ここでは、タイマー割込みを使用した簡単なLED点滅プログラムを作成しています。


    AVR Eclipse Cソースファイル作成(2)

    LED点滅:ソースコード

プロジェクトの設定

  1. AVRプログラマの設定
  2. Eclipseから、[Project] → [Properties] で設定ダイアログを開き、左側のResourceから、[AVR] → [AVRDude] → [Programmer]を選択します。最初は、プログラマが無い状態ですので、[New]ボタンにより設定を作成します。


    AVR Eclipse : AVRDude設定

  3. AVR-ISP500用の設定を作成
  4.  olimex AVR-ISP500を、Eclipseで使用するプログラマとして設定するため、下記の内容を入力します。お使いの環境にあわせてください。



    Eclipse: AVRDude: AVR-ISP500の設定

    Configuration name: プログラマの設定名称。後で区別できるように、わかりやすい名前をつける。
    Description: 設定の説明。後で区別できるように簡潔なコメントをいれておく。
    Programmer Hardware (-c): 使用するプログラマを選択する
    Override default port (-P): プログラマが接続されているポート:例:/dev/ttyACM0

     一度、設定ファイルを作っておけば、次回から新規プロジェクトを作成する際に、選択できるようになります。複数のプログラマを使い分ける場合は、それぞれの設定ファイルを作っておきます。

ビルドの選択と設定

  1. ビルドを選択
  2.  DebugとReleaseのうちのどちらかをビルド対象として選択します。メニューから[Project] → [Build Configurations] → [Set Active]で[Debug]か[Release]を選択します。

     このままビルドすると、Debugビルドの場合はデフォルト設定では最終生成ファイルがELFまでとなっているので、ダウンロード用のHEXファイルが出力されません。また、Releaseビルドでは、フラッシュメモリとEEPROMのHEXファイルを両方とも生成するようになっていますが、EEPROMへの書き込みが必要のないプロジェクトでは変更が必要です。

  3. ビルド設定の変更
  4.  設定を変更するビルドを選択します(ここでは、Debugビルドの変更を例にあげていますが、Releaseビルドでも同様です)。メニューから、[Project] → [Properties]で設定ダイアログを開き、左側の[Resource]から[C/C++ Build] → [Settings]を選択します。右側の[Configuration]が"Debug [Active]"になっていることを確認して、[Tool settings]タブ内の[Additional Tools in Toolchain]を選択すると、HEXファイル生成の設定ができます。

     必要なHEXファイルのみ出力するように変更します。



    AVR Eclipse: HEXファイル出力設定の変更

     必要に応じて、コンパイラオプションを変更します。設定ダイアログの[Resource]内から[AVR Compiler]を選択すると、avr-gcc のコンパイル用オプションを設定することができます。ここでは、サイズを小さくするために最適化オプション(-O2 -Os)を変更しています。他のツール(アセンブラ、リンカ、avr-objcopyなど)のオプションも同様に変更できます。



    AVR Eclipse: 最適化オプションの変更

プログラムの作成と実行

  1. ビルド
  2.  ソースコードを保存したら、メニューから、[Project] → [Build Projecct]でビルドします。

  3. ダウンロード、実行
  4.  エラーなくビルドが完了したら、ダウンロードボタン、またはメニューの[AVR] → [Upload Project to Target Device]でターゲットにHEXファイルをダウンロードします。



 以上で、完了です。あとは、テスト、デバッグを繰り返して完成です。

補足

ヒューズ・ビット書き換え機能について

 AVRDudeでのヒューズビットの設定は、直接hex値をコマンドラインのオプションで指定しなければなりません。もし間違った設定をしてしまうとターゲット・デバイスが異常動作したり、最悪の場合、使用不能にしてしまう可能性があるため、非常に神経を使います。AVR Eclipse Pluginの機能を使うと、ヒューズビットの設定が非常に簡単に行うことができます。

  1. Fuse書き込み機能をONにする
  2.  ターゲットにビルドしたバイナリを書き込みできる状態にしておいて、[Project] → [Properties]のダイアログから、[AVR] → [AVRDude]を選択して、[Fuses]タブを開きます。[Upload Fuse Bytes]の[direct hex values]をONにします。



  3. ターゲットからFuse設定値を読み出す
  4.  [Load from MCU]ボタンを押して、現在のFuseの設定値を読み出します。



  5. Fuseエディタで設定を変更する
  6.  [Start Editor]でFuseエディタを起動します。



  7. ターゲットに新しいFuse設定を書き込む
  8.  読み出したFuse設定がエディタに表示されます。新しい設定にあわせて、必要なビットを変更します。うっかり設定を間違えると、ISPでプログラムできなくなったり、ターゲットを故障させたりする場合がありますので、慎重に行ってください。



     ためしに、動作クロックを分周なしの8MHzに変更してみます。CKDIV8ヒューズ・ビットを"Yes" → "No"にします。



     設定を完了したら、Fuseエディタ、および設定ダイアログを[OK]で閉じて、ダウンロードを行います。ダウンロードと同時にヒューズ・ビットが更新され、新しい設定が有効になります。ここでは、動作クロックを「8MHz、1/8に分周(= 1MHz)」から「8MHz、分周なし (= 8MHz)」に切り換えたので、LEDの点滅速度が早くなりました。

  9. Fuse書き込み機能をOFFにする
  10.  ヒューズビットの変更が終わったら、設定ダイアログで変更機能をOFFにしておきます。



ヘルプファイルについて

 AVR Eclipse pluginには、とても丁寧なヘルプファイルがついてきます。Eclipseのメニューから、[Help] → [Help Contents]でヘルプ画面を開くと、"AVR Plugin"という章が追加されているのが分かります。なかでも、"Getting Started"には、プロジェクト開始のために必要な設定方法などが簡潔にかかれているスグレモノです。

参考リンク

  • AVR Libc マニュアルより
  •  avr-gccを使って割込み処理を記述する場合のマニュアル(avr-libc)
    Intrrupts (http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html)

  • avr wikiの「タイマ・カウンタ0の使い方」
  •  GCCでタイマー0を使用した割込み処理を記述する際に、参考にさせていただきました。「タイマ・カウンタ0の使い方」にある「割込みで使う」例のソースの大枠を、ほぼそのまま使わせていただきました。タイマー、割込み以外にも、GCCでの割込みの記述の仕方やアセンブラでの書き方など、参考になる資料、ソースコードが多数あります。
    Getting Started Notes - Timer0

あとがき

 Arduinoの登場以来、また少しずつAVRマイコンの人気が出てきたような気がします。私も、ArduinoでAVRマイコンをはじめたのですが、最近のオープンソースのツール類は非常にユーザー・フレンドリーにできていると思います。今回、AVR Eclipse Pluginを使用することで、生のAVRマイコン開発においても、Arduino IDE 並に、お手軽なプログラミング環境が出来上がったと思います。

 AVR Eclipseのインストールと動作確認を長々と書いてきましたが、実際にやってみると、非常に簡単にできますので、GUI開発環境を使ってみたいAVRマイコン開発者にはおすすめです。  記事中では、デバッグ機能がないAVR-ISP500というプログラマを使用したため、Eclipse, GDBによるデバッグ支援機能については試すことができませんでした。機会があれば、デバッグについても試してみたいと思います。

 いつもながら、無料のツールのみで素晴らしい環境を構築できるのは、優れた先輩諸氏の功績と、多数のユーザーに支援された、たゆまない改良の成果ですね。感謝の意を表して、今回の記事の終わりとしたいと思います。多謝。



表紙に戻る