Arduinoのコードサイズ削減

このページのソースです。

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

-*コード>https://code.google.com/p/arduino-lite/*
-*リファレンス>http://www.robopeak.net/blog/?p=185*

!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を
{{{
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
-タイマ割り込みはなんだか誰かに使われてる様子