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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von D a v i d K. (oekel) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
4 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Nein

Oliver

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Der Programmierer darf auch nachdenken.
1
uint32_t m = (uint32_t)t * .....

von Nico W. (nico_w)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.