FSST - Hardwarenahe Programmierung

Blinky OOP

C++ Seite

Blinky OOP mit Zeiger

Siehe auch Handbook DigitalOut

/media/uploads/fpucher/uml_myled_pointer.jpg

class MyLed {
    DigitalOut *_led;   
// wissen noch nicht auf welchen pin verbunden wird, daher nur ein Zeiger - 
// im Konstruktor wird Objekt erzeugt

    MyLed();            
// auf Standardkonstruktor kann von aussen nicht zugegriffen werden, da private
      
// Parametrisierter Konstruktor  - selber Name wie Klasse – 
// als Parameter übernimmt dieser einen pin Namen 
public:
    MyLed(PinName ld)
    {
// erzeuge neues DigitalOut Objekt _led mit pin ld und Initialisierungswert 0

        _led = new DigitalOut(ld, 0);      
    };
    
// Methoden zum Ein-/Ausschalten der LED
    void LedOn()
    {
// Aufruf der Methode write() in Klasse DigitalOut über den Zeiger _led
        _led->write(1);    
    }
    void LedOff()
    {
        (*_led).write(0);
    }
};

int main() 
{
// erzeugen einer Variablen myLed1 der Klasse MyLed mit pin Name als Parameter
	MyLed myLed1(LED1);             

	while(1)
	{
        myLed1.LedOn();         // Aufruf der Memeberfunktion (Methode) LedOn()
        wait(0.2);
        myLed1.LedOff();
        wait(0.2);
	}  
}     

Anmerkung:

  • in Zeile 16: kann new durch den Adressßoperator "&" ersetzt werden, da der Pin als Hardware vorhanden ist im Gegensatz zu Objekten in MSVC z.B.

_led = &DigitalOut(ld, 0); 


Try it out: new- versus &-Operator

Initialisierungslisten

Konstruktoren können wie oben mit Parametern (parametrisierte Konstruktoren) versehen werden, sodass bei der Erzeugung des Objektes aktuelle Werte für die Initiallisierung der Instanzevariablen übergeben werden können. Dies ist über den Zuweisungsoperator (=) im Anweisungsteil des Konstruktors oder über Initialisierungslisten möglich, was eine wesentliche Vereinfachung ist. Außerdem können Referenzen (hier: DigitalOut-Objekt]] und Konstanten (hier z.B. der Pin LED1 oder p61) ausschließlich in der Initialisierungsliste gesetzt werden. (Siehe hierzu auch C++ FAQ und C++ Forum)

class MyLed {
public:
    MyLed(PinName ld) : _led(&DigitalOut(ld)){
    };
    
    void LedOn() {
        _led->write(1);
    }
    void LedOff(){
        _led->write(0);
    }
};

Example STM

class Stm 
{
  public:
        Stm() : sw1(p14), sw2(p15) { }
        
        // Events
        SwEvent sw1;
        SwEvent sw2;
};
Übungen Initialisierungslisten

Siehe auch SwEvent und Projekt

In-class Member Initialisation: From C++11 to C++20

Aufgabe BusOut


All wikipages