Keil 8051 - GCC AVR

Jun 15, 2008 3 Replies

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.


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.

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.

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.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required