Cortex M3 Compiler Warning

Gast #4115467
Lesenswert?
• ▲
▼
Hallo,

wenn ich ein 32Bit Register beschreibe, kommt es zu Warnings.

z.B.

GPIOA->BSRR = 1<<30 | 1<<31;


Warning: Integer out of range (oder irgendwie so)

Das Problem kann ich leicht lösen, indem ich schreibe:

GPIOA->BSRR = 1UL<<30 | 1UL<<31;

jedoch finde ich das nicht so elegant. Wie kann ich dem Compiler denn 
noch mitteilen, dass er die 1<<x als 32Bit unsigned wahrnimmt?

Gruß
Gast #4115980
Lesenswert?
• ▲
▼
Martin schrieb:
> Wieso kommt eigentlich diese Warnung? Weiß das jemand?
> Kann es sein, dass der Compiler eine einfache Zahl nur als 16Bit Int
> interpretiert?

Die Warnung bekommst du für die bescheuerte Schreibweise mit <<.
Wenn man das so dämlich schreiben will, dann bitte mit Makro
#define BIT(X) ((uint32_t)(1<<(X)))
...
PortA = BIT(30) | BIT(1);
...
Gast #4116011
Lesenswert?
• ▲
▼
Mit #define schreibst du den Sch... nur einmal in der Form. Im Rest der 
Source bleibts leserlich.
Und schöner ausdrücken kann man das nicht. Wenn ich Quelltexte mit der 
Shifterei sehen muss und dann 5 Bits oder mehr gesetzt werden, ist das 
einfach nur Bullshit.
#4116212
Lesenswert?
• ▲
▼
Martin schrieb:
> GPIOA->BSRR = 1UL<<30 | 1UL<<31;

bei mir sähe sowas eher so aus:
1
#define HAUPTSTEUERKONTROLLE   (GPIOA)
2

3
#define WARPANTRIEB            (1U << 29)
4
#define IMPULSANTRIEB          (1U << 30)
5
#define TRAEGHEITSDAEMPFER     (1U << 31)

und an anderer Stelle:
1
HAUPTSTEUERKONTROLLE->BSSR = IMPULSANTRIEB | TRAEGHEITSDAEMPFER;

Das macht den Code leserlicher.

Ich höre in der Regel erst auf wenn nirgendwo mehr außerhalb einer 
Headerdatei namenlose Konstanten auftauchen die keinen verdammt guten 
Grund für ihre Anwesenheit dort vorweisen können.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren