mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: g+++ (Gast)
Datum:

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

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

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?

Autor: jope (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.