FSST - Hardwarenahe Programmierung
Erzeugen einer Bibliothek
Siehe auch Writing your own mbed library
Was ist eine Bibliothek (Library)¶
Eine Bibliothek (Library) hier ist eine Ansammlung von Funktionen (Methoden), die in der Regel darauf ausgerichtet ist, eine bestimmte Komponente, Peripherie oder Funktionalität zu aktivieren. Typischerweise liegen Bibliothek bereits in kompilierter Form vor. Sie besteht aus zwei Teilen: dem Archiv und dem Interface in Form von Headern. Ohne Header ist eine Bibliothek nicht verwendbar, da die Deklarationen (und damit das Interface) fehlen. Der Hauptpunkt einer Bibliothek besteht darin, etwas Nützliches zu verpacken, damit sie und andere nicht ständig "das Rad" neu erfinden müssen, wenn Sie ein Gerät oder eine Funktionalität verwenden möchten. Sie können es sich als einen Baustein für ein Programm vorstellen. Wichtig ist, dass es kein Programm an sich ist, z.B. es hat keine main () -Funktion, ist aber eine nützliche und wiederverwendbare Komponente in einem Programm.
Als Referenz hier einige Beispiel-Bibliotheken:
Wie erzeugt man eine Bibliothek¶
Eine gute Bibliothek hat einen klaren Zweck, eine saubere Schnittstelle und enthält nicht den Code, der andere Dinge tut - dafür ist das Programm des Benutzers bestimmt.
Die meisten Bibliotheken starten tatsächlich als Code, der sich als nützlich erweist, werden dann in eine nützliche Klasse oder einen Satz von Funktionen umgeformt (Methoden), die an mehreren Stellen in einem Programm wiederverwendet werden können. Schließlich werden sie vom ursprünglichen Programm getrennt, so dass jedes weitere Programm diese einschließen (include, import) und benutzen kann, ohne den Code neu eingeben zu müsse.
Schauen wir uns die wesentlichen Schritte an:
Schritt 1: Verwenden von Funktionen¶
Codeteile, die öfter in einem Programm verwendet werden sollen, werden in Funktionen mit oder ohne Parameter bzw. Rückgabe-Werte codiert:
#include "mbed.h" DigitalOut led(LED1); // Funktionsdefinition void ledOn(void) { led = 1; } void ledOff(void) { led = 0; } void printStatus(void) { printf("LED is now: %d\n", led.read()); } int main() { while (1) { ledOn(); // Funktionsaufruf printStatus(); wait_ms(500); ledOff(); printStatus(); wait_ms(500); } }
Funktionsprototyping von der Codierung der Funktionen (Funktionsdefinition) trennen:
#include "mbed.h" // Funktionsprototyping void ledOn(void); void ledOff(void); void printStatus(void); DigitalOut led(LED1); int main() { while (1) { ledOn(); // Funktionsaufruf printStatus(); wait_ms(500); ledOff(); printStatus(); wait_ms(500); } } //Funktionsdefinition void ledOn(void) { led = 1; } void ledOff(void) { led = 0; } void printStatus(void) { printf("LED is now: %d\n", led.read()); }
Schritt 2: Erzeugen einer Klasse¶
siehe auch Methoden in C++ und ihre Implementierung.
#include "mbed.h" class MyLed { public: // Konstruktor MyLed(PinName led) : _led(led) { // Initalisierungsliste _led = 0; // 0 der Memebervariablen _led zuweisen } // Methodenprototyledg void ledOn(void); void ledOff(void); void printStatus(void); private: DigitalOut _led; }; // Methodendefinition void MyLed::ledOn(void) { _led = 1; } void MyLed::ledOff(void) { _led = 0; } void MyLed::printStatus(void) { printf("LED is now: %d\n", _led.read()); } MyLed myled2(LED2); // Instanziierung des Objekts int main() { while (1) { myled2.ledOn(); // Zugriff auf die Methode über "."-Operator myled2.printStatus(); wait_ms(500); myled2.ledOff(); myled2.printStatus(); wait_ms(500); } }
Schritt 3: Code aufteilen auf zwei Dateien¶
Mit obigen Aufwand, den Code wiederverwendbar zu machen, möchten wir vielleicht die Einbindung in andere Programme erleichtern. Um dies zu tun, können wir den Code in separate Dateien einfügen, die einfach von anderen Programmen aufgenommen werden können.
In C machen wir dies, indem wir Header-Dateien erstellen, die von anderem Code inkludiert werden können, damit wir wissen, was verfügbar ist (die Deklaration) und Quelldateien, die die Implementierung enthalten, die den Code (die Definition) generiert.
Als Konventionen würden wir zu obiger Klasse "MyLed " die Header- und Quelldateien den selben Namen geben: MyLed.h und MyLed.cpp ( siehe auch):
MyLed.h
#include "mbed.h" #ifndef MYLED_H #define MYLED_H class MyLed { public: // Konstruktor MyLed(PinName led) : _led(led) { // Initalisierungsliste _led = 0; // 0 der Memebervariablen _led zuweisen } // Methodenprototyledg void ledOn(void); void ledOff(void); void printStatus(void); private: DigitalOut _led; }; #endif
Implementierung der Methoden
MyLed.cpp
#include "mbed.h" #include "MyLed.h" void MyLed::ledOn(void) { _led = 1; } void MyLed::ledOff(void) { _led = 0; } void MyLed::printStatus(void) { printf("LED is now: %d\n", _led.read()); }
Datei mit der Funktion "main()"
main.cpp
#include "mbed.h" #include "MyLed.h" MyLed myled2(LED2); // Instanziierung des Objekts int main() { while (1) { myled2.ledOn(); // Zugriff auf die Methode über "."-Operator myled2.printStatus(); wait_ms(500); myled2.ledOff(); myled2.printStatus(); wait_ms(500); } }
Bibliothek in mbed-Compiler¶
Laden der Dateien in den mbed-Online Compiler Intro Video und erzeugen einer Bibliothek. Der mbed Compiler hat eine Unterstützung für Bibliotheken eingebaut und lässt eigenen Programme entsprechend verpacken und veröffentlichen.
Aus den vorherigen Abschnitten haben wir jetzt ein Programm, das ungefähr so aussieht:
Mit der gleichen Konvention, dass eine Klasse namens MyLed eine Header-Datei MyLed.h haben sollte, sollte die Bibliothek den gleichen Namen haben: "MyLed". Um eine Bibliothek zu erstellen, klicken Sie mit der rechten Maustaste auf Ihr Programm, wählen Sie "New Library..." und geben Sie "MyLed" ein; Es fügt Ihrem Programm einen Ordner hinzu, aber Sie werden feststellen, dass es sich um eine Bibliothek im Bearbeitungsmodus handelt. Sie können nun Ihre Dateien, die Teil der Bibliothek sein sollen, in sie ziehen, und Sie erhalten dann:
Übersetzten Sie das Programm; es sollte noch immer gleich funktionieren, aber jetzt gibt es noch mehr Struktur.
Der nächste Schritt ist die Veröffentlichung. Klicken Sie dazu mit der rechten Maustaste auf die Bibliothek und wählen Sie "Publish Library...". Sie werden aufgefordert, eine Beschreibung, einige Tags und alle Nachrichten einzugeben, die für diese bestimmte Version spezifisch sind (z. B. erste Version, Fehlerbehebungen). Sobald Sie fertig sind, drücken Sie OK und Sie erhalten eine Nachricht:
Die Bibliothek ist jetzt live! Sie können zu der URL gehen und sie auf der mbed.org-Website sehen. Sie sehen auch, dass Ihr Projekt aktualisiert wurde.
Siehe auch Arbeiten mit Bibliotheken
Nehmen Sie Ihre Änderungen vor, veröffentlichen Sie sie wie zuvor und Ihre Updates werden live übertragen! Jeder, der die Bibliothek verwendet, kann sehen, dass eine neuere Version vorhanden ist, und mit einem einzigen Klick aktualisieren. Beachten Sie, dass Sie auch eine Bibliothek bearbeiten können, die ein anderer Benutzer geschrieben hat. Importieren Sie sie einfach, klicken Sie auf Bibliothek bearbeiten und gehen Sie in die Dateien. Der einzige Unterschied ist, wenn Sie es veröffentlichen, wird es unter Ihrem Bibliotheksbereich statt ihrer veröffentlichen.
Dokumentieren der Bibliothek¶
siehe: API-Documentation
MyLed.h
#include "mbed.h" #ifndef MYLED_H #define MYLED_H /** A test-class MyLed. * Used for led on/off and status. * * Example: * @code * #include "mbed.h" * #include "MyLed.h" * * MyLed myled2(LED2); // Instanziierung des Objekts * * int main() { * myled2.ledOn(); // Zugriff auf die Methode über "."-Operator * myled2.printStatus(); * wait_ms(500); * myled2.ledOff(); * } * @endcode */ class MyLed { public: /** Create a LED - DigitalOut connected to the specified pin * * @param pin DigitalOut pin to connect to */ MyLed(PinName led) : _led(led) { // Initalisierungsliste _led = 0; // 0 der Memebervariablen _led zuweisen } // Methodenprototyledg /** Set the output to 1 (int) * * @param value An integer specifying the pin output value, * 0 for logical 0, 1 (or any other non-zero value) for logical 1 */ void ledOn(void); void ledOff(void); void printStatus(void); private: DigitalOut _led; }; #endif
Um die Dokumentation für das obige Beispiel zu generieren, müssen Sie im Drop-down-Menü "Compile" auf den Menüeintrag "Update Docs" klicken, wie in diesem Bild gezeigt. Nach der Generierung wird der Navigationsbaum aktualisiert und die formatierte Dokumentation wird wie im folgenden Bild aussehen: