8/16 bit Integer Operationen auf Cortex M3

Gast #5185623
Lesenswert?
• ▲
▼
Wenn ich in meinem C/C++ Program 8 oder 16bit Integer Variablen 
miteinander verrechne, wie wirkt sich das auf die Performance aus, 
verglichen mit nativen 32bit?
1
uint8_t a=5;
2
uint8_t b=7;
3
uint8_t c=a+b;
1
uint16_t a=5;
2
uint16_t b=7;
3
uint16_t c=a+b;

Ich könnte es natürlich einfach testen, aber mich interessiert auch die 
Erklärung, warum es so ist.
Gast #5185806
Lesenswert?
• ▲
▼
Ich habe eine schön kompakte Antwort auf einer Webseite von TI bezüglich 
Stellaris µC gefunden:

"Smaller globals and statics are okay, but locals are best as ints and 
unsigned ints (or longs). If globals/static are used a lot, copy to int 
locals for duration, and copy back. It is not unusual to have a 40% 
increase in function size due to use of short locals"

http://www.ti.com/lit/an/spma014/spma014.pdf

Etwas weiter unten wird das Thema weiter erläutert.

Damit ist meine Frage umfassend beantwortet. Schade, dass ich dieses 
Dokument nicht schon gestern gefunden hatte.
Gast #5185846
Lesenswert?
• ▲
▼
Stefan U. schrieb:
> Damit ist meine Frage umfassend beantwortet

Die Antwort bezieht sich allerdings nur auf lokale Variablen. Sobald man 
globale Variablen benötigt, wird man auch auf den RAM-Bedarf sehen 
müssen. Daß diese Variablen bei Berechnungen dann auf 32 Bit 
"aufgepustet" werden, muß man hinnehmen.
Gast #5185851
Lesenswert?
• ▲
▼
> Sobald man globale Variablen benötigt, wird man auch auf den RAM-Bedarf
> sehen müssen.

Na klar, das hatte ich bereits zwischen den Zeilen heraus gelesen. Nicht 
umsonst hat TI im Text mehrfach von "lokalen Variablen" geschrieben 
(anstatt einfach nur "Variablen").
#5185903
Lesenswert?
• ▲
▼
Der Cortex rechnet auf Registerebene die meisten Sachen auf 32Bit 
Registerebene. Auch Functionsparameter werden in 32Bit Registern 
übergeben. Wenn Du lokale Variablen oder Functionsparameter kleiner 
definierst, dann muss der Compiler nach jeder Rechenoperation sein 
Ergebnis mit einem zusätzlichen Befehl auf 8 oder 16Bit truncaten. Dies 
gilt auch für einen Function Rückgabewert, der kleiner als 32Bit ist.

Das heisst, alle Berechnungen sollten auf 32Bit laufen. Da lokale 
Variablen meistens in Registern gehalten werden, wird dadurch auch kein 
zusätzlicher Speicher belegt.

Es macht aber keine Performanceverluste, aus 8 oder 16Bit Variablen oder 
Arrays zu lesen und zu speichern, vorausgesetzt, die Zwischenrechnungen 
können in 32Bit erfolgen.

Es gibt auch Ausnahmen, so gibt es beim F4 einige DSP-Befehle, die auf 
q7_t und q15_t optimiert sind und dabei 2 oder 4 Parameter parallel 
verarbeiten können.

Viele Grüße, Stefan

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.