Forum: Compiler & IDEs AutoCast im AVR-GCC vs GCC


von D a v i d K. (oekel) Benutzerseite


Lesenswert?

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

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Die Regeln sind immer die die selben, zu finden unter „integral 
Promotion“ im C-Stabdard. Eine der Regeln besagt vereinfacht, daß 
Berechnungen immer mindestens mit dem Datentyp int durchgeführt werden.

Der Unterschied ist, daß ein int auf dem AVR nur 16bit breit ist, auf 
dem PC aber 32. Damit erklären sich unterschiedlichen Wertebereiche.

Oliver

: Bearbeitet durch User
von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Oliver S. schrieb:
> Der Unterschied ist, daß ein int auf dem AVR nur 16bit breit ist, auf
> dem PC aber 32.

Hab ich denn die Möglichkeit den PC Std. ebenfalls auf die 16 zu 
zwängen, damit mir derartige Dinge früher ins Auge springen?

Grüße David

von Oliver S. (oliverso)


Lesenswert?

Nein

Oliver

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

D a v i d K. schrieb:
> Hab ich denn die Möglichkeit den PC Std. ebenfalls auf die 16 zu
> zwängen,

Du könntest einen C-Compiler für DOS verwenden.

von Dirk B. (dirkb2)


Lesenswert?

Der Programmierer darf auch nachdenken.
1
uint32_t m = (uint32_t)t * .....

von Nico W. (nico_w)


Lesenswert?

Man kann auch ein Test-Framework wie z.B. Unity nehmen und die Größe von 
int, long und Konsorten einfach einstellen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.