Forum: Compiler & IDEs AVR-GCC: __int24


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
der AVR-GCC verfügt ja über einen Datentyp __int24, den ich auf dem AVR 
gerne so nutze:
1
typedef __int24int_least24_t;
(auf dem ARM ist er dann als als int32 definiert).

Gibt es eine Möglichkeit einen PRIxLEAST24 (sozusagen wie PRIxLEAST16) 
zu definieren, um diesen Datentyp direkt mit printf ausgeben zu können?

Viele Grüße
W.T.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Nein. Die Libc wurd enicht erweitert. Nimm einfach den nächst größeren 
Typ, alse 32 Bit.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Nein. Die Libc wurd enicht erweitert.

Könnte man allerdings tun, müsste mal jemand einen Bugreport einkippen.

> Nimm einfach den nächst größeren
> Typ, alse 32 Bit.

Wie sieht das mit der integer promotion hier aus?  Das Argument ist
ja in einer variadischen Liste.  Wird es da zu unsigned long promotet,
oder landet es wirklich nur mit 3 Bytes auf dem Stack?  In letzterem
Falle müsste ja auch vfprintf() selbst erweitert werden.

von (prx) A. K. (prx)


Lesenswert?

Jörg Wunsch schrieb:
> Könnte man allerdings tun, müsste mal jemand einen Bugreport einkippen.

Wobei printf dann noch grösser wird als bisher.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A. K. schrieb:
> Wobei printf dann noch grösser wird als bisher.

Nur für den Fall, dass sie tatsächlich mit 3 Byte auf dem Stack landen,
aber dann wäre es auch tödlich, den Fall nicht zu behandeln (weil sich
alle nachfolgenden Argumente verschieben).

Für den Fall, dass er sowieso auf 32 bits promotet wird, wäre
PRIxLEAST24 nur ein (weiterer) Alias für "lx" im Headerfile.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das avr-Backend definiert momentan keine Promotion-Regeln, d.h. 3-Byte 
Typen werden als solche übergeben.  Variadische Funktionen müssen also 
genau 3 Bytes abholen; ansonsten darf man mit Problemen rechnen.

Für Standard-Funktionen wie prinf find ich es ausreichend, Warnungen zu 
beachten wie sie mit -Wformat (ist Teil von -Wall) ausgegeben werden.

Dies bedeutet dann, die 3-Byte Typen per Cast als 4-Byte Typ zu 
übergeben und Modifier wie %ld zu verwenden. Die Extension und den einen 
PUSH mehr kann man gut verschmerzen bei dem Wust, den die stdio 
Funktionen ohnehin bedingen.

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.