(AVR編第3回)Arduino Duemilanove で動作した

2012/08/09

あなたは 人目のお客様です.

前回は割り込み動作を実機に合わせたが,いろいろ調べて一気にKOZOSのArduino 実機対応をしてしまった.あとGDBシミュレータもシリアル周りを実機に合わせた 動作にして,実機でもシミュレータでも動作可能にした.

Arduinoを対称にしたプリエンプティブな組込みOSというのはありそうであまり 無いようなので,実験用とかお遊び用のOSとして,いいのではなかろうか.

で,以下が修正したコード.

前回からの変更点は以下.

(KOZOSの修正)

(GDBシミュレータの修正)

まず実機で動かす場合は,os を make ; make image してあとはArduino Duemilanove とUSBで接続して make write で書き込む.で,書き込み後は自動で起動するので cu で実機と接続するとKOZOSと接続できる.(12ステップ本の最終章のシリアル通信 と同じものが動いている)

注意として,make write はArduinoにUSB接続して1〜2秒くらいのときに行う. 早くても遅くてもダメ.早すぎるとUSBデバイスが認識されてなくてデバイスファイルを 開けなくてavrdudeがエラーになる.遅すぎるとブートローダーがアプリの起動を 開始してしまう.

あとUSBを抜き差ししたらドライバがいったんリセットされる?ようなので, cuで接続しなおす必要がある.

あと当然ながら,cuで接続したままだとavrdudeがデバイスファイルを開けなくて エラーになる.make write する際にはcuを切ること.

以下が書き込み時のログ.

letsnote# make write
/usr/local/arduino/hardware/tools/avr/bin/avrdude -q -V -p atmega328p -C /usr/local/arduino/hardware/tools/avr/etc/avrdude.conf  -c arduino -b 57600 -P /dev/cuaU0  -U flash:w:kozos.hex:i

avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x1e950f
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 "kozos.hex"
avrdude: writing flash (6542 bytes):
avrdude: 6542 bytes of flash written

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

letsnote# 

以下が起動時のログ.

letsnote# cu -l /dev/cuaU0
Connected
kozos boot succeed!
command> echo Arduino
 Arduino
command> 

次にGDBシミュレータで動作させる場合について.

添付のパッチを当ててgdbをビルドする.KOZOS側はMakefileで以下の行を有効化して ビルドする.ビルド方法は前々回を参照.(当然ながらAVR向けにビルドする)

CFLAGS += -DSIMULATOR
で,以下のように kozos.elf を指定してgdbを起動する.
% cd gdb-7.3.1
% ./gdb/gdb ../kozos/avr_03/os/kozos.elf
gdbが起動したら以下を実行.
(gdb) target sim
(gdb) load
loadすると「connect to /dev/pts/XX」のようにして接続先を言ってくるので, cuでそこに接続する.
# cu -l /dev/pts/15
gdbでrunを実行すると,動作開始する.
(gdb) run

以下,gdb側の実行時ログ.

hiroaki@letsnote:~/avr>% cd gdb-7.3.1/
hiroaki@letsnote:~/avr/gdb-7.3.1>% ./gdb/gdb ../kozos/avr_03/os/kozos.elf 
GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i386-unknown-freebsd8.3 --target=avr-elf".
For bug reporting instructions, please see:
...
Reading symbols from /home/hiroaki/avr/kozos/avr_03/os/kozos.elf...done.
(gdb) target sim
Connected to the simulator.
(gdb) load
connect to /dev/pts/15
(gdb) run
Starting program: /home/hiroaki/avr/kozos/avr_03/os/kozos.elf 

以下,KOZOSのログ.

letsnote# cu -l /dev/pts/15
Connected
kozos boot succeed!
command> echo test
 test
command> echo test
 test
command> 
AVRとArduinoについては今回いろいろ調べたのだが,それについてはまた別途書こう.

あとAVRはKOZOSを載せるにはかなりメモリがキツキツで,とくにヒープ領域が収まる ように計算するのがめんどい.しかしきちんと計算しておかないと,はみ出ると スタックにぶつかってしまって誤動作してしまう.

現状は memory.c のヒープ領域はBSSの後ろにあるが,これをBSSに移してリンカ スクリプトで調整できるようにしたい.

あとは手元に Arduino Uno もあるので,こっちでも試してみたい. 基本的には同じ ATmega328pを積んでるのでそのまま動くはず. (ただしブートローダーが異なるらしいので,ブートローダーを破壊しないように ブートローダー領域の位置とサイズは改めて確認しといたほうがいいだろう. avrdudeでの書き込みも,もしかしたら何かパラメータいじる必要があるかもしれない)

メモリ的にはまだチューニングはできそうだがやはりキツキツではあるので, 本格的にやるならば Arduino Mega をターゲットにすることを考えたほうが いいかもしれない.


メールは kozos(アットマーク)kozos.jp まで