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..
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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.