60 nap alatt Arduino #40-#41 - Kódméret csökkentés

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

60 nap alatt Arduino #40-#41 - Kódméret csökkentés

HozzászólásSzerző: Robert » 2012. szeptember 13. csütörtök, 8:39

Hogyan legyen kisebb az Arduino kódunk?
A tippek NEM C, és nem ASM irányba mutassanak!
Csak standard Arduino tippek számítanak! :P

Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

Re: 60 nap alatt Arduino #40-#41 - Kódméret csökkentés

HozzászólásSzerző: normen » 2012. szeptember 13. csütörtök, 15:40

Robert írta:Hogyan legyen kisebb az Arduino kódunk?
A tippek NEM C, és nem ASM irányba mutassanak!
Csak standard Arduino tippek számítanak! :P


Bár még messze jároka 40-41-es leckétől, és nem tudom a pontos tartalmát, azért elkezdem az ötletelést:


1. Megfelelő méretű változók használata, pl:


Ha tudjuk hogy egy egész numerikus változónak 256 vagy annál kevesebb értéke lehet, akkor használjunk byte típusú változót (és ne word, int, vagy long típust).

Numerikus egész típusok, méretük és tartományaik Arduino-ban:
byte 1 bájt 0-255
word 2 bájt 0-65535
unsigned int 2 bájt 0-65535
int 2 bájt -32768 - 32767
long 4 bájt -2147483648 - 2147483647
unsigned long 4 bájt 0 - 4294967295


(Mivel Robert kérte, hogy csak Arduino specifikus dolgokról írjunk, ezért szándékosan csak az Arduino SDK-ban szereplő numerikus egész típusokat soroltam fel)

Másik példa:

String típtus esetén ne deklaráljunk nagyobb változót, mint amekkorára szükségünk van.
Pl. ha tudjuk, hogy a maxim szöveg, amit egy változóban tárolni szeretnénk 16 karakter, akkor ne deklaráljunk ennél nagyobbat.

Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

HozzászólásSzerző: normen » 2012. szeptember 13. csütörtök, 15:56

2. Töröljük a fölösleges header fájl hivatkozásokat a forráskódból

A header fájlok olyan deklarációkat (függvény, osztály, válltozó, konstans, stb...) tartalmaznak, amelyek jelentősen növelik a lefordított programunk méretét, ezért érdemes csak azokra a header fájlokra hivatkozni, melyeket tényelegesen használunk is.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. szeptember 13. csütörtök, 16:24

Arduino keretrendszer alatt vagyunk, kezdőként :).
A változótípusok megválasztása az benne van a témaleckében. Még senki nem kapott belőle, hétfőn megy ki :).


A header az rendszerszintű, azaz kezdőként "nem nyúlka-piszka".
Maximum ott, hogy feleslegesen külső függvénykönyvtárakat ne linkeljünk a programunk elején.

Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

Re: 60 nap alatt Arduino #40-#41 - Kódméret csökkentés

HozzászólásSzerző: normen » 2012. szeptember 13. csütörtök, 16:35

Robert írta:Hogyan legyen kisebb az Arduino kódunk?



Az első mondatodat visszaolvasva, nem egyértelmű nekem, hogy a forrsákódot szeretnénk egyszerősíteni/rövidíteni, vagy a lefordított hex/bin fájl mértetének csökkentése a cél?

(Első sok sesetben eredményezi a 2.-at is)

Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

HozzászólásSzerző: normen » 2012. szeptember 13. csütörtök, 16:46

Robert írta:Arduino keretrendszer alatt vagyunk, kezdőként :).

Éppen ezért írtam, csak az Arduino SDK-ban elérhető adattípusokat. Nem kezdős C-sként a határ a csillagos ég lenne (na jó nem :))

A header az rendszerszintű, azaz kezdőként "nem nyúlka-piszka".
Maximum ott, hogy feleslegesen külső függvénykönyvtárakat ne linkeljünk a programunk elején.

Lehet pontatlan voltam, de erre gondoltam én is. A keretrendszer kódjába piszkálni, amúgy sem ajánlatos, mert új verzió esetén csak nézhetünk...

Akkor ide olyan általános mondásokat vársz pl, hogy:
- Ismétlődő programrészeket függvényekbe szervezni
- változók újrafelhasználása


Gondolom a setup/loop részek melőzését, akkor már ne is említsem? :)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. szeptember 13. csütörtök, 18:13

setup() és loop() nélkül nem fordul le a kód :).


Forráskód az majd' mindegy. Az eredmény szokott a kritikus lenni....

Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

HozzászólásSzerző: normen » 2012. szeptember 13. csütörtök, 20:08

Robert írta:setup() és loop() nélkül nem fordul le a kód :).


Bocsi, de most muszáj lesz elrugaszkodnom a "kezdőként" feltételtől....

Vess egy pillantást a hardware\arduino\cores\arduino\main.cpp-re
Pontos útvonalat csak linux-ra tudok mondani, de biztos megtalálod windows alatt is:
/usr/share/arduino/hardware/arduino/cores/arduino/main.cpp

