Már van néhány nagyon jó válasz. Csak ezt teszem közzé, hogy megosszam néhány statisztikát, amelyeket egy napon meg is tettem, és ugyanolyan kérdéseket tettem fel magamnak: Mi foglal annyi helyet egy minimális vázlaton? Mi szükséges minimum ugyanazon funkcionalitás eléréséhez?
Az alábbiakban egy minimálisan villogó program három változata látható, amely másodpercenként a 13-as tűre kapcsolja az LED-et. Mindhárom verziót összeállítottuk az anUno számára (nincs USB csatlakozás) az avr-gcc 4.8.2, avr-libc 1.8.0 ésarduino-core 1.0.5 használatával (nem használom az Arduino IDE-t).
Először is, a szokásos Arduino mód:
const uint8_t ledPin = 13; void setup () {pinMode (ledPin, OUTPUT);} void loop () {digitalWrite (ledPin, HIGH); késés (1000); digitalWrite (ledPin, LOW); delay (1000);}
Ez 1018 bájtra áll össze. Az avr-nm
és a szétszerelés segítségével ezt a méretet külön funkciókra bontottam. A legnagyobbtól a legkisebbig:
148 A ISR (TIMER0_OVF_vect) 118 A init 114 A pinMode 108 A digitalWrite 104 C vector table 82 A turnOffPWM 76 A delay 70 A micros 40 U loop 26 A main 20 A digital_pin_to_timer_PGM 20 A digital_pin_to_port_PGM 20 A digital_pin_to_bit_mask_PGM 16 C __do_clear_bss 12 C __init 10 A port_to_output_PGM 10 A port_to_mode_PGM 8 U setup 8 C .initb__cit - Cinter 4 ------------------------ 1018 ÖSSZESEN
A fenti listában az első oszlop a bájtban megadott méret , és a második oszlop megmondja, hogy a kód az Arduino magkönyvtárból származik (A, 822 bájt összesen), a C futási időből (C, 148 bájt) vagy a felhasználótól (U, 48 bájt).
Amint lehet Ebben a listában látható, hogy a legnagyobb funkció az időzítő 0 túlcsordulás megszakításának karbantartása. Ez a rutin az idő követéséért felelős, és a millis ()
, micros ()
és a delay ()
szükséges. A második legnagyobb függvény init ()
, amely beállítja a hardver időzítőket
a PWM esetében engedélyezi a TIMER0_OVF megszakítást és leválasztja az USART-ot (amelyet a rendszerbetöltő használt). Ezt és az előző függvényt is meghatározták a <Arduino könyvtárban> / hardware / arduino / cores / arduino / wiring.c
.
A következő a C + avr-libc verzió: >
#include <avr / io.h> # include <util / delay.h>int main (void) {DDRB | = _BV (PB5); / * állítsa kimenetként a PB5 csapot * / a (;;) {PINB = _BV (PB5) számára; / * kapcsoló PB5 * / _delay_ms (1000); }}
Az egyes méretek bontása:
104 C vektortábla 26 U main 12 C __init 8 C .init9 (call main, jmp exit) 4 C __bad_interrupt 4 C _exit ---------------------------------- 158 ÖSSZESEN
Ez 132 bájt a C futásidejéhez és 26 bájt felhasználói kód, beleértve a beillesztett _delay_ms()
.funkciót.
Megjegyezhetjük, hogy mivel ez A program nem használ megszakításokat, a megszakításvektortáblára nincs szükség, és a rendszeres felhasználói kodeket lehet a helyére tenni. A következő szerelési verzió pontosan ezt teszi:
#include <avr / io.h> # define io (reg) _SFR_IO_ADDR (reg) sbi io (DDRB), 5; állítsa a PB5-t kimeneti nyílásként: sbi io (PINB), 5; kapcsoló PB5 ldi r26, 49; késleltetés 49 * 2 ^ 16 * 5 ciklus késleltetés: sbiw r24, 1 sbci r26, 0 brne késleltetés rjmp hurok
Ez össze van állítva ( >) csak 14 bájtba, amelyek többségét a váltások késleltetésére használják, hogy a villogás ne legyen látható. Ha eltávolítja ezt a késleltetési hurkot, akkor egy 6 bájtos programot kap, amely túl gyorsan villog ahhoz, hogy látható legyen (2 MHz-en):
sbi io (DDRB), 5; állítsa a PB5-t kimeneti nyílásként: sbi io (PINB), 5; váltani a PB5 rjmp ciklust