RTV forum PL | NewsGroups PL

Różnice w konwersji typu float między Keil 8051 a GCC AVR dla SHTxx

Keil 8051 - GCC AVR

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Różnice w konwersji typu float między Keil 8051 a GCC AVR dla SHTxx

Johnnie
Guest

Sun Jun 15, 2008 3:49 pm   



Na stronie Sensiriona:
http://www.sensirion.com/pdf/product_information/Sample_Code_humidity_sensor_SHTxx.pdf
jest przykladowy program w C (Keil) na 8051 do obslugi czujnika temperatury
i wilgotnosci SHTxx. Przerabiam go na AVR (GCC) i mam problem z konwersja:

// definicje
typedef union
{ unsigned int i;
float f;
} value;
value humi_val,temp_val;

// krytyczna konwersja
humi_val.f=(float)humi_val.i;

GCC zle oblicza humi_val.f, Keil nie ma tego problemu. Sprawe rozwiazuje
zastosowanie dodatkowej zmiennej:

// rozwiazanie
float temp=(float)humi_val.i;
humi_val.f=temp;

Czy to jest blad GCC, czy taka operacja moze dawac rozne wyniki w zaleznosci
od kompilatora?

J.

Zbych
Guest

Sun Jun 15, 2008 4:00 pm   



Johnnie przemówił ludzkim głosem:

Quote:
Czy to jest blad GCC, czy taka operacja moze dawac rozne wyniki w zaleznosci
od kompilatora?

Prawdopodobnie problem leży w tym, że zmienna źródłowa i docelowa
zajmują ten sam adres i w trakcie konwersji zmienna int jest modyfikowana.

J.F.
Guest

Sun Jun 15, 2008 6:24 pm   



On Sun, 15 Jun 2008 16:49:13 +0200, Johnnie wrote:
Quote:
typedef union
{ unsigned int i;
float f;
} value;
value humi_val,temp_val;

// krytyczna konwersja
humi_val.f=(float)humi_val.i;

GCC zle oblicza humi_val.f, Keil nie ma tego problemu. Sprawe rozwiazuje
zastosowanie dodatkowej zmiennej:

Czy to jest blad GCC, czy taka operacja moze dawac rozne wyniki w zaleznosci
od kompilatora?

Bo ja wiem czy blad kompilatora .. chyba nie do tego unia sluzy.
trzeba by zajrzec w kod, ale owszem - optymalizujacy kompilator moglby
przekazac dwa adresy procedurze konwersji, zajechala by sobie dane
w trakcie pracy ..

J.

JS
Guest

Sun Jun 15, 2008 7:52 pm   



W artykule <g33ajk$itf$1@nemesis.news.neostrada.pl> Johnnie napisalu:

Quote:
// definicje
typedef union
{ unsigned int i;
float f;
} value;
value humi_val,temp_val;

// krytyczna konwersja
humi_val.f=(float)humi_val.i;

Czy to jest blad GCC, czy taka operacja moze dawac rozne wyniki w zaleznosci
od kompilatora?

IMO jest to poprawny program w C. GCC realizuje "nieelementarne" przekształcenia
jako wywołania funkcji bibliotecznych i prawdopodobnie tam jest błąd - funkcja
zakłada, że źródło i wynik się nie nakładają. Może być jednak i tak, że ma
prawo tak przyjąć, a to kompilator nie wywiązuje się z obowiązku utworzenia
kopii danych.

--
Pozdrawiam!
Jarosław Szynal

elektroda NewsGroups Forum Index - Elektronika Polska - Różnice w konwersji typu float między Keil 8051 a GCC AVR dla SHTxx

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map