zaujimavost pri programovani AVR v GCC

Jan Waclawek konfera@efton.sk
Úterý Říjen 23 15:48:49 CEST 2007


Mno, 

Predovsetkym, ak programujes v C (ci v nejakom HLL), tak nemas mat vobec nijake apriorne predstavy o rychlosti, velkosti kodu, umiestnenia v pamati apod. To vsetko je vysostne pravo prekladaca si urobit ako chce, ak sa zachovaju nejake rozumne pravidla (v tomto pripade vid C99).

Inak vysvetlenie sa urcite najde v spominanom C99 niekde okolo implicitneho pretypovavania na int pri vyhodnocovani vyrazov, v sucinnosti s optimalizatorom gcc; ale nechci odo mna ako neCckara dokladne vysvetlenie... 

Mimochodom, ako sa to prelozi ak tu optimalizaciu uplne vypnes?

wek


----- Original Message ---------------

Subject: zaujimavost pri programovani AVR v GCC
   From: Richard Kaliciak <hw.kaliciak@stonline.sk>
   Date: Tue, 23 Oct 2007 15:27:06 +0200
     To: HW-news <hw-list@list.hw.cz>

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




Další informace o konferenci Hw-list