Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

1 - Prop-C und Bibliotheksdateien

In einer Schritt-für-Schritt Anleitung wird in diesem Abschnitt gezeigt, wie man seine eigene Bibliothek in Prop-C aufbaut. Es wird gezeigt,

  • wie man selbst entwickelte Funktionen in die eigene Bibliothek übernimmt.
  • wie man die Bibliothek so konfiguriert, dass der Programmcode reduziert wird.
  • wie man Werte von Variablen innerhalb und zwischen Quelldateien gemeinsam nutzt.
  • wie man die Bibliothek mit einem test harness und Anwendungscode austestet.
  • wie man eine Bibliothek mit Hilfe von Doxygen-erzeugten HTML Seiten dokumentiert.

Bevor wir starten, sollte auf dem eigenen Rechner

  1. die neueste Version der Software SimpleIDE installiert sein; ggf. die neueste Version herunterladen.
  2. ein Propeller Board mit dem Computer verbunden sein.
  3. die Learn Libraries auf dem aktuellen Stand sein; ggf. die neueste Version herunterladen.
  4. Die Übungen zur Einführung in die Sprache C in den Abschnitten ... sollten durchgearbeitet worden sein.

2 - Eine einfache Bibliotheksdatei anlegen

Jeder, der schon einmal eine interessante Anwendung entwickelt hat, wird auf dem weiteren Weg viele der Aufgabenteile, die innerhalb der Anwendung häufig aufgerufen werden, in Funktionen ausgelagert und damit das Programm lesbarer und übersichtlicher gestaltet haben.

Leider lassen sich diese Funktionen in einer neuen Anwendung nicht einfach übernehmen; na gut, mit copy und paste funktioniert das, aber es ist umständlich und zeitaufwändig. Besser wäre, die häufig genutzten Funktionen in eine Bibliothek aufzunehmen und diese in ein neues Programm einzubinden, so wie wir das auch mit simpletools machen.

Starten wir mit einem kleinen Beispielprogramm, das zwei Funktionen enthält, die in weiteren Anwendungsprogrammen eingesetzt werden sollen.

Abbildung 2 - Einfaches C-Programm mit zwei Funktionen (Courtesy of Parallax Inc.)

Die Terminalausgabe zeigt die Wirkung der beiden Funktionen awesome und epic.

Abbildung 3 - Terminalausgabe zum Programm aus Abb. 1

Die beiden Funktionen des Anwendungsprogramms sollen jetzt in eine Bibliothek übernommen werden. Die Vorwärtsdeklarationen im Programm (Abb. 1, Zeilen 3 und 4) fallen weg, sobald man über einen Bibliotheksaufruf auf Funktionen zugreifen möchte. Es genügt, nur noch die Bibliothek selbst zu Beginn eines Programmes über ihren Namen aufzurufen, so wie wir es mit

  • #include simpletools
    

bei jedem C-Programm bisher gemacht haben.

3 - Einen Bibliotheksordner und ein Projekt libgenial anlegen

Der erste Schritt beim Anlegen einer Bibliothek genial ist immer, die Anwendung als libgenial im Ordner libgenial abzuspeichern. Dieser Ordner muss sich im Ordner Simple Libraries im Arbeitsbereich von SimpleIDE befinden, damit SimpleIDE darauf zugreifen kann. Um ein wenig Ordnung hineinzubringen, wird im Ordner Simple Libraries noch ein Unterordner MeineBibliotheken angelegt.

 

  • Übertrage das Programm genial.c in den Editor.
  • Gehe über Save Project As ins Arbeitsverzeichnis ...\SimpleIDE\Learn\Simple Libraries.
  • Lege über New Folder einen neuen Ordner MeineBibliotheken an.
  • Öffne mit Open den Ordner MeineBibliotheken.
  • Lege über New Folder und Eingabe des Dateinamens libgenial einen neuen Ordner an.
  • Öffne den Ordner libgenial.
  • Speichere die Datei unter dem Namen libgenial dort ab.

 

Das Programm genial.c

Abbildung 4 - Programm genial.c (Courtesy of Parallax Inc.)
  • Wähle aus dem Hauptmenü Project - Save Project As ....
  • Klicke auf das Icon Create New Folder und lege einen neuen Ordner MeineBibliotheken an.
  • Wechsel mit einem Doppelklick in den Ordner MeineBibliotheken.
  • Klicke wieder auf den Button NewFolder und nenne ihn genial.
  • Klicke auf Open und wechsele in den Ordner genial (Abb. 3).
  • Gib den Dateinamen libgenial ein und speichere die Datei über Save ab.
Abbildung 5 - Abspeichern der Datei libgenial im Verzeichnis ...\MeineBibliotheken\genial\

Im Verzeichnis MeineBibliotheken/genial sollten sich jetzt zwei Dateien befinden: die Quelldatei libgenial.c und die Projektdatei libgenial.side. Sollten nicht beide Dateien dort abgelegt worden sein, dann lösche den Ordner und gehe die einzelnen Schritte der Aufgabenbeschreibung noch einmal durch.

Abbildung 6 - Dateien im Verzeichnis .../MeineBibliotheken/genial/

Eine einfache Bibliothek benötigt einen sogenannten header file oder eine Kopfdatei. Erinnern wir uns, jede Funktion, die in ein C-Programm eingebunden ist, erhält eine forward-Deklaration mit dem Funktions-Prototyp, damit der Compiler weiß, was auf ihn zukommt.

