Ich versuche, meine UART-Bibliothek zu organisieren und sie ein wenig zu verschönern, indem ich ein paar #define s hinzufüge, damit ich sie später anpassen kann, ohne tief in den Code eindringen zu müssen, aber ich scheine das folgende Bit nicht zu bekommen Code funktioniert:
%Vor%Nach der Berechnung wird BRGVAL zu 25.0416667, und weil es keine ganze Zahl ist, erhalte ich die folgende Warnung, wenn ich das in U1BRG eingib:
UART.c: In der Funktion 'uart_init':
UART.c: 24: Warnung: Integerüberlauf in Ausdruck
... und der Code funktioniert auf der Zielhardware einfach nicht. (Wenn ich U1BRG = 25 manuell einfüge, funktioniert das wie ein Zauber)
Gibt es eine Möglichkeit, diese Konstante in eine Ganzzahl einzugeben, um den Compiler glücklich zu machen?
Vielen Dank, Hamza.
Ganzzahlüberlauf bedeutet, dass Sie die Obergrenze eines int-Werts überschritten haben, der bei diesem Fehler wahrscheinlich 32767 beträgt. Es hat nichts mit Fließkomma zu tun; Bei den von Ihnen angegebenen Operationen handelt es sich tatsächlich um ganzzahlige mathematische Operationen, daher wird der Bruchteil der Division sowieso verworfen.
Versuchen Sie etwas wie folgt:
%Vor% Das L-Suffix wandelt diese Konstanten in long
type anstelle von int
type um. Der (unsigned int)
-Cast wird in den U1BRG-Typ konvertiert und der Compiler weiß, dass Sie verstehen, dass der long
-Wert in ein unsigned int
passt und somit alle Warnungen ausblendet, die er Ihnen möglicherweise entgegensetzt.
Normalerweise ist es eine schlechte Übung, Compiler-Warnungen zu deaktivieren, aber in diesem Fall ist es klar, dass, obwohl Sie long
benötigen, um Zwischenwerte in der Berechnung zu speichern, das Endergebnis in ein unsigned int
passt.
Ich mag Philips Antwort, aber ich denke, eine bessere Lösung besteht darin, die Formel zu reduzieren und Ihr Makro zu ändern:
%Vor%Dadurch eliminieren Sie die Umwandlung, sodass der Compiler Sie weiterhin warnen kann, wenn Sie eine niedrige Baudrate wählen, die zu einem für einen 16-Bit-Int. zu großen Teilerwert führen würde.
Sie haben es versäumt, darauf hinzuweisen. Was ist der Datentyp für U1BRG? Wenn es sich um int
handelt, kannst du es wie folgt darstellen:
Bearbeiten: Hier wurde der Kommentar von Adam Liss berücksichtigt, dass ein vorzeichenloser int zu klein ist, um das Ergebnis von zu halten das Makro, ich habe es geändert, um es zu einem long
... zu machen. Danke Adam für den Heads-Up ...
Hoffe, das hilft, Freundliche Grüße, Tom.