Bł±d kompilacji AVRGCC przy dzieleniu liczby 64-bitowej ? jak to naprawić?

AVRGCC i dzielenie liczby 64 bitowej - Pomocy!





Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: =?iso-8859-2?Q?Micha=B3_Lankosz?= <nie_at_nospam_lubie.spamu>
Subject: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Thu, 9 May 2002 23:48:56 +0200


Witam

Wła¶nie dopadł mnie problem z dzieleniem liczby long long (64 bitowej) pod
AVRGCC. W skrócie mam program:

long power, temp;
long long energy; // zmienna 64 bit;

// program.....
temp=energy; // tu jest ok
energy += power; // tu też ok
// co¶
temp=energy/3600; // a tutaj kompilator wywala co¶ takiego:

C:\AVRGCC\BIN\..\lib\gcc-lib\avr\3.1\..\..\..\..\avr\bin\ld.exe: region text
is full (pwrmet.elf section .text)
C:\AVRGCC\BIN\MAKE.EXE: * [pwrmet.elf] Error 1

próbowałem metodę rzutowania: temp=(long)(energy/3600);
maski: temp=(energy/3600) & 0xffffffff;
deklaracji zmiennej energy: int64_t energy;
a nawet przypisywanie wyniku do zmiennej tego samego typu: zmienna_64bit =
energy/3600;
i dzielenia 2-ch zmiennych (zastąpiona stała 3600).

Nie pomaga.
Czy kto¶ się spotkał z takim problemem i wie co zrobić?
Acha, jak napiszę np temp=energy*3600; to kompiluje się bezbłędnie.

--
Michał, SQ9FQQ http://sq9fqq.prv.pl/
GG:374157 http://free.ngo.pl/~sp9zcj/
e-mail: mike2001 (małpa) tlen.pl



Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: "Andy" <anok_at_nospam_ceti.pl>
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Fri, 10 May 2002 00:52:00 +0200


"Michał Lankosz" <nie_at_nospam_lubie.spamu> wrote in message news:abeqqj$a3b$1_at_nospam_news.tpi.pl...
...
C:\AVRGCC\BIN\..\lib\gcc-lib\avr\3.1\..\..\..\..\avr\bin\ld.exe: region text
is full (pwrmet.elf section .text)
C:\AVRGCC\BIN\MAKE.EXE: * [pwrmet.elf] Error 1
...

strzelam w ciemno
jesli napisal regon text is full
to tak jaby skonczyla sie pamiec flash

w sensie bin wychodzi wiekszy
niz moze sie zmiescic do danego typu procka

Andrzej




Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: =?iso-8859-2?Q?Micha=B3_Lankosz?= <nie_at_nospam_lubie.spamu>
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Fri, 10 May 2002 01:16:15 +0200


strzelam w ciemno
jesli napisal regon text is full
to tak jaby skonczyla sie pamiec flash
Flasha mam jeszcze ze 3kB. Zresztą w nowym projekcie, gdzie nic prawie nie
mam też się tak dzieje.

Michał


Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: "Andy" <anok_at_nospam_ceti.pl>
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Fri, 10 May 2002 01:50:35 +0200


"Michał Lankosz" <nie_at_nospam_lubie.spamu> wrote in message news:abevu3$e8d$1_at_nospam_news.tpi.pl...
strzelam w ciemno
jesli napisal regon text is full
to tak jaby skonczyla sie pamiec flash
Flasha mam jeszcze ze 3kB. Zresztą w nowym projekcie, gdzie nic prawie nie
mam też się tak dzieje.


no to nie wiem w czym problem
dodam, ze skompilowalem ten przyklad, ktory podales i nie bylo bledow
przy kompilacji

Andrzej




Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: =?iso-8859-2?Q?Micha=B3_Lankosz?= <nie_at_nospam_lubie.spamu>
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Fri, 10 May 2002 09:00:31 +0200


no to nie wiem w czym problem
dodam, ze skompilowalem ten przyklad, ktory podales i nie bylo bledow
przy kompilacji
Rzeczywi¶cie. Napisałem sobie jeszcze prostszy programik, bo poprzedni miał
ok 2k kodu przed wprowadzeniem liczby long long, i działa
#include <io.h>
#include <io8535.h>
long long dluga;
long temp;
int main (void)
{
dluga=0;
for(;;)
{
temp = dluga/3600;
outp(temp,PORTC);
dluga++;
};
}
i to zajmuje ponad 6kB!! Jak zmienną dluga przedeklaruję na 32 bit to kod
skraca się do 350 bajtów, a podmiana dzielenia na mnożenie do 1,4kB. Nie
zdawałem sobie sprawy ile może zżerać takie dzielenie. Będę musiał to
rozwiązać inaczej - albo optymalizacją albo asemblerem. Chyba że ma kto¶
pomysł? Dzięki za pomoc.

