zaujimavost pri programovani AVR v GCC

andrej jancura hw_aj@zoznam.sk
Úterý Říjen 23 18:11:19 CEST 2007


Ahoj Riso,

na toto sa musis spytat priamo autora toho kompilatora... Ine vysvetlenie
podla mna nie je. 

Inak toto je konkretny priklad toho preco si robit vlastne poznamky ku
kompilatoru, (okrem ineho sa stane z Teba velky guru :o) ). Mne sa ale
osvedcilo programovat v C sposobom ala asembler, teda nepouzivat ziadne
krkolomne vyrazy a funkcie. Na PIC my vysiel vzdy najkratsi optimalny kod. V
pripade AVR mas vsak moznosti viacere a zalezi len na tom, ako to ktory
kompilator prelozi.

Mimochodom mohol by to byt pekny test jednotlivych kompilatorov. Na AVR su
GCC, CodeVision, ICC, IAR a este par dalsich.

A. 

p.s.: Jeden dovod ma predsa len napadol, ked budes robit niekedy reverz
kodu, s velmi vysokou pravdepodobnostou budes moct povedat, ktory kompilator
sa pouzil...



> Dobry den,
> 
> pri pokusoch s AVR a Eclipse+WinAVR som ako prve skusil kratky program:
> ---------- begin ----------
> #include <avr/io.h>
> 
> void main( void){
>	  unsigned char   counter = 0;
>	  while(1){
>		  PORTA = counter++;
>	  }
> }
> ---------- end ----------
> 
> Po spusteni sa mi to zdalo pomalsie, ako som cakal. Tu je dovod:
> ---------- begin ----------
> void main( void){
>    ce:  80 e0 	  ldi	  r24, 0x00	  ; 0
>    d0:  90 e0 	  ldi	  r25, 0x00	  ; 0
>	  unsigned char   counter = 0;
>	  while(1){
>		  PORTA = counter++;
>    d2:  8b bb 	  out	  0x1b, r24	  ; 27
>    d4:  01 96 	  adiw	  r24, 0x01	  ; 1
>    d6:  fd cf 	  rjmp	  .-6		  ; 0xd2 <main+0x4>
> ---------- end ----------
> (counter je v R24 a R25 = 16 bitov)
> 
> 
> 
> Po prepisani programu na:
> ---------- begin ----------
> #include <avr/io.h>
> 
> void main( void){
>	  unsigned char   counter = 0;
>	  while(1){
>		  counter++;
>		  PORTA = counter;
>	  }
> }
> ---------- end ----------
> 
> sa to prelozi takto:
> ---------- begin ----------
> void main( void){
>    ce:  80 e0 	  ldi	  r24, 0x00	  ; 0
>	  unsigned char   counter = 0;
>	  while(1){
>		  counter++;
>    d0:  8f 5f 	  subi	  r24, 0xFF	  ; 255
>		  PORTA = counter;
>    d2:  8b bb 	  out	  0x1b, r24	  ; 27
>    d4:  fd cf 	  rjmp	  .-6		  ; 0xd0 <main+0x2>
> ---------- end ----------
> (counter je v R24 = 8 bitov)
> 
> 
> Vie mi to niekto vysvetlit?
> 
> Richard Kaliciak
> _______________________________________________
> HW-list mailing list	-  sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Content-Disposition: form-data; name="send"

Odoslať


--- reklama -----------------------------------------------------
Nájdi už konečne tú správnu cestu!
http://mapy.zoznam.sk



Další informace o konferenci Hw-list