Kicsit kommentezve a tartalma:
#include <WProgram.h>                                                                                                                                                               
                                                                                                                                                                                    
int main(void)
{                                                                                                                                                                                   
  init(); //Arduino framework saját initje
                                                                                                                                                                                    
  setup(); //Itt hívja a te setup() eljárásod
                                                                                                                                                                                
  for ( ; ; )
    loop(); //Itt pedig a loop eljárásod hívja végtelen ciklusban
                                                                                                                                                                            
   return 0;
}



A main() függvényt simán felül tudod deklarálni. Példaként a BLINK példaprogram lefordítva 896 byte nálam. Ugyanezt átírva loop() és setup() nélkül 880 byte:


int ledPin = 13; // LED connected to digital pin 13

int main(void) {
  init(); //Ez fontos!!! Arduino saját init-je
  
  /****************************
   * Ide írom a setup() részt *
   ****************************/
  // initialize the digital pin as an output:
  pinMode(ledPin, OUTPUT);
  
  
  /***************************************
   * Végtelen ciklusba pedig a loop()-ot *
   ***************************************/
  while(1) {
    digitalWrite(ledPin, HIGH); // set the LED on
    delay(1000); // wait for a second
    digitalWrite(ledPin, LOW); // set the LED off
    delay(1000); // wait for a second
  }
}  



Próbáld lefordítani... :) :) :)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. szeptember 13. csütörtök, 20:22

A 2. programod Arduino 0022 alatt 1014 byte.


Célzott LED villogós nyomorítás:
http://avr.tavir.hu/modules.php?name=Fo ... 1937#21937

Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

HozzászólásSzerző: normen » 2012. szeptember 13. csütörtök, 21:36

Robert írta:A 2. programod Arduino 0022 alatt 1014 byte.


Azért azt is leírhatnád, hogy az eredeti blink példaprogram hány bájt nálad. Gyanítom ott is meg lesz a 16 bájt különbség, elvégre csak megspórolunk 2 call/return hívást.

Valszeg az én Arduino IDE-m régebbi, ezért a méreteltérés. Holnap megmondom a verziót (benthagytam munkahelyemen a laptopom).

Célzott LED villogós nyomorítás:
http://avr.tavir.hu/modules.php?name=Fo ... 1937#21937


Csak azt akartam szemléltetni, hogy el lehet hagyni a setup() és loop() függvényeket, és ehhez választottam egy egyszerûnek tûnô példaprogramot.
De most, hogy mondod... :) Picit még finomítok rajta azért, mert ez még elég gyér.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. szeptember 14. péntek, 3:35

Arduino-0022 beépített BLINK programja: 1018 byte (Diecimila/328 vagy 168-ra). DE:
Arduino-0022 beépített BLINK programja: 826 byte (ATMega8).
Arduino-0022 beépített BLINK programja: 1588 byte (Mega2560).
Arduino-0022 beépített BLINK programja: 1584 byte (Mega1280).
Arduino-0022 beépített BLINK programja: 1042 byte (Lily 168).

Azaz a kód a chiptől/paneltől is függ!

Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

HozzászólásSzerző: normen » 2012. szeptember 14. péntek, 10:15

normen írta:Valszeg az én Arduino IDE-m régebbi, ezért a méreteltérés. Holnap megmondom a verziót (benthagytam munkahelyemen a laptopom).


0018 az én verzióm, és "Arduono Duemilanove or Nano w/ ATMega328" volt board-nak beálltíva.

Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00
Tartózkodási hely: Budapest

HozzászólásSzerző: szegoj » 2012. szeptember 15. szombat, 6:52

Miközben az előzőek szerint ravaszabbnál ravaszabb trükkökkel a programméret minimalizálható, van mikor a fordító pont ellentétesen működik.

Arduino-t programozok (a versenyre készülve). A programom, melynek mérete 8000 bájt körüli, sztringeket gyűjt az ATmega328 adatmemóriájába, majd azt sorosan kiküldi.

Programozás közben egy "nagyon ijesztő" jelenséggel találkoztam.
Ha az egyik sztringben például az '1'-es karaktert '2'-re cserélem (a pde fájl mérete nem változik!), a lefordított program mérete váratlanul, kb. 50 bájttal megnő.

Vajon mi történik ilyenkor :?: :?: :?:

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. szeptember 15. szombat, 8:04

Lehet, hogy a belső optimalizálás nem sikerül így a fordítónak. Ezért nő meg a kódméreted...

Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

HozzászólásSzerző: normen » 2012. szeptember 16. vasárnap, 10:15

szegoj írta:Ha az egyik sztringben például az '1'-es karaktert '2'-re cserélem (a pde fájl mérete nem változik!), a lefordított program mérete váratlanul, kb. 50 bájttal megnő.


Standard C-s karaktertömböt vagy Arduino API féle string osztályt?


Vissza: “60 nap alatt Arduino - Házi feladatok”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég