Hi,
ich habe aus meinem gesamten AVR-Project ein CMake-Projekt gebaut, dass
zwei Targets baut. 1x mit TestRoutinen (So eine Art Junit-Tests, jedoch
NOCH ohne schönes Framework) und 1x das HEX.
Beim betrachten des folgenden Codes:
1 | uint16_t correctedTankTemperature(uint16_t t) {//t = 900 +-90
|
2 | uint32_t m = t * a + b;//a = 1000 +- 200
|
3 | return divideCommerciallyRound(m, FIXPOINT_MOVEMENT);//1000
|
4 | }
|
fällt recht schnell auf, dass man den Parameter "tankTemperature" besser
auf uint32_t setzen sollte, da die 16bit in der Multiplikation bereits
überlaufen bevor sie in "m" gespeichert werden.
In der Praxis passiert auch genau dies auf dem AVR.
Witzigerweise passiert es jedoch NICHT beim Ausführen des gleichen Codes
(mit normalen GCC compiliert) auf dem PC.
Daher die Frage, wer/wie/was castet dort automatisch, dass die oben
sichtbare Methode bereits ohne Überlauf genau das tut was es soll?
Folgefrage:
Wo finde ich weitere Infos die mir genau solche Unterschiede der
Compiler/Präprozessoren auflisten, damit ich mich in Zukunft etwas
besser/mehr auf meine Testroutinen verlassen kann?
Grüße David