valtozok adatainak ciklusonkenti mentese

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: valtozok adatainak ciklusonkenti mentese

Hozzászólás Szerző: kapu48 »

Várjuk a kérdéseidet! (Nem olyan buták szoktak azok lenni!)
És még mi is tanulunk belőlük!
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: valtozok adatainak ciklusonkenti mentese

Hozzászólás Szerző: csabeszq »

Winnerbt: ha kifogysz a memóriából az tervezési hiba, én is szoktam baromkodni, hogy kisebb kódot generáljon, de a tapasztalat azt mondja, hogy nagyobbra váltani érdemesebb.

Amikor kisebb kódot akarsz, az mindig az érthetőség rovására megy, amikor erősebb MPU-t teszel be, visszaállíthatsz mindent eredetibe, vagy megírhatod újra.

Azért mégis elmondom, hogy hol megy el a legtöbb memória nálam:
- ha valami uint8-at igényel, ne használj int-et, int16-ot helyette
- enum-ok AVR alatt 2 bájtos értékek. A gcc-nek -short-enums flaggel lehet megadni, hogy 1 bájtos legyen
- a függvény hívások: push r2, r3 ... r31 rohadt sok helyet foglalnak, -mcall-prologues kisebb kódot generál
- nagyobb atmega-knál JMP-t fordít a gcc, RJMP helyett (4 byte 2 byte helyett). Ezt a -relax opció kapcsolja ki.
- a switch -> case horrorisztikus AVR gcc alatt, az if-else rövidebb kódot generál
- float-ot, malloc-ot ne használj
- az osztással is módjával.

Jó lenne látni, hogy a gcc-d milyen assembly-t fordított. Ha feltöltöd jobban láthatnánk, hogy mi a gond. Futtass le egy parancsot, ami megmutatja, hogy mit fordított az AVR-gcc, azután lehetne segíteni a dolgon.

Kód: Egész kijelölése

avr-objdump -S --demangle sketch_dec05c.ino.elf
Az objdump után valami ilyesmit kapsz:

Kód: Egész kijelölése

00000a48 <__udivmodhi4>:
 a48:   aa 1b           sub     r26, r26
 a4a:   bb 1b           sub     r27, r27
 a4c:   51 e1           ldi     r21, 0x11       ; 17
 a4e:   07 c0           rjmp    .+14            ; 0xa5e <__udivmodhi4_ep>

00000a50 <__udivmodhi4_loop>:
 a50:   aa 1f           adc     r26, r26
 a52:   bb 1f           adc     r27, r27
 a54:   a6 17           cp      r26, r22
 a56:   b7 07           cpc     r27, r23
 a58:   10 f0           brcs    .+4             ; 0xa5e <__udivmodhi4_ep>
 a5a:   a6 1b           sub     r26, r22
 a5c:   b7 0b           sbc     r27, r23

Ebből jól látni, hogy az egész osztás mekkora plusz kódméretet generál. Ha képes vagy shift-elésre cserélni, kisebb lesz a kódod.

A szerény véleményem továbbra is az, hogy IC csere, viszont még el tudsz lavírozni egy darabig ezzel.
Válasz küldése