zaujimavost pri programovani AVR v GCC

Petr Tomasek tomasek@etf.cuni.cz
Úterý Říjen 23 17:25:57 CEST 2007


On Tue, Oct 23, 2007 at 03:27:06PM +0200, Richard Kaliciak wrote:
> 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

Nemuze to souviset s tim, ze vsechny PORT*, DDR*, PIN*, atd.
registry jsou nadefinovany jako "volatile"?

(Z pochopitelnych duvodu: napr. pokud potrebujeme zapsat hned
za sebou na urcity port dve ruzne hodnoty = treba vytvorit
kraticky pulz:

  PORTX = 1;
  PORTX = 0;

kompilator by to - pokud by PORTX nebyl "volatile" zoptimalizoval
tak, ze by provedl jenom druhou instrukci...)

P.T.

-- 
Petr Tomasek <http://www.etf.cuni.cz/~tomasek>
Jabber: butrus@jabbim.cz
SIP: butrus@ekiga.net



Další informace o konferenci Hw-list