Michał


Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: "jerry1111" <jerry1111_at_nospam_wp.pl>
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Fri, 10 May 2002 10:58:59 +0200


Zajmuje bo kompilator wlacza biblioteke od matmy ;)
Napisz wlasna funkcje div64 to nie bedzie zajmowac.

jerry

Hint: Zamiast dzielic /3600 lepiej pomnozyc przez odwrotnosc (duuuzo
krotszy kod bedzie, a Ty i tak dzielisz przez STALA).



Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: marekmSPAM_at_nospam_amelek.gda.pl (Marek Michalkiewicz)
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Fri, 10 May 2002 10:09:31 +0000 (UTC)


Michał Lankosz <nie_at_nospam_lubie.spamu> wrote:
i to zajmuje ponad 6kB!! Jak zmienną dluga przedeklaruję na 32 bit to kod
skraca się do 350 bajtów, a podmiana dzielenia na mnożenie do 1,4kB. Nie
zdawałem sobie sprawy ile może zżerać takie dzielenie. Będę musiał to
rozwiązać inaczej - albo optymalizacją albo asemblerem. Chyba że ma kto¶
pomysł? Dzięki za pomoc.

Sprawa jest prosta - _divdi3.o w libgcc.a zajmuje ponad 5 KB :)
Mnożenie i dzielenie dla 8, 16 i 32 bitów są napisane w asemblerze
i ręcznie optymalizowane (w dodatku za jednym razem dostajemy iloraz
i resztę), a wersje dla 64 bitów są napisane w C (libgcc2.c w źródłach
GCC gdyby kto¶ był ciekawy jak to jest zrobione) i w ogólnym przypadku
(dzielenie dwóch liczb 64-bitowych, wynik również 64-bitowy) wychodzi
z tego sporo kodu...

Dzieląc przez stałą (i to niewielką) można by sporo upro¶cić, robiąc
to dzielenie samemu. Byłoby jeszcze pro¶ciej, gdyby dało się wszystko
przeskalować i dzielić przez 2 do jakiej¶ potęgi (przesunąć w prawo).
Ogólnie to jest tak, że wprawdzie avr-gcc obsługuje liczby 64-bitowe,
ale lepiej ich nie używać bo kod wychodzi bardzo nieoptymalny.

Marek


Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: Simius <simius_at_nospam_o2.pl>
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Fri, 10 May 2002 16:49:34 GMT


Wiadomo¶ć napisana przez: Marek Michalkiewicz:

Michał Lankosz <nie_at_nospam_lubie.spamu> wrote:
i to zajmuje ponad 6kB!! Jak zmienną dluga przedeklaruję na 32 bit to kod
skraca się do 350 bajtów, a podmiana dzielenia na mnożenie do 1,4kB. Nie
zdawałem sobie sprawy ile może zżerać takie dzielenie. Będę musiał to
rozwiązać inaczej - albo optymalizacją albo asemblerem. Chyba że ma kto¶
pomysł? Dzięki za pomoc.

Sprawa jest prosta - _divdi3.o w libgcc.a zajmuje ponad 5 KB :)
Mnożenie i dzielenie dla 8, 16 i 32 bitów są napisane w asemblerze
i ręcznie optymalizowane (w dodatku za jednym razem dostajemy iloraz
i resztę), a wersje dla 64 bitów są napisane w C (libgcc2.c w źródłach
GCC gdyby kto¶ był ciekawy jak to jest zrobione) i w ogólnym przypadku
(dzielenie dwóch liczb 64-bitowych, wynik również 64-bitowy) wychodzi
z tego sporo kodu...

Dzieląc przez stałą (i to niewielką) można by sporo upro¶cić, robiąc
to dzielenie samemu. Byłoby jeszcze pro¶ciej, gdyby dało się wszystko
przeskalować i dzielić przez 2 do jakiej¶ potęgi (przesunąć w prawo).
Ogólnie to jest tak, że wprawdzie avr-gcc obsługuje liczby 64-bitowe,
ale lepiej ich nie używać bo kod wychodzi bardzo nieoptymalny.

Marek

Procedurka dzielenia liczby 48-bitowej przez 32-bitowa, ktora sobie napisalem w
asemblerze jeszcze na Z80, po przekodowaniu na AVR zajmuje tylko kilkadziesiat
bajtow. Bez trudu mozna ja rozszerzyc. Kto w ogole wymyslil programowanie
mikrokontrolerow w jezykach wysokiego poziomu??? A Bascom to juz zupelne
lamerstwo.




Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: =?iso-8859-2?Q?Micha=B3_Lankosz?= <nie_at_nospam_lubie.spamu>
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Fri, 10 May 2002 23:47:49 +0200