Im Kopf einer Bibliothek werden diese Prototypen der Funktionen gebündelt und man erspart sich damit die sonst üblichen forward Deklarationen, wenn eine Funktion aus der Bibliothek aufgerufen wird. Nutzt eine Bibliothek Funktionen aus anderen Bibliotheken, dann müssen im Bibliothekskopf diese Bibliotheken mit #include eingebunden sein.

Im folgenden Schritt erstellen wir eine .h Datei für die Bibliothek libgenial.

 

  • Wähle aus dem Hauptmenü Project - Add Tab to Project.
Abbildung 7 - Project - Add Tab to Project Aufruf
  • Wähle im Feld Dateityp die Option C Header File (*.h).
  • Gib im Feld File name den Namen genial ein und speichere die Einstellungen mit Save.
Abbildung 8 - Erzeugung einer .h-Datei über die Dateityp-Auswahl

Im Editorfenster von SimpleIDE sollten jetzt zwei Register zu sehen sein: libgenial.c und genial.h.

  • Kopiere #include "simpletools" und die beiden forward-Deklarationen aus der Datei libgenial.c in die Datei genial.h.
  • Speichere die Änderungen über Project - Save ab.
Abbildung 9 - Der Inhalt der Datei genial.h

4 - Die Datei genial.c dem Projekt zufügen

  • Wähle aus dem Hauptmenü erneut Project - Add Tab to Project.
  • Wähle Save as type und belasse diesmal die Voreinstellung auf -C File (*.c).
  • Nenne das Programm genial.c; aber anders als bei den vorherigen Namen, unterliegt diese Namensgebung keiner vom Bibliotheksnamen bestimmten Vorgabe oder Muster.
Abbildung 10
  • Füge als erste Zeile im Programm genial.c den Programmcode ein: #include "genial.h" .
  • Kopiere die Funktionen awesome und epic aus der Datei libgenial.c nach genial.c.
  • Speichere das Projekt erneut ab.
Abbildung 11

Jetzt hat die Bibliothek ihren Kopfeintrag mit forward Deklaration und Quelldateien mit Funktionen. Die Datei libgenial ist weiterhin wichtig; mit ihr wird die Bibliotheksausgabe aufgebaut und die Funktionen getestet und überprüft, ob sie auch das tun, was von ihnen erwartet wird.

  • Wähle im Editor das Register libgenial.c und lösche dort die forward Deklarationen.
  • Lösche ebenso die Funktionen awesome und epic unterhalb der Funktion main().
  • Wenn dies alles ausgeführt ist, sollte der Programmcode wie folgt aussehen:
Abbildung 12
  • Starte das Programm mit Run with Terminal und überprüfe, ob es läuft.

Im Terminal erscheint, wenn alles funktioniert der folgende Text:

Abbildung 13

5 - Aufbau eines Bibliothekarchivs

Wird in einer Applikation die Funktion pause aus der Bibliothek simpletools aufgerufen, dann arbeitet der Compiler nicht mit der .c Datei. Stattdessen hält er Ausschau nach einer Datei libsimpletools.a. Das Suffix .a steht für Archiv und die Datei selbst ist ein binäres Abbild des compilierten C-Quellcodes. Mit diesen Dateien lässt sich der Umfang des Programmcodes reduzieren. Das werden wir jetzt zeigen.

  • Klicke auf das Feld Show Project Manager unten links im Fenster von SimpleTools.
Abbildung 14 - Aufruf des Project Managers

Das sich öffnende Fenster Project Manager sollte ähnlich wie in der folgenden Abbildung aussehen

Abbildung 15 - Project Manager mit Project Options und Linker Einstellungen

Propeller GCC arbeitet mit verschiedenen Speichermodellen. Wir nutzen CMM und starten mit diesem Speichermodell den Kompiliervorgang für die Bibliothek.

  • Wähle im Fenster Project Options (unten links) für das Memory Model die Einstellung CMM Main RAM Compact.
  • Achte darauf, dass als Board Type im Auswahlfenster ACTIVITYBOARD eingetragen ist. Sollte ein Prop-BoE verwendet werden, wird dieser Typ eingestellt.
Abbildung 16 - Das Fenster Project Manager im SimpleTools Editor

Der nächste Schritt ist sehr wichtig; das Projekt muss konfiguriert werden, damit es die Archivdateien der Bibliothek erzeugen kann.

  • Markiere im Register Linker die Option Create Project Library.
  • Stelle sicher, dass Tiny Lib und PThread Lib nicht markiert sind.
Abbildung 17 - Register Linker mit der Markierung bei "Create Project Library"

Erst nachdem alle Einstellungen vorgenommen und anschließend noch einmal überprüft wurden, kann das Bibliotheksarchiv für das kompakte Speichermodell erstellt werden.

  • Klicke auf das Icon Build Project.
Abbildung 18 - Build Project Aufruf

Im Unterverzeichnis cmm befindet sich jetzt eine Datei libgenial.a.

Abbildung 18 - Im Unterverzeichnis von MeineBibliotheken befindet sich die Datei libgenial.a

6 - Andere Speichermodelle benutzen

Der Programmcode kann natürlich auch mit anderen Speichermodellen kompiliert werden. Probieren wir es mal mit dem LMM (large memory model) aus, das den Programmcode schneller ausführt aber für das gleiche Programm auch mehr Speicherplatz benötigt.

 

  • Wähle LMM als Speichermodell bei den Project Options.
  • Klicke auf das Icon Build Project.
  • Im Filebrowser kannst du überprüfen, dass libgenial jetzt zwei Unterordner enthält und jeder von ihnen ein libgenial.a Archiv.

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf