mikrocontroller.net

Forum: Compiler & IDEs Merkwürdige Compilerwarnung


Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Gemeinde,

ich hab ein kleines Problem mit einer Compilerwarnung. Folgender 
Codeausschnitt (gekürzt) erzeugt eine Warnung, das Programm läuft auch 
nicht korrekt.

#define F_CPU 8000000L

#define T_HALF_PERIOD3       2000   // us -> 4000us period = 250 Hz
#define CNT_HALF_PERIOD    (T_HALF_PERIOD3 * F_CPU / 4 / 1000000)   // compiler warning and program malfunction
#define CNT_1_US             (F_CPU / 4 / 1000000)

  int t_gate, t_low=0, t_high;

      for(t_gate = 20*CNT_1_US; t_gate < 500*CNT_1_US; t_gate += 4*CNT_1_US) {
        t_low = CNT_HALF_PERIOD - 2*t_gate;
        GATE_ON;
        _delay_loop_2(20*CNT_1_US);    
        ZEROCROSS_OFF;
        _delay_loop_2(t_gate);
        GATE_OFF;
        _delay_loop_2(t_low);
        GATE_ON;
        _delay_loop_2(t_gate);      
        ZEROCROSS_ON;
        _delay_loop_2(20*CNT_1_US);
        GATE_OFF
        _delay_loop_2(t_high);
      }


Das AVR-Studio 4.18 mit avr gcc 2010???? gibt die Warnung

"warning: integer overflow in expression"

aus.

Das bezieht sich auf die Zeile(n)

t_low = CNT_HALF_PERIOD - 2*t_gate;

Warum? Wenn man die Zahlen durchrechnet, kommt 4000-2*t_gate raus, das 
ist doch perfekt. Nur wenn man für CNT_HALF_PERIOD die einfache Zahl 
4000 ins #define reinschreibt, kommt keine Warnung und das Programm 
läuft korrekt. Erklärungen? Berechnet der Compiler den konstanten 
Ausdruck nicht zur Compilezeit? Auch wenn man alle Konstanten mit der 
Endung L versieht, geht es nicht. Ideen?

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
#define F_CPU 8000000L
#define T_HALF_PERIOD3       2000   // us -> 4000us period = 250 Hz
> T_HALF_PERIOD3 * F_CPU

8000000L * 2000
ist wohl etwas mehr las Long

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhhh, hab ich auch gerade gemerkt!!!!
Kopfrechnen mal wieder schwach!
Trotzdem Danke!

Eine LL Endung wirkt Wunder.

F_CPU 8000000LL

Autor: Ordner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> Berechnet der Compiler den konstanten
> Ausdruck nicht zur Compilezeit?

und wenn bei dieser Berechnung der Overflow auftritt? Bereichsgrenzen 
wird es doch auch bei den Berechnungen zum compilerzeitpunkt geben?!

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> Eine LL Endung wirkt Wunder.

Es hätte auch genügt, den zweiten Operanden zu klammern:
#define CNT_HALF_PERIOD    (T_HALF_PERIOD3 * (F_CPU / 4 / 1000000))

Dann hast du auf der rechten Seite der Multiplikation nur noch eine 2
stehen, und die lässt sich problemlos innerhalb eines 16-bit-Integers
mit 2000 multiplizieren.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> Berechnet der Compiler den konstanten Ausdruck nicht zur Compilezeit?

Doch, aber dadurch verändert sich nicht die Semantik :-)

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.