Kysymys:
ATTiny13 - avr-gcc Hello World käyttää yli 100 tavua?
Earlz
2010-04-25 07:19:27 UTC
view on stackexchange narkive permalink

Yritän kirjoittaa ATTiny13-ohjelmaa. Minun ongelmani on, että sillä on valtavat kokorajoitukset. No, kun tein ensimmäisen Hello World -ohjelmasi, kesti 100 tavua ohjelmatilaa vain, jotta valo syttyi ja sammuu! Voinko avr-gcc: lle antaa vaihtoehtoja pienentää tätä kokoa alaspäin? Lisäksi mitä on crt0: ssa? En ole kovin innokas AVR-kokoonpanoon, joten en ymmärrä sitä paljon.

En halua joutua jättämään kokoonpanoa tähän projektiin.

Pienenä sivuhuomautuksena jotkut ihmiset kutsuvat sitä "Blinky" -ohjelmaksi.
@Johan No, en ollut varma kuinka "blinkenlights" kirjoitetaan
Viisi vastused:
jpc
2010-04-26 03:15:38 UTC
view on stackexchange narkive permalink

Voit käyttää avr-objdump -d .elf-tiedostoa nähdäksesi, mitä syntyy:

Analysoidaan sitä vähän:

  [jpc @ jpc ~] avr- objdump -d avr.elf | sed -e 's / ^ / /' | pbcopyavr.elf: tiedostomuoto elf32-avrLohkon purkaminen .text: 00000000 <__vectors>: 0: 09 c0 rjmp. + 18; 0x14 <__ctors_end> 2: 0e c0 rjmp. + 28; 0x20 <__bad_interrupt> 4: 0d c0 rjmp. + 26; 0x20 <__bad_interrupt> 6: 0c c0 rjmp. + 24; 0x20 <__bad_interrupt> 8: 0b c0 rjmp. + 22; 0x20 <__bad_interrupt> a: 0a c0 rjmp. + 20; 0x20 <__bad_interrupt> c: 09 c0 rjmp. + 18; 0x20 <__bad_interrupt> e: 08 c0 rjmp. + 16; 0x20 <__bad_interrupt> 10: 07 c0 rjmp. + 14; 0x20 <__bad_interrupt> 12: 06 c0 rjmp. + 12; 0x20 <__bad_interrupt>  

20 tavua keskeytysvektoritaulukko (ainakin osa merkinnöistä voidaan jättää pois, jos vaadit ja lupasit, ettet koskaan ota vastaavia keskeytyksiä käyttöön).

  00000014 <__ctors_end>: 14: 11 24 eor r1, r1 16: 1f be out 0x3f, r1; 63 18: vrt. E9 ldi r28, 0x9F; 159 1a: cd bf out 0x3d, r28; 61 1c: 02 d0 rcall. + 4; 0x22 <main> 1e: 05 c0 rjmp. + 10; 0x2a <_exit>  

Tyhjentää SREG: n (en ole varma, että tätä todella tarvitaan), kirjoittaa 0x9f (RAMEND) SPL: ään (pinon osoitin) ja hyppää pääkohtaan. Viimeinen rjmp on tavallaan tarpeeton. (voisit luvata, ettei koskaan palaa pääkadulta)

  00000020 <__bad_interrupt>: 20: ef cf rjmp.-34; 0x0 <__vectors>  

Keskeytyksen oletusmenettely niille keskeytyksille, joille ei ole kirjoitettu yhtä C-kirjainta (samat säännöt kuin __vektoreille)

  00000022 <main>: 22: bb 9a sbi 0x17, 3; 23 24: c3 9a sbi 0x18, 3; 24 26: c3 98 cbi 0x18, 3; 24 28: fd cf rjmp.-6; 0x24 <main + 0x2>  

Pääprosessisi. Tiukka.

  0000002a <_exit>: 2a: f8 94 cli0000002c <__stop_program>: 2c: ff cf rjmp.-2; 0x2c <__stop_program>  

Nämä kaksi eivät ole kovin hyödyllisiä. _exit vaaditaan todennäköisesti C-standardin mukaan ja __stop_ohjelma tarvitaan, jotta se toimisi normaalisti.

todbot
2010-04-25 07:56:44 UTC
view on stackexchange narkive permalink

Mikä on mahdollinen hakemuksesi? ATtiny13: lla on 1 kt flash-muistia ja voit tehdä paljon sen kanssa C: ssä. Crt0 on avr-libc C-ajonaika. Se sisältää asioita, kuten pinon käsittely, joten voit käyttää funktioita argumenttien ja palautusarvojen kanssa.

100 tavua upotettuun C-kokoonpanoon ei ole liian huono, ja sen koko on vakio. Ohjelmalogiikan rivien kaksinkertaistaminen ei välttämättä tee siitä 200 tavua. Millä optimointitasolla olet kokoamassa? Sinun pitäisi olla "-Os". Ja miten koot tämän? Makrokansiot avr-libc -sivustolta saatavissa olevissa demoprojekteissa ovat melko hyviä ja kattavia.

