Erot
Tämä näyttää erot valitun ja nykyisen version kesken tästä sivusta.
— |
ohjeita:avr-gcc [2014/12/06 06:04] (nykyinen) |
||
---|---|---|---|
Rivi 1: | Rivi 1: | ||
+ | ====== avr-gcc:n käyttökelpoistaminen ====== | ||
+ | |||
+ | Atmel AVR -mikrokontrollerien avoimen lähdekoodin avr-gcc-kääntäjä on ihan hyvä, mutta kääntäjässä näkyy PC-lähtöisyys ja tiukka standardien tulkinta. Tästä johtuen kääntäjä on perusasetuksiltaan lähes käyttökelvoton pienimpien tinyAVR:ien kanssa, koska kääntäjä generoi turhaa koodia ja tuhlaa turhaan rammia. Oheen kerätään sekalaisia ohjeita ja vinkkejä ohjelman koon pienentämiseksi. | ||
+ | |||
+ | ===== Muistinkäytön ymmärtäminen ===== | ||
+ | |||
+ | .text = ohjelmakoodi | ||
+ | .data = alustetut globaalit muuttujat. Älä koskaan manuaalisesti alusta nollaksi, tuhlaat vaan turhaan flashia. | ||
+ | .bss = alustamattomat globaalit muuttujat (alustuvat nollaksi) | ||
+ | flash-ohjelmamuistiin menevät osat : .text + .data | ||
+ | rammia kuluttavat osat: .data + .bss + stack (jonka koko on dynaaminen) | ||
+ | |||
+ | ===== Käyttämättömien funktioiden poistaminen ===== | ||
+ | |||
+ | Ohjelmassa olevat kutsumattomat funktiot tulevat defaulttina flash-ohjelmointitiedostoon. Niiden poistaminen automaattisesti: | ||
+ | Kääntäjälle: -ffunction-sections | ||
+ | Linkkerille: -gc-sections | ||
+ | |||
+ | ===== main-funktion push/pop ===== | ||
+ | |||
+ | Mikrokontrollerimaailmassa main-funktion ympärillä ei ole mitään sellaista prosessorin tilaa, joka täytyisi säilyttää, mutta tätä kääntäjä ei automaattisesti ymmärrä. Kääntäjä noudattaa tiukasti C-standardia, ja varmuuden vuoksi tallentaa kaikki mainissa käytetyt rekisterit stackiin. Tämä vie ohjelmamuistia mutta erityisesti tämä vie rammia tavalla, joka on ohjelmoijan vaikea ymmärtää/muistaa/tietää muuta kuin vilkaisemalla assembly-listausta ja näkemällä kasan täysin järjettömiä PUSHeja. Esim. Tiny25:ssä on 128 tavua rammia josta tämä ominaisuus voi syödä jopa 20%! Asia korjataan seuraavasti: | ||
+ | |||
+ | <code>int main() __attribute__((noreturn)); | ||
+ | int main() | ||
+ | { | ||
+ | ... | ||
+ | } | ||
+ | </code> | ||