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