WINAVR GCC pomoc



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Michal Machowski" <machowsk_at_nospam_interia.pl>
Subject: WINAVR GCC pomoc
Date: Mon, 10 Jan 2005 12:34:58 +0100


Gdyby ktos wiedzial i potrafil pomocbylbym wdzieczny. Mając kawalek kodu:
//deklaracje na początku
volatile uint64_t we[12]; //pierwotnie zliczane impulsy wejsciowe
uint8_t ONE=1 //by nakarmic kompilator

i potem w procedurze przerwania:
asm volatile(
"add %A0,%2" "\n\t"
"adc %B0, _zero_reg_" "\n\t"
"adc %C0, _zero_reg_" "\n\t"
"adc %D0, _zero_reg_" "\n\t"
"adc %e0, _zero_reg_" "\n\t"
"adc %f0, _zero_reg_" "\n\t"
"adc %g0, _zero_reg_" "\n\t"
"adc %h0, _zero_reg_" "\n\t"
:"=d"(we[1])
:"d"(we[1]), "d"( ONE )
); // to jest we[0]++;

I wszystko jest pieknie tylko moim zamyslem bylo dodanie do liczby 8
bajtowej wartosci 1
a gdy zobaczymy na to asembler wyglada on tak:

//odczyt zmiennej
lds r18, 0x0084
lds r19, 0x0085
lds r20, 0x0086
lds r21, 0x0087
lds r22, 0x0088
lds r23, 0x0089
lds r24, 0x008A
lds r25, 0x008B
lds r30, 0x006C
//sumowanie
add r18, r30
adc r19, r1
adc r20, r1
adc r21, r1
adc r18, r1 //problem
adc r18, r1
adc r18, r1
adc r18, r1
//zapis
sts 0x0084, r18
sts 0x0085, r19
sts 0x0086, r20
sts 0x0087, r21
sts 0x0088, r22
sts 0x0089, r23
sts 0x008A, r24
sts 0x008B, r25
I wszystko bylo by OK. gdyby nie to ze zamiast rejestrow r22-r25 dla
wyzszej czesci liczby wsadza mi tam r18. Czy jest jakiś sposob na
rozwiazanie tego problemu ?

pozdrawiam
Michal Machowski




Poprzedni Następny
Wiadomość
Spis treści
From: "Piotrek Sz." <zumek_at_nospam_WYTNIJ.gazeta.pl>
Subject: Re: WINAVR GCC pomoc
Date: Mon, 10 Jan 2005 18:47:13 +0000 (UTC)


Witam.
Miałem kiedyś podobny problem , a ponieważ nie jestem znawcą C to poszedłem
najkrótszą drogą (jaka znałem) do celu i wyszło mi cos takiego:
#include <avr/io.h>
#include <avr/signal.h>

volatile uint64_t we[12]; //pierwotnie zliczane impulsy wejsciowe
volatile uint8_t ONE=1; //by nakarmic kompilator

SIGNAL (SIG_OVERFLOW1)
{

asm volatile
(
"add r16,%2" "\n\t"
"adc r17, _zero_reg_" "\n\t"
"adc r18, _zero_reg_" "\n\t"
"adc r19, _zero_reg_" "\n\t"
"adc r20, _zero_reg_" "\n\t"
"adc r21, _zero_reg_" "\n\t"
"adc r22, _zero_reg_" "\n\t"
"adc r23, _zero_reg_" "\n\t"
:"=a"(we[0])
:"a"(we[0]), "r"( ONE )
); // to jest we[0]++;
}
..
Efekt kompilacji to:
..
asm volatile
aa: 00 91 62 00 lds r16, 0x0062
ae: 10 91 63 00 lds r17, 0x0063
b2: 20 91 64 00 lds r18, 0x0064
b6: 30 91 65 00 lds r19, 0x0065
ba: 40 91 66 00 lds r20, 0x0066
be: 50 91 67 00 lds r21, 0x0067
c2: 60 91 68 00 lds r22, 0x0068
c6: 70 91 69 00 lds r23, 0x0069
ca: 80 91 60 00 lds r24, 0x0060
ce: 08 0f add r16, r24
d0: 11 1d adc r17, r1
d2: 21 1d adc r18, r1
d4: 31 1d adc r19, r1
d6: 41 1d adc r20, r1
d8: 51 1d adc r21, r1
da: 61 1d adc r22, r1
dc: 71 1d adc r23, r1
de: 00 93 62 00 sts 0x0062, r16
e2: 10 93 63 00 sts 0x0063, r17
e6: 20 93 64 00 sts 0x0064, r18
ea: 30 93 65 00 sts 0x0065, r19
ee: 40 93 66 00 sts 0x0066, r20
f2: 50 93 67 00 sts 0x0067, r21
f6: 60 93 68 00 sts 0x0068, r22
fa: 70 93 69 00 sts 0x0069, r23
..
Nie wiem czy Ci się nada , ale lepsze to niz nic ;)

Pozdrawiam
Piotrek


--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Poprzedni Następny
Wiadomość
Spis treści
From: Marek Michalkiewicz <spamtrap_at_nospam_amelek.gda.pl.invalid>
Subject: Re: WINAVR GCC pomoc
Date: Mon, 10 Jan 2005 20:07:22 +0100 (CET)


Michal Machowski <machowsk_at_nospam_interia.pl> wrote:

"adc %e0, _zero_reg_" "\n\t"
"adc %f0, _zero_reg_" "\n\t"
"adc %g0, _zero_reg_" "\n\t"
"adc %h0, _zero_reg_" "\n\t"

Tu jest problem: tylko litery A...D w ten sposób działają - jak pewnie
by powiedział Bill G., 32 bity wystarczą dla wszystkich :)

Dałoby się dorobić też obsługę E...H - gcc/config/avr/avr.c na samym
początku funkcji print_operand. Jednak dorobienie pełnej obsługi typów
64-bitowych na AVR (tak, by po prostu można było zwiększyć zmienną o 1
operatorem ++ i kod wyszedł optymalny) to znacznie trudniejsza sprawa.

Marek


Poprzedni Następny
Wiadomość
Spis treści
From: "Michal Machowski" <machowsk_at_nospam_interia.pl>
Subject: Re: WINAVR GCC pomoc
Date: Tue, 11 Jan 2005 06:59:04 +0100


Witam.
Dziekuje wszystkim za pomoc. Mysle że mi metoda reczna wystarczy, nie czuje
sie na silach by grzebac w konfiguracji winavr :-).
pozdrawiam.
Michal Machowski