Forum: Mikrocontroller und Digitale Elektronik uint8_t Variablen auf 32bit Atmel Prozessoren mit AVRGCC


von Alex V. (bastel_alex) Benutzerseite


Lesenswert?

Ergibt es überhaupt Sinn auf einem 32Bit ARM (ATSAM4S) prozessor in AVR 
Studio mit ARM GCC compiler 8bit variablen zu definieren?

Werden die automatisch 32bit-feldern beim kompilieren zugeordnet, oder 
werden sie irgendwie sinnvoll gestackt? Ein 4* uint8_t array könnte ja 
dann z.B. in ein 32 bit Feld passen, wenn die Sache mit der Adresse 
nicht wäre..

von DerDan (Gast)


Lesenswert?

Hallo,

als lokale Variablen (z.b. für eine for Schleife) sind uin32_t 
tatsächlich besser geeignet, da sie der internen Registerbreite 
entsprechen und nicht künstlich auf 16 oder 8 Bit begrenzt werden 
müssen.

Für globale Variablen ist es sinnvoll einen uint8_t zu nehmen, wenn er 
ausreicht.

Auch Felder mit z.B. 4 x uint8_t funktionieren und belegen nur den 
benötigten Platz. den Zugriff darauf ist in Hardware geregelt.

mfg

DerDan

von Sebastian V. (sebi_s)


Lesenswert?

Ich kenne die Atmel ARM µCs nicht aber die STM32F4 haben Befehle um 
einzelne Bytes in ein Register zu laden. Wenn du also uint8_t benutzt 
kannst du etwas Platz im RAM sparen. Die Berechnung wird dadurch aber 
nicht schneller (außer du findest irgendwelche SIMD Instructions die 
genau für dein Vorhaben nützlich sind). Da die ARM µCs aber sowieso 
schon etwas größer sind muss man ja nicht um jedes Byte feilschen. Wenn 
du nicht gerade 1000 Zahlen speichern willst oder es dir um die Overflow 
Eigenschaften von uint8_t geht würde ich einfach unsigned int oder 
uint_fast8_t benutzen.

von Blubb117 (Gast)


Lesenswert?

Alternativ kann man uint_fast8_t verwenden. Der Compiler ersetzt das 
dann mit dem richtigen Typ. Eignet sich gut für lokale Variablen und 
Schleifen.
Auf 8bit-Architekturen wird das zu einem uint8_t, auf 16bit zu einem 
uint16_t und auf 32bit zu einem uint32_t. Natürlich wird das nicht immer 
so gemacht, weil es eben auf die Architektur und dem Compiler drauf 
ankommt.

von Dr. Sommer (Gast)


Lesenswert?

uint8_t verhält sich auf jeder Plattform gleich, egal ob AVR, ARM oder 
x86: Es ist eine vorzeichenlose 8-Bit Variable, die geht von 0-255. Wenn 
du Speicher sparen willst (wie zB. in Arrays oder nicht-lokalen 
Variablen) oder den definierten Overflow haben möchtest (ala 255+1=0) 
solltest du uint8_t verwenden. Möchtest du nur einen Integer haben mit 
mindestens 8 Bits ist uint_fast8_t besser geeignet. Dieser Typ ist 
dann eventuell 32bits groß, das entscheidet dann der Compiler; der 
Überlauf 255+1 ist dann jedenfalls nicht mehr garantiert.

Sebastian V. O. schrieb:
> Ich kenne die Atmel ARM µCs nicht aber die STM32F4 haben Befehle um
> einzelne Bytes in ein Register zu laden.
Der ARM Kern ist weder von Atmel noch von ST erfunden, sondern von, 
Überraschung, ARM. Daher können das sowohl die ARM-basierten 
Mikrocontroller von ST als auch die von Atmel.

Hier übrigens eine Referenz zu den Integer-Typen:
http://en.cppreference.com/w/c/types/integer

von Alex V. (bastel_alex) Benutzerseite


Lesenswert?

Danke für eure Antworten! :)

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.