Forum: Compiler & IDEs G++ Optimierung und arm Assembly Generierung


von g+++ (Gast)


Lesenswert?

Ich wollte schauen ob mein C++ Pin Objekt genauso effizient ist wie ein 
direkter C-Style Aufruf. Also:
1
HAL_GPIO_WritePin(GPIOA, PIN, GPIO_PIN_SET);
vs
1
STM32Pin pin{GPIOA, PIN};
2
...
3
pin.write(true);

mit
1
struct STM32Pin {
2
   GPIO_TypeDef *port;
3
   uint32_t pinnum;
4
   STM32Pin() = delete;
5
   void write(bool level) const { HAL_GPIO_WritePin(port, pinnum, static_cast<GPIO_PinState>(level)); }
6
};

Antwort: wenn das pin Objekt const gemacht wird, ist der Code identisch 
(-O2 Optimierung).
Siehe hier: https://godbolt.org/z/p6lkWx

Zu dem generierten Assembly habe ich zwei Fragen:
1. Was sollen die ganzen ldrb und strb Befehle für Methode 1?
2. Wenn der pin nicht const ist, werden für Methode 2 (C++ pin) sogar 
weniger Befehle emittiert, wie kann das sein?

von jope (Gast)


Lesenswert?

>1. Was sollen die ganzen ldrb und strb Befehle für Methode 1?

Die Adresse von GPIOA ist nicht 32-Bit-aligned.
Nimm mal anstatt 0x1 0x4 als Adresse:

#define GPIOA (GPIO_TypeDef*)0x4

von (prx) A. K. (prx)


Lesenswert?

g+++ schrieb:
> 2. Wenn der pin nicht const ist, werden für Methode 2 (C++ pin) sogar
> weniger Befehle emittiert, wie kann das sein?

Wenn der vom falschen Alignment hervorgerufene Zirkus wegfällt, bleiben 
ein MOV oder LDR und ein STR übrig.

NB: Was auch geht, da SET vor RESET Vorrang hat:
  BSRR = mask << 16 | state;
Das ist besonders nützlich, wenn mehr als 1 Bit gemischt gesetzt wird.

: Bearbeitet durch User
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.