ohjeita:avr-gcc

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.

.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)

Ohjelmassa olevat kutsumattomat funktiot tulevat defaulttina flash-ohjelmointitiedostoon. Niiden poistaminen automaattisesti:

Kääntäjälle: -ffunction-sections
Linkkerille: -gc-sections

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:

int main() __attribute__((noreturn));
int main()
{
...
}
  • ohjeita/avr-gcc.txt
  • Viimeksi muutettu: 2014/12/06 06:04
  • (ulkoinen muokkaus)