AVRシミュレータ

OSXで、AVRがらみのツールはCrossPackで導入済み。

simavr

simavrをOSXで試したメモ。

git clone git://gitorious.org/simavr/simavr.git
brew install libelf

Makefile.commonを修正

AVR_ROOT        := "/usr/local/CrossPack-AVR/"
make
./simavr/run_avr tests/atmega88_example.axf
AVR_MMCU_TAG_VCD_TRACE 00c6:00 - UDR0
AVR_MMCU_TAG_VCD_TRACE 00c0:20 - UDRE0
Loaded 1780 .text
Loaded 114 .data
Loaded 4 .eeprom
avr_make_mcu_by_name: AVR 'atmega88' not known
./simavr/run_avr: AVR 'atmega88' not known

ふむ。make clean;make all したら

CONF obj-x86_64-apple-darwin12.3.0/cores.deps
WARNING cores/sim_90usb162.c did not compile, check your avr-gcc toolchain

とか出てる。さらにMakefile.common を修正。

AVR_INC         := ${AVR_ROOT}/avr/

さっきのWarningは出なくなったけど相変わらず

./simavr/run_avr: AVR 'atmega88' not known

だ。自動生成されるらしいsimavr/sim_core_decl.hがサポートコアなしという設定にしちゃってるようだ。うーん。sim_avr/Makefileでsim_core_decl.hを作ってる部分を下記のように修正。

#		decl+="#if CONFIG_$$upper\nextern avr_kind_t $$global;\n#endif\n"; \
#		array+="#if CONFIG_$$upper\n\t&$$global,\n#endif\n"; \
		decl+="extern avr_kind_t $$global;\n"; \
		array+="&$$global,\n"; \

強引だがこれでテストが通った。

レジスタやIOの指定をコード上で行えばVCDでダンプできるのか。対応ペリフェラルはここに書いてある。外部装置とかもコードを書けばできるかんじか。

まずVCDダンプ。

#include "avr_mcu_section.h"
AVR_MCU(F_CPU, "atmega88");

_trace_t _mytrace[]  _MMCU_ = {
        { AVR_MCU_VCD_SYMBOL("tick"), .mask = (1 << 0), .what = (void*)&PORTB, },       
        { AVR_MCU_VCD_SYMBOL("reset_timer"), .mask = (1 << 1), .what = (void*)&PORTB, },        
        { AVR_MCU_VCD_SYMBOL("OC2A"), .mask = (1 << 3), .what = (void*)&PORTB, },
};

 sleep_cpu();

simulavr

あれ、そもそもCrossPackにはsimulavrがついてるのか。 こっちはいきなりelfを食えるようだ。そのほうが良い気がするなあ。あと、仮想的なレジスタを定義してdebug printfもどきを実現してるな。ふむ。ただCrossPackについてるものは0.1.2.7で、最新は1.0.0.0らしいのでそれを入れよう。

./configure --with-bfd=/usr/local/CrossPack-AVR/bfd --with-libiberty=/usr/local/CrossPack-AVR

SWIGがver2系だと怒られる。バージョンチェックが甘いようだ。 http://www.mail-archive.com/simulavr-devel@nongnu.org/msg01304.html にしたがってconfigure.acを修正。bootstrapもうまくいかない。パスの関係で、OSX標準のlibtoolsが使われてしまう。brewで入れたのは/usr/local/bin/glibtool, /usr/local/bin/glibtoolize等なので、/usr/local/bin/libtoolなどにシンボリックリンクを貼る。

./bootstrap
./configure --with-bfd=/usr/local/CrossPack-AVR/bfd --with-libiberty=/usr/local/CrossPack-AVR CXXFLAGS="-O 3 -arch i386 -arch x86_64"
make
Undefined symbols for architecture x86_64:

ふむ。CrossPackのライブラリはi386アーキテクチャでビルドされてるせいかリンカに蹴られる。

/configure --with-bfd=/usr/local/CrossPack-AVR/bfd --with-libiberty=/usr/local/CrossPack-AVR CFLAGS="-O 3 -arch i386" CXXFLAGS="-O 3 -arch i386" LDFLAGS="-arch i386" LD_FLAGS="-arch i386" --disable-dependency-tracking

とかかなあ。

うーん。だめだ。ちょっとあきらめ気味。