Procedurka dzielenia liczby 48-bitowej przez 32-bitowa, ktora sobie
napisalem w
asemblerze jeszcze na Z80, po przekodowaniu na AVR zajmuje tylko
kilkadziesiat
bajtow. Bez trudu mozna ja rozszerzyc.
Na 51 pisałem tylko w asm i popełniłem procedurę dzielenia liczby
czterobajtowej, później zmodyfikowana w celu przekształcania liczby 4bajt na
string dziesiętny dla LCD. Po pewnym czasie sam się gubiłem we własnej
procedurze. Na AVR też zacząłem w asm, a teraz przechodzę na C. Chcę po
prostu zdobyć jakie¶ do¶wiadczenie, a przy okazji męczę pracę dyplomową na
8535. Jestem ciekaw i kiedy¶ to sprawdzę, jak IAR sobie radzi z długimi
dzieleniami, ale nie wiem, czy obsługuje on 64bit.

A swoj problem rozwiążę w inny sposób, aby nie używać 64bit.

Kto w ogole wymyslil programowanie
mikrokontrolerow w jezykach wysokiego poziomu??? A Bascom to juz zupelne
lamerstwo.
Była kiedy¶ dyskusja na ten temat. Nie uważam pisania w C na uC za
lamerstwo. Jest to znaczne ułatwienie szczególnie, gdy program ma być
funkcjonalny (niekoniecznie wydajny), przy niewielkim nakładzie czasowym
pisania i poprawiania kodu.
To tak jakby mówić, że lamerstwem jest kupienie Pentiuma 300 z Windowsem,
żeby działał tak szybko jak stary 486 z DOS-em.

--
Michał, SQ9FQQ http://sq9fqq.prv.pl/
GG:374157 http://free.ngo.pl/~sp9zcj/
e-mail: mike2001 (małpa) tlen.pl



Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: Simius <simius_at_nospam_o2.pl>
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Fri, 10 May 2002 23:32:02 GMT




Wiadomo¶ć napisana przez: Michał Lankosz:

Na 51 pisałem tylko w asm i popełniłem procedurę dzielenia liczby
czterobajtowej, później zmodyfikowana w celu przekształcania liczby 4bajt na
string dziesiętny dla LCD. Po pewnym czasie sam się gubiłem we własnej
procedurze. Na AVR też zacząłem w asm, a teraz przechodzę na C. Chcę po
prostu zdobyć jakie¶ do¶wiadczenie, a przy okazji męczę pracę dyplomową na
8535. Jestem ciekaw i kiedy¶ to sprawdzę, jak IAR sobie radzi z długimi
dzieleniami, ale nie wiem, czy obsługuje on 64bit.

A swoj problem rozwiążę w inny sposób, aby nie używać 64bit.

Ostatni program, ktory napisalem na '51, wielofunkcyjnego urzadzenia
pomiarowego, liczyl sobie aż i tylko 32kB kodu asm razem ze stringami, w tym
48-bitowe procedury mat., obsluga kilku roznych protokolow transmisji
szeregowej, procedury szyfrujace, etc. Nie przypominam sobie, abym sie
kiedykolwiek w czyms pogubil. To tylko kwestia dyscypliny.



Kto w ogole wymyslil programowanie
mikrokontrolerow w jezykach wysokiego poziomu??? A Bascom to juz zupelne
lamerstwo.
Była kiedy¶ dyskusja na ten temat. Nie uważam pisania w C na uC za
lamerstwo. Jest to znaczne ułatwienie szczególnie, gdy program ma być
funkcjonalny (niekoniecznie wydajny), przy niewielkim nakładzie czasowym
pisania i poprawiania kodu.
To tak jakby mówić, że lamerstwem jest kupienie Pentiuma 300 z Windowsem,
żeby działał tak szybko jak stary 486 z DOS-em.

--
> Michał, SQ9FQQ http://sq9fqq.prv.pl/
> GG:374157 http://free.ngo.pl/~sp9zcj/
> e-mail: mike2001 (małpa) tlen.pl

Pospiech jest dobry przy lapaniu pchel. W asemblerze zrobisz bardziej
funkcjonalny program, a to z prostego powodu: wiecej Ci sie zmiesci w
ograniczonej pamieci uC. Dowodem chociazby niniejszy temat. Stosowanie jezykow
wysokiego poziomu prowadzi w prostej linii do bezzasadnego stosowania
procesorow z wyzszej polki tam, gdzie w zupelnosci wystarczylaby wersja
podstawowa. Nie wszystkie rzeczy nawet dadza sie wykonac w inny sposob niz w
asemblerze. Jak zapewnisz sobie np. scisla kontrole nad czasem wykonania
procedury, albo zapewnisz staly czas wykonania przerwania, bez wzgledu na
mozliwe warunki?
O lamerstwie pisalem w odniesieniu do Bascom-a. Kto nie potrafi nauczyc sie
kilkunastu rozkazow uC, niech sie nie bierze za mikrokontrolery. To wyrabia zle
nawyki, bo lenistwo i korzystanie z cudzej pracy jest wlasnie zlym nawykiem.
Oducza samodzielnego myslenia. Jesli ktos chce budowac z gotowych klockow, niech
sobie kupi Lego.
Stawianie pierwszych krokow w elektronice od razu od uC przypomina troche
lapanie sie za kose na nie zaoranym jeszcze polu.






Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: <mstanisz_at_nospam_poczta.onet.pl>
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: 14 May 2002 09:43:19 +0200


