ohjeita:avr-gcc

Erot

Tämä näyttää erot valitun ja nykyisen version kesken tästä sivusta.

Linkki vertailunäkymään

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>​
  
  • ohjeita/avr-gcc.txt
  • Viimeksi muutettu: 2014/12/06 06:04
  • (ulkoinen muokkaus)