Forum: Mikrocontroller und Digitale Elektronik Datentyp uint_8 in IAR für MSP430


von LuXXuS 9. (aichn)


Lesenswert?

Hallo zusammen,

vielleicht kann mir einer helfen. Ich habe bereits im Forum und bei 
Google danach gesucht, jedoch bin ich nicht weiter gekommen. Ich sehe so 
oft, das 8Bit-Variablen mit der Deklaration

"uint_8"

bezeichnet werden. Beim suchen habe ich nun noch weitere Varianten, wie 
uint8_t gesehen.

Aber bei funktioniert keines davon. Für 8Bit-Variablen lege ich bisher 
nun halt ein 'unsigned char' an. Das funktioniert natürlich, auch zum 
Zählen von 0 bis 255.

Aber eignetlich ist der char dafür ja nicht gedacht, oder ist das völlig 
egal...nur ein Stilbruch oder sonstiges?

Fehlt mir ein #include für diese Variablendeklaration?


Vielen Dank, Dennis

von H.Joachim S. (crazyhorse)


Lesenswert?

Verzichte darauf...
Der MSP430 ist ein 16bit-Prozessor.
8Bit-Variable belegen dennoch einen 16Bit-Speicherplatz, das erzwungene 
Rechnen mit 8bit kostet nur mehr Code.

von LuXXuS 9. (aichn)


Lesenswert?

Also absoluter Schwachsinn? Alles als unsigned int deklarieren?

von LuXXuS 9. (aichn)


Lesenswert?

Nur mal aus Interesse: Wieso braucht das mehr Code?

Dann bewirke ich damit ja genau das Gegenteil, als wie ich wollte. Ich 
hatte gedacht, ich spare damit Ressourcen...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

stdint.h hast du aber includiert?
http://en.wikipedia.org/wiki/stdint.h

von Peter D. (peda)


Lesenswert?

H.joachim Seifert schrieb:
> 8Bit-Variable belegen dennoch einen 16Bit-Speicherplatz

Das glaub ich Dir nicht.
Dann dürfte ja keine UART, I2C, SPI usw. gehen, die 8Bit Daten 
übertragen müssen.

Es muß sehr wohl möglich sein, auch 8Bit Variablen im SRAM anzulegen, 
sonst kannste das Ding in die Tonne kloppen.


Peter

von LuXXuS 9. (aichn)


Lesenswert?

Ich seh grad, in der stdint.h sind die ja drin...jedoch sehe ich auch, 
dass das äquivalent zu uint_8 genau der unsigned char ist. Also egal! 
Ich wollte die nicht einbinden, weil eigentlich nicht unbedingt nötig - 
nimmt halt noch mehr Speicher weg. Und wenn es ohne #includes geht...

Aber trozdem, warum verbraucht es mehr Code mit 8Bit-Variablen?


Danke! Dennis

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


Lesenswert?

Peter Dannegger schrieb:
> Es muß sehr wohl möglich sein, auch 8Bit Variablen anzulegen, sonst
> kannste das Ding in die Tonne kloppen.

Es gibt CPUs, die nur 32-bit-Einheiten kennen (einige DSPs), die
trotzdem keiner in die Tonne gekloppt hat...

Falls es auf einer CPU effektiver (im Sinne von schneller) ist, dass
man eine mindestens 8 bit breite Zahl größer macht, dann sollte man
stattdessen halt uint_fast8_t nehmen, wenn man nicht zwingend exakt
8 bit braucht.

von LuXXuS 9. (aichn)


Lesenswert?

Mein Ziel war ja eigentlich nur, dass ich RAM spare, wenn ich eine 
Variable habe, die von 1-10 zählen muss - da brauch ich ja keinen ganzen 
integer zu.

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


Lesenswert?

Dennis E. schrieb:
> Ich wollte die nicht einbinden, weil eigentlich nicht unbedingt nötig -
> nimmt halt noch mehr Speicher weg.

So'n Quark.  Du solltest erst einmal anfangen zu verstehen, wie eine
Headerdatei funktioniert, bevor du wild mit Datentypen herum
jonglierst.

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


Lesenswert?

Dennis E. schrieb:
> Mein Ziel war ja eigentlich nur, dass ich RAM spare, wenn ich eine
> Variable habe, die von 1-10 zählen muss - da brauch ich ja keinen ganzen
> integer zu.

