2013-01-13

Arduino-Lite - 2kB müssen reichen.


Beim Einkauf meiner ATtiny-Muster habe ich mehr auf die Verfügbarkeit und auf die Anzahl I/O Pins (mit und ohne PWM, RXD, TXD, etc) geachtet. Was ich übersehen habe: Der ATtiny2313 (20 Pins) hat nur 2kB Flash. Selbst der ATtiny85 (8 pins) hat 8kB.
Selbst beim Compilieren des "Blink"-Programms hat man die 2kB Grenze fast schon geknackt.
Geht es auch sparsamer, ohne auf das Arduino IDE zu verzichten und direkt auf die Hardware runter zu gehen? 

Arduino-Lite !


Ein Lösungsansatz scheint "Arduino-Lite" zu sein. Es implementiert einige der Arduino Befehle über C-Macros. Dadurch wird der Code, der zur Laufzeit ausgeführt wird statischer und kompakter.

"Thanks to the marcos in Arduino-Lite, we keep it simple but providing higher performance and smaller binary size. Almost all core functions in Arduino have their Arduino-lite version, most of which are implemented by marcos. In Arduino-Lite, the conversion from numbering pin to AVR registers are finished in the compiling phase, which is in the runtime in Arduino."
Ein paar einführende Links: http://blog.iteadstudio.com/arduino-lite-lightweight-avr-library/http://blog.iteadstudio.com/arduino-lite-lightweight-avr-library/
Arduino-Lite Lightweight AVR Library(1): http://www.elecfreaks.com/92.html 

Arduino-Lite Lightweight AVR Library(2): http://www.elecfreaks.com/120.html
http://www.robopeak.net/blog/?p=131
Arduino-Lite Development Reference Manualhttp://www.elecfreaks.com/167.html , http://www.robopeak.net/blog/?p=185

Installation im IDE 1.0.3:

Arduino-lite wurde leider schon eine Weile nicht mehr aktualisiert. Damit es sich in das IDE integrieren lässt, muss man etwas tricksen:
Das Archiv: http://arduino-lite.googlecode.com/files/arduino-lite-r0.2.zip  (die momentan neueste Version) herunterladen. Die ZIP-Datei ist relativ gross, wir benötigen lediglich den Ordner "arduino-lite-r0.2.zip\arduino-lite\src\core". Dieser wird wieder nach 

Herunterladen von arduino-lite-r0.2.zip , den Inhalt des Ordners "arduino-lite/src/core" in einen neuen Unterordner "arduino-1.0.3\hardware\arduino\cores\lite" kopieren.

Noch ein paar Einträge in "arduino-1.0.3\hardware\arduino\boards.txt" ergänzen:


##########################################

attiny2313-lite.name=LITE ATtiny2313 (internal 8 MHz clock)

attiny2313-lite.bootloader.low_fuses=0xe2
attiny2313-lite.bootloader.high_fuses=0xdf
attiny2313-lite.bootloader.extended_fuses=0xff
attiny2313-lite.upload.maximum_size=2048

attiny2313-lite.build.mcu=attiny2313

attiny2313-lite.build.f_cpu=8000000L

attiny2313-lite.build.core=lite

attiny2313-lite.build.variant=standard



##############################################################

mega328lite.name=LITE ATmega328 on a breadboard (8 MHz internal clock)

mega328lite.upload.protocol=stk500
mega328lite.upload.maximum_size=30720
mega328lite.upload.speed=57600

mega328lite.bootloader.low_fuses=0xE2
mega328lite.bootloader.high_fuses=0xDA
mega328lite.bootloader.extended_fuses=0x05
mega328lite.bootloader.path=arduino:atmega
mega328lite.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
mega328lite.bootloader.unlock_bits=0x3F
mega328lite.bootloader.lock_bits=0x0F

mega328lite.build.mcu=atmega328p
mega328lite.build.f_cpu=8000000L
mega328lite.build.core=lite
mega328lite.build.variant=standard

usw.

Arduino.h ergänzen



Das IDE sucht beim Compilieren nach der Datei Arduino.h. Hierfür müssen wir noch einen kleinen Stub ergänzen. Bei der Gelegenheit fügen wir auch noch ein paar kleine Ergänzungen aus Kompatibilitätsgründen ein: Hier der Sourcecode zu arduino-1.0.3\hardware\arduino\cores\lite\Arduino.h:



// MM: need this stub to bring arduino_lit into the new IDE 1.0.x world
#ifndef Arduino_h

#include "arduino_lit.h"

#define Arduino_h

// see wiring_lit.h
#define pinMode(a,b) PIN_MODE(a,b)
#define analogWrite(a,b)  ANALOG_WRITE(a,b) 
#define digitalWrite(a,b) DIGITAL_WRITE(a,b)
#define digitalRead(a)  DIGITAL_READ(a)
// MM: to increase compatibility with Arduino libraries ("main.cpp")
int main()
{
  init();
  setup();
  while(1)
    loop();
}
#endif

---------------------------------------

Erste Versuche

Das Beispielprogramm "Fading" lässt die Intensität einer LED wechseln.Ich habe eine kleine Änderung am Code vorgenommen, damit die statischen Macros funktionieren können:

"int ledPin = 9;"
in  
"#define ledPin 9"
ändern.

Danach ergibt sich folgendes Bild beim kompilieren:

"Regulär" kompiliert, für ein Arduino UNO Board:
Binäre Sketchgröße: 1.296 Bytes (von einem Maximum von 32.256 Bytes)
Für den ATtiny2313
Binäre Sketchgröße: 1.062 Bytes (von einem Maximum von 2.048 Bytes)
Für den ATtiny44:
Binäre Sketchgröße: 1.038 Bytes (von einem Maximum von 4.096 Bytes)
Für den ATtiny85:
Binäre Sketchgröße: 944 Bytes (von einem Maximum von 8.192 Bytes)
Mit Arduino-Lite:
Binäre Sketchgröße: 448 Bytes (von einem Maximum von 2.048 Bytes)

Damit sollte es möglich sein, auch ein sinnvolles Projekt auf den 2313 zu bringen, ohne auf Arduino zu verzichten und auf Registeroperationen und Bitmanipulationen zu setzen.- Nicht das dies absolut schlimm wäre, aber der Code ist dann weniger portabel und lesbar.

Arduino-Lite setzt nicht das gesamte API um. Man muss also etwas in die Trickkiste greifen. 



Keine Kommentare:

Kommentar veröffentlichen