Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Liczby float na uC AVR

_Wojciech_
-
-
Posty:269
Rejestracja:1 kwie 2003, o 20:32
Lokalizacja:Bielsko-Biała
Liczby float na uC AVR

Postautor: _Wojciech_ » 1 kwie 2004, o 20:32

Mam taki problem:
Po dołożeniu do kodu programu na uC AVR AT90S8535 (w języku C) instrukcji operującej na liczbie rzeczywistej, wielkość HEX'a zwiększyła się z 840B do 2400B!
A dołożyłem tylko tyle:

Kod: Zaznacz cały

float fLiczba=0; ......... while (1) { ........... fLiczba+=0.2; .......... }
Czy ktoś zna jakieś sposoby na floaty w uC AVR? Czy panuje zasada "omijać z daleka"? Czy to zależy od kompilatora? Mam WinAVR. A może są jakieś opcje optymalizujące?

Jurek Szczesiul
-
-
Posty:175
Rejestracja:10 paź 2003, o 20:44
Lokalizacja:Białystok
Kontaktowanie:

Re: Liczby float na uC AVR

Postautor: Jurek Szczesiul » 1 kwie 2004, o 21:32

Czy ktoś zna jakieś sposoby na floaty w uC AVR? Czy panuje zasada "omijać z daleka"?
W małych kostkach omijać z daleka. W większych - 2.5 k to drobiazg.

Pozdrowienia Jurek S.

_Wojciech_
-
-
Posty:269
Rejestracja:1 kwie 2003, o 20:32
Lokalizacja:Bielsko-Biała

Postautor: _Wojciech_ » 1 kwie 2004, o 22:04

Teraz właśnie coś ciekawego zauważyłem: Po dołożeniu kolejnej liczby float i wykonaniu tej samej operacji na tej drugiej liczbie, wielkośćkodu wzrosła nieznacznie... Jakieś 44B :o :? To jakaś prawidłowość?

O, takie coś:

Kod: Zaznacz cały

float fLiczba=0; float fLiczba2=0.123; ......... while (1) { ........... fLiczba+=0.2; fLiczba2+=123.456; .......... }
A większe kostki to np. ATMega128?

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków

Postautor: Guru » 2 kwie 2004, o 05:44

Bo widzisz gdy zdeklarowałeś liczbę typu float a następnie niejawnie wykonałeś procedurę (skomplikowaną) dodawania dwóch liczb typu float to procedura ta została dodana do kodu a już potem zostaje ona tylko wywoływana przez kompilator z odpowiednimi argumentami stąd też najpierw takie programy zastraszająco szybko rosną a potem już tylko niewiele. Samo podstawienie do zmiennej liczby powoduje że kompilator zamienia liczbe np 0.2 na liczbę w kodzie heksadecymalnym a następnie wywołuje procedurę, która tą liczbę będzie rzeczywiście podstawiała w kodzie programu.
Zacznij od asemblera zrozumiesz wtedy szybko ile roboty odwala za Ciebie kompilator C i dlaczego zajmuje to tyle pamięci.
Powodzenia. 8)

_Wojciech_
-
-
Posty:269
Rejestracja:1 kwie 2003, o 20:32
Lokalizacja:Bielsko-Biała

Postautor: _Wojciech_ » 2 kwie 2004, o 06:47

Tak właśnie myślałem.
Co do asemblera, to nigdy w życiu! Łatwiej zmienić układ na większy/szybszy, niż babrać się czymś tak zakręconym :lol:

A jeszcze jedno: Czy WinAVR ma jakaś funkcję zamieniającą liczbę float na ciąg znaków? Znalazłem dtostre(......), ale mimo, że jest zadeklarowana w pliku stdlib.h, to kompilator wywala błąd (jakby jej nie było) :?

Awatar użytkownika
gawel
-
-
Posty:683
Rejestracja:24 lis 2003, o 11:19
Lokalizacja:Białystok

Postautor: gawel » 2 kwie 2004, o 08:19

Zastanów się, czy rzeczywiście liczby zmiennoprzecinkowe są ci niezbędne?

Jurek Szczesiul
-
-
Posty:175
Rejestracja:10 paź 2003, o 20:44
Lokalizacja:Białystok
Kontaktowanie:

Postautor: Jurek Szczesiul » 2 kwie 2004, o 08:49

A jeszcze jedno: Czy WinAVR ma jakaś funkcję zamieniającą liczbę float na ciąg znaków? Znalazłem dtostre(......), ale mimo, że jest zadeklarowana w pliku stdlib.h, to kompilator wywala błąd (jakby jej nie było) :?
Trochę zamieszali ( ale jest to napisane w manualu avr-libc ) - deklaracje są w stdlib ale kod w bibliotece matematycznej libm, którą trzeba dołączyć.

Pozdrowienia Jurek S.

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków

Postautor: Guru » 2 kwie 2004, o 09:08

A ja właśnie programowałem w asemblu i stosowałem w programach liczby zmiennoprzecinkowe i muszę powiedzieć że doznałem całkiem ciekawych wrażeń.

_Wojciech_
-
-
Posty:269
Rejestracja:1 kwie 2003, o 20:32
Lokalizacja:Bielsko-Biała

Postautor: _Wojciech_ » 2 kwie 2004, o 09:42

Trochę zamieszali ( ale jest to napisane w manualu avr-libc ) - deklaracje są w stdlib ale kod w bibliotece matematycznej libm, którą trzeba dołączyć.
Pozdrowienia Jurek S.
A faktycznie. Dzięki. Nawet dołożyłeś stosowne okienko do zaznaczenia w AvrSide :D Naprawdę SUPER program.

_Wojciech_
-
-
Posty:269
Rejestracja:1 kwie 2003, o 20:32
Lokalizacja:Bielsko-Biała

Postautor: _Wojciech_ » 2 kwie 2004, o 10:07

A to jeszcze raz mnie poratujcie:

Kod: Zaznacz cały

dtostre(fLiczba,Lan,1,DTOSTR_ALWAYS_SIGN);
Jak zrobić, żeby nie wyświetlało w postaci wykładniczej?
Nie rozumiem tego:
/

Kod: Zaznacz cały

** Bit value that can be passed in \c flags to dtostre(). */ #define DTOSTR_ALWAYS_SIGN 0x01 /* put '+' or ' ' for positives */ /** Bit value that can be passed in \c flags to dtostre(). */ #define DTOSTR_PLUS_SIGN 0x02 /* put '+' rather than ' ' */ /** Bit value that can be passed in \c flags to dtostre(). */ #define DTOSTR_UPPERCASE 0x04 /* put 'E' rather 'e' */
Kurde jeden malutki przykład powinni zamieszczać koło deklaracji funkcji.

Jurek Szczesiul
-
-
Posty:175
Rejestracja:10 paź 2003, o 20:44
Lokalizacja:Białystok
Kontaktowanie:

Postautor: Jurek Szczesiul » 2 kwie 2004, o 16:43

A to jeszcze raz mnie poratujcie:

Kod: Zaznacz cały

dtostre(fLiczba,Lan,1,DTOSTR_ALWAYS_SIGN);
Jak zrobić, żeby nie wyświetlało w postaci wykładniczej?
Użyć dtostrf().
dtostre() jest właśnie do postaci wykładniczej, flagi dotyczą tylko szczegółów wyświetlania znaku i wielkości litery E.

PS - cieszę się , że AvrSide się przydaje !

Pozdrowienia Jurek S.

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 19 gości