Ostatni program, ktory napisalem na '51, wielofunkcyjnego urzadzenia
pomiarowego, liczyl sobie aż i tylko 32kB kodu asm razem ze stringami, w tym
48-bitowe procedury mat., obsluga kilku roznych protokolow transmisji
szeregowej, procedury szyfrujace, etc. Nie przypominam sobie, abym sie
kiedykolwiek w czyms pogubil. To tylko kwestia dyscypliny.

<ciach>

O Dżizas, jaki hardcore'owiec... Nie ma się czym chwalić. Czas jest znacznie
cenniejszy.

I żeby nie było - asembler trzeba znać (jeden projekt wystarczy), ale kobył w
nim pisać nie ma sensu.

Marcin (wła¶nie skończyłem swój pierwszy projekt na AVR, w asemblerze -
następny na pewno w AVR-GCC)



--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: Simius <simius_at_nospam_o2.pl>
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Tue, 14 May 2002 15:27:48 GMT




Wiadomo¶ć napisana przez: mstanisz_at_nospam_poczta.onet.pl:

O Dżizas, jaki hardcore'owiec... Nie ma się czym chwalić. Czas jest znacznie
cenniejszy.

I żeby nie było - asembler trzeba znać (jeden projekt wystarczy), ale kobył w
nim pisać nie ma sensu.

Marcin (wła¶nie skończyłem swój pierwszy projekt na AVR, w asemblerze -
następny na pewno w AVR-GCC)

--
> Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Nie chodzi o chwalenie, tylko konstatacje, ze jezyki wysokiego poziomu pasuja do
mikrokontrolerow jak piesc do nosa. Za duzo kodu, za wolne dzialanie, brak
mozliwosci zrealizowania niektorych rzeczy. Czas jest cenniejszy? Prawdopodobnie
taka sama idea przyswieca tworcom Windy. Efekt wiadomy. Czas wykonania programu
jest wazniejszy niz czas jego pisania. Lenistwo, które bywa motorem postepu, w tym
przypadku przynosi tylko szkody.
Oczywiscie, jesli ktos pisze sobie w ramach hobby program zapalania lampek na
choince, niech robi w czym chce. Jezeli jednak wchodzi w gre urzadzenie, ktore
bedzie sprzedawane, sprawa wyglada zupelnie inaczej. Koszt wiekszego procesora lub
zewnetrznej pamieci programu moze byc decydujacy, a czasu na programowanie, biorac
pod uwage caly cykl produkcyjny, z reguly wystarcza. Chyba, ze programista
dupowaty. A bedzie taki zawsze, jesli nabierze zwyczaju wymiotowania na widok
asemblera.








Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: "jerry1111" <jerry1111_at_nospam_wp.pl>
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Sat, 11 May 2002 11:04:50 +0200


8535. Jestem ciekaw i kiedy¶ to sprawdzę, jak IAR sobie radzi z długimi
dzieleniami, ale nie wiem, czy obsługuje on 64bit.

Obsluguje (ale wersja nie na '51)

jerry



Poprzedni Następny
Wiadomo¶ć
Spis tre¶ci
From: marekmSPAM_at_nospam_amelek.gda.pl (Marek Michalkiewicz)
Subject: Re: AVRGCC i dzielenie liczby 64 bitowej - Pomocy!
Date: Sat, 11 May 2002 08:37:58 +0000 (UTC)


Simius <simius_at_nospam_o2.pl> wrote:
bajtow. Bez trudu mozna ja rozszerzyc. Kto w ogole wymyslil programowanie
mikrokontrolerow w jezykach wysokiego poziomu??? A Bascom to juz zupelne
lamerstwo.

Akurat GCC całkiem nieźle optymalizuje kod, z wyjątkiem działań na liczbach
64-bitowych - są źródła więc wszystko da się poprawić, tylko musiałby być
kto¶ chętny... Pisząc w asemblerze możemy na ogół zyskać trochę pamięci,
ale za to tracimy dużo czasu, a tego zwykle nie ma w nadmiarze.

Gdyby nie było GCC i za kompilator C dla AVR (taki komercyjny, bez źródeł,
zabezpieczony kluczem sprzętowym) trzeba by płacić kilka tysięcy PLN, to
faktycznie zastanawiałbym się czy ma to sens...

Marek