Wenn du von 1 bis 10 zählen willst, dann verwette ich meine nicht mehr
vorhandene Haarpracht, dass der Compiler das in einem Register macht
und du kein müdes Bit RAM sparst.  Damit wäre uint_fast8_t angebracht.
Wenn du den gleichen Code dann bspw. auf einen AVR portierst, weiß der
Compiler sofort, dass ein 8-bit-Register auch genügt.  (Andererseits
kann er sich das beim Zählen von 1 bis 10 auch an allen 10 Fingern
abzählen, dass das so ist. :-)

von LuXXuS 9. (aichn)


Lesenswert?

OK, danke!

von LuXXuS 9. (aichn)


Lesenswert?

Darf ich noch die Frage loswerden, was damit gemeint ist? Ich kenne den 
Datentyp "uint_fast8_t" nicht, sorry!


The standard doesn't mandate anything about these types except that 
their widths must be ≥ N. It also leaves it up to the implementor to 
decide what it means to be a "fast" integer type.

An implementation is required to define these for the following N: 8, 
16, 32, 64.

Also nicht die Übersetzung, sondern ich kenne den Zweck der Deklaration 
nicht.

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


Lesenswert?

Die Idee ist:

[u]intN_t: verlangen eine exakte Bitbreite, egal wie effektiv oder
uneffektiv deren Benutzung ist; kann eine Maschine eine bestimmte
Bitbreite nicht implementieren, dann fehlt der Typ, und das Compilieren
eines enstprechenden Quelltextes schlägt fehl (statt u. U. fehlerhafte
Annahmen beispielsweise über das Überlaufverhalten eines Datentyps wie
"unsigned char" zu treffen).

[u]int_leastN_t: verlangt mindestens N bits Breite; kann eine Maschine
einen derartigen Datentyp nicht implementieren, so kann sie einen
breiteren Datentyp stattdessen einsetzen; der Fokus liegt auf einer
möglichen Speicherplatzeinsparung, sie sollte also den kleinsten
passenden Typ wählen.

[u]int_fastN_t: verlangt mindestens N bits Breite; Fokus liegt auf
Verarbeitungsgeschwindigkeit; wenn eine Maschine bspw. beim Zugriff
auf 8-bit-Datentypen mehr Aufwand treiben muss als bei der Nutzung
eines 16- oder 32-bit-Typs an gleicher Stelle, dann sollte sie
letzteren benutzen.  Dies ist in der Regel immer der Fall, wenn die
Register- und Speicherbusbreite größer ist als die gewünschte Anzahl
von Bits.

von LuXXuS 9. (aichn)


Lesenswert?

Ok, vielen Dank für die Info!

von H.Joachim S. (crazyhorse)


Lesenswert?

Das heisst ja nicht, dass man nicht auch auf 8bit-Register zugreifen 
kann. Es ging schliesslich um Variablen. In einem 16bit-System ist eine 
RAM-Adresse aber normalerweise auch 16bit breit. Und die wird auch 
benutzt, auch wenn dann nur die Hälfte davon für eine 8Bit-Variable 
benötigt wird, falls nicht explizit vom Befehlssatz 8bit-Zugriff auf 
high- und low-Byte unterstützt wird.
Kenn aber den MSP nicht. Üblicherweise ergibt sich der einfachste und 
effektivste Zugriff, wenn man den Grundtyp des Prozessors benutzt.

von Stefan (Gast)


Lesenswert?

>Kenn aber den MSP nicht. Üblicherweise ergibt sich der einfachste und
>effektivste Zugriff, wenn man den Grundtyp des Prozessors benutzt.

Wenn man beim MSP430 8-bit Variablen benutzt, werden im RAM auch nur 8 
Bits belegt...man sollte aber das Alignment beachten, d.h. beim wilden 
Mixen von char, int, long, ...was weiß ich... gibt's Füll-Bits...

von Johnny B. (johnnyb)


Lesenswert?

Ich würde beim Programmieren nicht zu viel Rücksicht auf den verwendeten 
Prozessor nehmen; überlasse solche Optimierungen dem Compiler.

Die Datentypen sollten sich nach Deiner Anwendung richten. Brauchst Du 
also z.B. einen Zähler, dem ein 8-Bit Wertebereich ausreicht, dann nimm 
dafür den uint_fast8_t Datentyp, egal für welche Plattform Du 
programmierst.
Dieser Code wird dann aber auch auf anderen Plattformen/Prozessoren 
einwandfrei funktionieren, ist also portabel.

Char solltest Du nur für Zeichen oder Zeichenfolgen verwenden.

von Willy (Gast)


Lesenswert?

