Keil 8051 - GCC AVR

Na stronie Sensiriona:

formatting link
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.

Reply to
Johnnie
Loading thread data ...

Johnnie przemówił ludzkim głosem:

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.

Reply to
Zbych

W artykule <g33ajk$itf$ snipped-for-privacy@nemesis.news.neostrada.pl> Johnnie napisalu:

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.

Reply to
JS

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.

Reply to
J.F.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.