Alla oleva yksinkertainen LED on / off -ohjelma vie 62 tavua ATtiny13: lla, jossa avr-gcc on "-Os". 4.3.3. CrossPack-AVR: stä:

 # sisällyttää <avr / io.h> # sisältää <avr / delay.h>int main (mitätön) {DDRB | = _BV (PB3); kun (1) {PORTB | = _BV (PB3); viive_ms (200); PORTB & = ~ _BV (PB3); viive_ms (200); }} 

_delay_ms () -kutsun poistaminen tekee siitä 46 tavua.

Suurempi esimerkki ATtiny13: ssa ovat Smart LED-prototyypit. Tämä koodi sisältää 3-kanavaisen PWM-ohjelmiston, HSV-RGB-värimuunnoksen, tilakoneen ja lukee kaksi painiketta. Sitä ei ole kirjoitettu erityisen hyvin, ja se on 864 tavua. Avr-gcc 3.x: n alla se oli vielä pienempi. (jostain syystä avr-gcc 4 on saanut lähes kaikki ohjelmat kasvamaan muutamalla tavulla)

`avr-gcc -std = c99 -Wall -Os -mmcu = attiny13 -o hei.out helloworld.c 'on makefileeni (itse luotu) asiaankuuluva rivi. ja käytän melkein identtistä koodia lukuun ottamatta LEDin kääntämistä, käytän `PORTB & = ~ (1 << LED);` ja vastaavia
Ja niin, koko on vakio, mutta jopa 46 tavua tuntuu melko painavalta, jos kaikki mitä tarvitsee tehdä, on asettaa pinokehys
jluciani
2010-04-25 17:33:20 UTC
view on stackexchange narkive permalink

crt0 on käyttöjärjestelmän käynnistysrutiini. Rutiinit suorittavat rekisterien asennuksen ja myös tietojen alustamisen.

Sisältävätkö 100 tavua keskeytysvektoritaulukon? En ole varma ATtiny13: sta, mutta ATtiny25 / 45/85: ssä on 15 keskeytysvektoria. Tämä vie jopa 30 tavua.

gcc: llä on mahdollisuus linkittää crt0-tiedostoon. Voit ottaa AVR crt0.S -tiedoston ja muokata sitä. Se ei ole kovin pitkä, joten sen ei pitäisi olla vaikea tehdä.

En näytä löytävän crt0-lähdettä, mutta crt1: ssä näyttää olevan keskeytysvektoritaulukko. Ehkä se on
En löydä sitä myöskään järjestelmästäni :( kootin kaikki työkalut lähteestä, joten ajattelin, että se olisi siellä. Jos googlesta "crt0.S atmel", pari Atmel-sovellushuomautusta käynnistyksestä, crt0: sta ja gcc: stä optimointi tulee esiin. Ehkä noissa asiakirjoissa on joitain vihjeitä.
@jlu Yritän selvittää näiden kahden välisen eron, mutta en ole vielä saanut mitään hyvää Stack Overflow'sta: http://stackoverflow.com/questions/2709998/crt0-o-and-crt1-o-whats- ero
avr-libc: llä on erilainen CRT jokaiselle AVR-sirutyypille, ja tavallisissa avr-libc-jakoissa on vain tiedoston .o-versio. ATtiny13: n osoite on osoitteessa [avr-libc-path] /avr-3/lib/crttn13.o
@todbot hmm. Ah, ok, minulla on se tiedostossa "/ avr-libc-1.6.7 / avr / lib / avr2 / attiny13 / crttn13.S"
Näyttää siltä, ​​että crt-koodi on gcrt1.S ja se on avr-libc / crt1: ssä. Uskon, että Makefile (samassa hakemistossa) kokoaa objektitiedostot eri laitteille.
mikeselectricstuff
2010-12-20 23:42:45 UTC
view on stackexchange narkive permalink

Jos sinulla on vähän tilaa, kokeile IAR: n sulautettua työpöytää - heidän ilmaisella 'kickstart' -versiollaan on 4K-sanan koodikokorajoitus, joten paljon ATTiny: lle ja todennäköisesti parempi optimointi kuin gcc

Optimointivertailu on kiistanalaista. En menisi sinne.
@tyblu Olen samaa mieltä, mutta IAR tunnetaan tuottavan pienempiä binäärejä kuin esimerkiksi avr-gcc .. Olisin kuitenkin samaa mieltä mikeselectricstuffin kanssa ja mielestäni se on järkevää neuvoa.
Leon Heller
2011-04-10 02:20:40 UTC
view on stackexchange narkive permalink

Tällaiset laitteet ohjelmoidaan usein assembleriin, mikä johtaa pienempiin suoritettaviin tiedostoihin. Kannattaa ponnistella ja oppia käyttämään sitä.

Olen samaa mieltä, mutta IMHO: n tavoitteena ei ole ohjelmoida kokonaisia ​​laitteita kokoonpanossa (tiedän, että näin tehdään usein ja tein myös tämän), vaan pystyä purkamaan ja tarkistamaan, mitä C-kääntäjä tekee selänne takana. Se tarkoittaa myös, että pystyt usein arvaamaan kääntäjän ja optimoimaan C: ssä kirjoittamasi koodin saadaksesi pienen suoritettavan koon.


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 2.0-lisenssistä, jolla sitä jaetaan.
Loading...