uint8_t Variablen auf 32bit Atmel Prozessoren mit AVRGCC

OP Persönliche Seite #4083527
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..
Gast #4083562
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
#4083568
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.
Gast #4083578
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.
Gast #4083581
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.