Mac の場合 AVR Studio を使えないので、いろいろ不便である。しかし一応開発環境がととのった。結構ググったけど、このようにして開発している人は少ないのか、はたまた情報発信しないのか、あまり gdb まで使ってやってる記事がなかった。

CrossPack-AVR のインストール

avr-gcc (AVR 用のクロスコンパイラー) や avrdude (書きこみツール) の Mac 向けにコンパイル済みパッケージ。配ってるのでインストールするだけでいい。

CrossPack for AVR を普通にダウンロードしてインストーラーからインストールするだけ。

普通 OS X の path_helper によって自動的に PATH が通るので、そのまま Terminal.app で avr-gcc が実行できるようになる。path_helper のパーミッションを落として使ってる場合自力で /usr/local/CrossPack-AVR/bin のパスを通す。

これさえ入れておけば実機開発はできる。

simavr の build

まずレポジトリを clone する。

$ git clone git://gitorious.org/simavr/simavr.git
$ cd simavr/simavr

simavr のビルドは CrossPack-AVR + Mac だと1発では通らない。以下のようにパスの指定が必要。あと、なんか変な状態になったりするので make clean と make を何回かやってみたほうがいいと思う。

make all V=1 AVR_ROOT=/usr/local/CrossPack-AVR AVR_INC=/usr/local/CrossPack-AVR/avr


これでシミュレーションまでできるようになった。

avr-project の Makefile 書き換え

CrossPack-AVR に avr-project というコマンドがついてくる。

$ avr-project Foo

とかやると Foo/firmware 以下に Makefile とかを作ってくれる。Foo.xcodeproj というのも作ってくれるけど、ハマりそうなので使ってない。

デバッグオプション付きでコンパイルするようにする。RELEASE=1 をつけない場合デバッグモード。最適化オプション -Os はどっちも付けてるんだけど、ちょっとどうすべきかわからない。デバッグ時 -Os をつけずに書きこむときだけ -Os をつけたらループが意図せず削除されたとき大変ハマりそうだなーと思う。いっそ -O0 のほうがいいのかもしれないけど……

ifeq ($(RELEASE),1)
COMPILE_OPT = -Os
else
COMPILE_OPT = -Os -g3 -gdwarf-2
endif

AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)  
COMPILE = avr-gcc -Wall $(COMPILE_OPT) -DF_CPU=$(CLOCK) -mmcu=$(DEVICE)

でもってターゲットも足す

run:	all
	~/project/simavr/simavr/run_avr -g -mcu $(DEVICE) -freq $(CLOCK) main.hex &
	avr-gdb

さらに .gdbinit ファイルをつくる

file ./main.elf
target remote localhost:1234
load
break main
continue

make run をするとコンパイルされて、simavr をバックグランドで起動し、それにGDB接続する、とりあえず main 関数の最初で止まる (はず)。

自分は avr-project は使っていなくて、自作のテンプレート作成ツールを使っている AVR のテンプレート

実際のデバッグ

普通に GDB を使うだけだけどメモ

  • p foobar
    • 変数を表示
  • p/t PORTB
    • PORTB を2進数で表示
  • p set_bit(PINB, 1)
    • PINB の 1 bit 目を立てる (set_bit は自分で定義したもの)
    • 外部入出力をシミュレーションさせるのは結構骨が折れる感じなので、簡易的には、これで外部入力をシミュレーションできる
    • 外部入出力とかはもうさっさと書きこんでデバッグしたほうがトータルで早いと思う…

実機書き込み

書き込み装置は、ここで変にハマると自分には問題解決できる能力がないところなので、純正の AVR ISP Mark II を使った。

この場合 Makefile の PROGRAMMER は以下のようになる

PROGRAMMER = -c avrispmkII -P usb

DEVICE はチップ名にあわせる。ATTiny2313 なら、そのまま DEVICE = attiny2313 でいける。

AVR ISP Mark II は 3x2 PINヘッダなので、このままだとブレッドボートで使えない。なので 1x6 PINヘッダに適当に変換してる。手元にあったピンヘッダがついてる余ってる平行ケーブルを使った。持ってるブレッドボートが狭くてつらい。

その他メモ

avr-gdb 上での _delay_ms() が非常に遅い。

これはいわゆるビジーループなので、動作周波数を下げることで早くデバッグすることができる。

make run CLOCK=10
  1. トップ
  2. tech
  3. Mac で simavr + avr-gdb を使い AVR プログラムを PC 上でデバッグする
  1. トップ
  2. avr
  3. Mac で simavr + avr-gdb を使い AVR プログラムを PC 上でデバッグする
  1. トップ
  2. arduino
  3. Mac で simavr + avr-gdb を使い AVR プログラムを PC 上でデバッグする
▲ この日のエントリ