Arduinoのコードサイズ削減

Arduino-lite

Arduinoと同じようなコードをpure cでコンパイルして、バイナリサイズを削減するとのこと。

Arduino-lite をOS X で動かす

Windows環境決め打ちになってるので、CrossPack向けにパスを変更する。 scripts/mak_avr_def.infを変更。

ifndef WINAVR_HOME
WINAVR_HOME := /usr/local/CrossPack-AVR
endif

REMOVE      := rm -f
MV          := mv -f
MKDIR       := mkdir -p
SED         := sed
FIND        := find
DIRNAME     := dirname
#we use the modified avrdude version provided by Arduino
AVRDUDE     := avrdude

とか。あと--crefオプションがないとのことなので、下記を修正。

$(TARGET).elf: $(OBJ) $(EXTRA_OBJ)
	$(MKDIR) `$(DIRNAME) $@`
#	$(CC) $(ALL_CFLAGS) --cref -o $@ -L. $^ $(LDFLAGS) 
    $(CC) $(ALL_CFLAGS) -o $@ -L. $^ $(LDFLAGS) 

手持ちのライタはAVRISP mk2なので、

AVRDUDE_PROGRAMMER := avrisp2
BURNING_PROGRAMMER := avrisp2
BURNING_PORT = usb

と変更する。

動かしてみる

attiny2313、8MHzで動かしてみよう。スケッチのMakefileを

UPLOAD_PORT=:usb
MCU := attiny2313
F_CPU := 8000000

として、下記のようなスケッチをビルド。

#include "arduino_lit.h"

#define ledPin 0

void setup()  {
  PIN_MODE(ledPin,OUTPUT);
} 

void loop()  {
  DIGITAL_WRITE(ledPin,HIGH);
  sleep(100);                            
  DIGITAL_WRITE(ledPin,LOW);
  sleep(100);                            
}

int main()
{
  init();
  setup();
  while(1)
    loop();
}
make 
make fuse
make burn

で、AVRISPmk2からのburnに成功。

まあ、こんなスケッチではarduino-lite化する意味がほとんどないのだが。。

注意事項

  • DIGITAL_READの返答はHIGH/LOWではなく、0/NonZero
  • タイマ割り込みはなんだか誰かに使われてる様子