Hallo,
warum gibts bei avrgcc eigentlich kein int24_t und uint24_t?
Wäre aus Performancegründen doch ganz praktisch oder würde das sich nicht lohnen und ich sollte einfach die 32er nehmen?
Druckbare Version
Hallo,
warum gibts bei avrgcc eigentlich kein int24_t und uint24_t?
Wäre aus Performancegründen doch ganz praktisch oder würde das sich nicht lohnen und ich sollte einfach die 32er nehmen?
24-Bit-Typen gibt es nicht.
Nimm die (unsigned) long bzw. (u)int32_t.
Wenn es wirklich kritisch von der Effizienz wird, kannst du auch selber einen 24-Bit-Typ definieren, musst dann aber auch Funktionen schreiben, die entsprechend effizient damit umgehen können.
Von der Register-Verwaltung her sind 4-Byte-Typen besser zu handhaben als 3-Byte-Typen, möglicherweise wird's sogar ineffizienter, was die Register-Handhabung angeht.
Servus
Was in die Richtung habe ich mir auch gedacht, nur ich bin mir nich sicher, da ich asm nicht besonders gut kann.Zitat:
Von der Register-Verwaltung her sind 4-Byte-Typen besser zu handhaben als 3-Byte-Typen, möglicherweise wird's sogar ineffizienter, was die Register-Handhabung angeht.
Könnte mal jemand, der asm kann, sicher sagen ob ein 24bit typ im avr schneller ist als ein 32er oder nicht?
MfG Alex
Wie sprinter schon sagt: Du musst die Funktionen (Addition, Subtraktion, Mul, ...) selber schreiben. Gleiche Code-Muster voraus gesetzt, geht 24 bit dann schneller als 32bit.
Wenn du in asm Programmierst bist du auf jeden Fall besser sein als mit 32 Bit -- vorausgesetzt, du programmierst gut ;-)
Für C-Compiler sieht das aber wieder anders aus. Wenn du den als Schnittstelle verwendest, um 3-Byte-Werte zu lesen/speichern, wird's evtl ineffizient. Mach dir doch mal ein uint24_t und guck nach, was der Compiler draus bastelt.
Es ist ja auch die Frage, was du Optimieren willst: Laufzeit, SRAM oder Flash-Verbrauch.Code:#include <inttypes.h>
typedef struct
{
uint8_t byte[3];
} uint24_t;
HI,
Ich hab momentan leider keine Zeit das zu machen, da ich mich erst wieder in asm einarbeiten müsste, aber mit c werde ich das mal versuchen in nächster zeit.
Am PC macht es natürlich wenig sinn mit mit 24 bit zu rechnen, wenn der prozessor 32 bit unterstützt, aber 8-bit avrs könnte ja Laufzeit, ram und damit auch der flash verbrauch besser werden. :D
.... wenn ich das gemacht habe meld ich mich mal
Der Flash-Verbrauch wird möglicherweise sogar grösser.
Wenn du nur an irgend einer einzigen Stelle eine 32-Bit-Multiplikation hast (kann in einem ganz anderen Modul sein), wird die Routine natürlich dazugebunden beim Linken und ist eh da. Das 24-Bit-Zeugs kommt dann noch dazu.
Das einzige, was du sparst, ist Laufzeit und RAM, wenn es viele Werte sind.