Näytä sivuVanhat versiotPaluulinkitTakaisin ylös Tämä sivu on vain luettavissa. Voit katsoa sen lähdekoodia, mutta et muuttaa sitä. Kysy ylläpitäjältä jos pidät tätä estoa virheellisenä. ====== 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> ohjeita/avr-gcc.txt Viimeksi muutettu: 2014/12/06 06:04(ulkoinen muokkaus) Kirjaudu sisään