Várjuk a kérdéseidet! (Nem olyan buták szoktak azok lenni!)
És még mi is tanulunk belőlük!
valtozok adatainak ciklusonkenti mentese
Re: valtozok adatainak ciklusonkenti mentese
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.
Az objdump után valami ilyesmit kapsz:
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.
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
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
A szerény véleményem továbbra is az, hogy IC csere, viszont még el tudsz lavírozni egy darabig ezzel.