>Ich seh grad, in der stdint.h sind die ja drin...jedoch sehe ich auch,
>dass das äquivalent zu uint_8 genau der unsigned char ist. Also egal!

Falsch gedacht, das ist eben nicht egal.
char ist absolut nixsagend und seine grösse ändert sich vom compiler zu 
compiler.
tu dir und deinem nachfolger (maintainer) einen gefallen und
drücke explizit aus welche numerische grösse hinreichend ist.

es kann durchaus sein, dass 8 bit berechung mehr code benötigt.
uint_8 x=255; x++; muss eben garantiert 0 werden. was soll deiner
meinung nach compiler daraus machen?

length=foo();
for(uint_8 i=0; i<length; i++) {
    /**/
}

du magst das wissen haben, dass legnth immer kleiner als 100 ist.
compiler muss die möglichkeit des falles i=255 mitberücksichtigen!
wenn internes register 16 bit hat, wird gecheckt ob bit 8 1 ist
oder nicht. => mehr code

von LuXXuS 9. (aichn)


Lesenswert?

OK, ich ging davon aus, dass char eine 8Bit-Variable ist. Ich habe bis 
jetzt nur mit IAR-Embedded-WB gearbeitet und da ist das halt als 8Bit 
festgelegt.

Aber OK, vielen Dank, dann werde ich das in Zukunft berücksichtigen.

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


Lesenswert?

Dennis E. schrieb:
> OK, ich ging davon aus, dass char eine 8Bit-Variable ist.

Wenn die Maschine keine 8-bit-Einheiten kennt, ist sie es nicht.
Zugegeben exotisch, aber möglich und völlig konform zum C-Standard.

Man muss dabei noch beachten, dass sizeof(char) per definitionem immer
1 ist.

von Mark B. (markbrandis)


Lesenswert?

Jörg Wunsch schrieb:
> Wenn die Maschine keine 8-bit-Einheiten kennt, ist sie es nicht.
> Zugegeben exotisch, aber möglich und völlig konform zum C-Standard.

Gibt es dafür real existierende Beispiele, die nicht in einem 
Computermuseum stehen? ;-)

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


Lesenswert?

Mark Brandis schrieb:

> Gibt es dafür real existierende Beispiele, die nicht in einem
> Computermuseum stehen? ;-)

Irgendwelche DSPs, genaue Typen habe ich aber vergessen.

von Arc N. (arc)


Lesenswert?

Willy schrieb:
>>Ich seh grad, in der stdint.h sind die ja drin...jedoch sehe ich auch,
>>dass das äquivalent zu uint_8 genau der unsigned char ist. Also egal!
>
> Falsch gedacht, das ist eben nicht egal.
> char ist absolut nixsagend und seine grösse ändert sich vom compiler zu
> compiler.
> tu dir und deinem nachfolger (maintainer) einen gefallen und
> drücke explizit aus welche numerische grösse hinreichend ist.
>
> es kann durchaus sein, dass 8 bit berechung mehr code benötigt.

beim MSP430 normalerweise nicht...

> uint_8 x=255; x++; muss eben garantiert 0 werden. was soll deiner
> meinung nach compiler daraus machen?
>
> length=foo();
> for(uint_8 i=0; i<length; i++) {
>     /**/
> }
>
> du magst das wissen haben, dass legnth immer kleiner als 100 ist.
> compiler muss die möglichkeit des falles i=255 mitberücksichtigen!
> wenn internes register 16 bit hat, wird gecheckt ob bit 8 1 ist
> oder nicht. => mehr code

Beim Überlauf von 8-Bit-Operationen wird ganz normal das Carry-Flag 
gesetzt, wenn der Compiler vernünftig optimiert, wird der Vergleich 
weggelassen und ein simpler jnc forLoop erzeugt (bzw. sollte der 
Compiler das so machen...).

von Willy (Gast)


Lesenswert?

>Beim Überlauf von 8-Bit-Operationen wird ganz normal das Carry-Flag
>gesetzt, wenn der Compiler vernünftig optimiert, wird der Vergleich
>weggelassen und ein simpler jnc forLoop erzeugt (bzw. sollte der
>Compiler das so machen...)

das ist gut, wenn dieser 16-biter das tut. eine anderere einfachere
16bit ALU wird das nicht tun (wobei ich persönlich mit 16 bitter
nicht gearbeitet habe).

Ein analoges Problem gibt es wenn Leute short statt int benutzen.
Aber das eher im ARM Bereich.

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.