Sensornetzwerk – Riot OS – Teil 2

Im ersten Teil zum Thema Riot OS bin ich bereits auf das Betriebssystem für funkbasierte Sensornetzwerke eingegangen und habe euch gezeigt, was Riot OS überhaupt ist und welche Vorteile es hat. Im zweiten Teil möchte ich nun etwas tiefer auf Riot OS eingehen und euch anhand des Beispielprogramms „default“ zeigen, wie Riot OS aufgebaut ist und wie es funktioniert.

Die Ordnerstruktur

Die Ordnerstruktur von Riot OS ist sehr übersichtlich aufgebaut. Im Hauptordner von Riot OS befinden sich neben diversen Dateien die benötigten Ordner von Riot OS.

  • boards: Treiber für die von Riot OS bereits unterstützten Boards (Entwickler-Boards)
  • core: diverse Dateien, die für den Kern von Riot OS nötig sind
  • cpu: Treiber für die von Riot OS unterstützten CPUs. Jeder CPU-Treiber besteht im Grunde aus einem eigenen Makefile, die benötigten Dateien für die Peripherie und natürlich dem Headerfile für die Adress-Zuordnung der einzelnen Register. Anhand bereits vorhandener Treiber lassen sich somit sehr leicht neue Treiber (aus der gleichen Reihe) selbst hinzufügen.
  • dist: diverse Hilfsprogramme / Tool um mit Riot OS arbeiten zu können
  • doc: Dateien für die automatische Dokumentationserstellung über Doxygen für Riot OS
  • drivers: Treiber der unterstützen Sensoren und Funkchips
  • examples: Beispielprogramme, um Funktionen von Riot OS kennenzulernen
  • makefiles: benötigten Makefiles für die Kernfunktionen von Riot OS
  • pkg: diverse zusätzliche Pakete, welche benötigt werden
  • sys: alle benötigten Dateien für die Systemfunktionen von Riot OS
  • tests: Vielzahl an Testprogrammen, um Treiber oder Funktionen von Riot OS testen zu können

Für eure eigenen Projekte empfehle ich euch im Hauptordner von Riot OS einen Projekt-Ordner anzulegen. Dies ermöglicht später das problemlose Einbinden der benötigten System-Dateien und Treibern.

Default Beispielprogramm

Das Default-Beispielprogramm ist sozusagen der minimalste Aufbau, was ein Riot OS Programm aufweisen muss. Das Programm befindet sich im Ordner „examples / default“.
Im Grunde besteht das default-Programm aus zwei Dateien. Dem Makefile und die main.c.

Kleiner Tipp:

Verwendet zum Programmieren Visual Studio Code von Microsoft. Die Software kann kostenlos heruntergeladen und verwendet werden.

Das Makefile

Im obersten Abschnitt werden zunächst die grundlegenden Einstellungen vorgenommen. Der Name des Programms, welches Board verwendet werden soll und der absolute Pfad zum Riot Basis-Ordner.

Der Programmname (default) kann frei gewählt werden. Der Name des Boards muss dem Ordnername des Board-Treibers entsprechen. Der absolute Pfad muss entsprechend angepasst werden, je nachdem wo sich euer Projekt-Ordner befindet. In diesem Fall befindet sich das Makefile im Ordner „default“, der sich wiederum im Ordner „examples“ im Riot-Hauptordner befindet. Also zwei Ebenen tiefer als der Hauptordner, deswegen „$(CURDIR)/../..“.

Als Beispiel: Würdet ihr einen extra Projekt-Ordner („projekte“) im Hauptverzeichnis anlegen und in diesem wiederrum einen Unterordner „firmaA“ erstellen und in diesem jeweils einen extra Ordner je Projekt anlegen („projektA“), so befindet sich der Projektordner drei Ebenen unter dem Hauptverzeichnis: „RIOTBASE ?= $(CURDIR)/../../..“.

Im nächsten Abschnitt des Makefiles werden weitere Grundeinstellungen vorgenommen. Unter anderem ein paar Hilfsmodule für die Entwicklung („DEVELHELP“ und „QUIET“). Diese können je Wunsch aktiviert bzw. deaktiviert werden.

Die spätere Kommunikation mit dem Programm läuft über diverse Shell-Befehle. Um diese zu aktiveren, muss das entsprechen Modul aktiviert werden. Des Weiteren kann durch das Modul „ps“ eine Art „Task Manager“ aktiviert werden. Dies erlaubt später das Ausgeben aller aktiven Tasks und dessen Speicherverbrauch.

Riot OS unterstützt das automatische Einrichten aller verfügbaren Sensoren und stellt zusätzlich diverse vordefinierte Funktionen zum Auslesen der Sensoren bereit. Der entsprechende Sensor-Treiber muss dies dann jedoch auch unterstützen.

Um je nach eingesetztem Board die benötigten Module zu laden, kann man diverse Parameter festlegen und davon abhängig die Module laden. Im Default-Beispielprogramm wird zum Beispiel abgefragt, ob das Board eine Netzwerk-Funktionalität besitzt. Dazu werden zunächst alle Boards aufgelistet, welche dazu gehören.

Anschließend werden abhängig davon die benötigten Module geladen:

Eine genaue Erklärung der Module kommt später. Aktuell werden diese im Default-Beispielprogramm noch nicht eingesetzt.

Am Ende des Makefiles werden noch weitere Module, je nach bestimmten Abhängigkeiten aktiviert. Zum Beispiel das Laden der Sensor-Treiber beim msb430-Board oder das Setzen des Channels, je nach Funkmodul. Dazu kommen wir aber später, wenn dies benötigt wird.

Für das einfache Default-Beispiel reichen im Grunde die am Anfang aufgezählten Grundeinstellungen (APPLICATION, BOARD, RIOTBASE, DEVELHELP, QUIET, shell, shell_commands und ps).

Die main.c

In der main-Datei befindet sich nun das eigentliche Programm.

Die main-Datei ist im Grunde wie jedes normale C-Programm aufgebaut. Am Anfang werden die benötigten Header-Dateien eingebunden und in der main-Funktion startet das Programm.
Welche Header-Dateien benötigt werden, ist unter anderem abhängig, welche Module im Makefile eingebunden wurden und auf welche Module in der main-Datei zurückgriffen wird. Im Default-Programm und im Grunde in jedem Riot-Programm müssen die Header-Dateien für die Shell eingebunden werden. Werden noch Netzwerk-Funktionen benötigt, müssen auch die dafür benötigten Header-Dateien eingebunden werden.

Um zu schauen, welche Header-Dateien benötigt werden, schaut auch am besten das entsprechende Examples- oder Testprogramm dazu an.

Bevor nun die eigentliche main-Funktion ausgeführt wird, werden im Hintergrund das eigentliche Betriebssystem und alle benötigten Treiber, Schnittstellen etc. geladen und eingerichtet. Wer sich anschauen will, welcher Code beim Start genau ausgeführt wird, der sollte in folgenden Dateien nachschauen:

• die Funktion „board_init“ in der Datei „board.c“ im entsprechenden Board-Treiber-Ordner
• die Datei „kernel_init.c“ im Ordner „core“
• die Funktion „cpu_init“ in der Datei „cpu.c“ im entsprechenden CPU-Treiber-Ordner

In der eigentlichen main-Funktion wird nun nach einer kleinen Begrüßung die Shell gestartet (shell_run). Die nun gestartete Shell wird in einer Dauerschleife betrieben. Jeder Code, der nach „shell_run“ steht wird nicht mehr ausgeführt.

In diesem Beispielprogramm wurden nun keine zusätzlichen Shell-Befehle definiert. Jedoch bringt das Shell-Modul selbst, sowie diverse andere Module jeweils eigene Shell-Befehle mit, welche dann automatisch zur Shell hinzugefügt werden.

Riot OS Programm ausführen

Riot OS bietet mit dem Board „native“ ein simuliertes Board, welches ohne Hardware auskommt. Es eignet sich deswegen super für den Einstieg in Riot OS. Dank diverser Hilfstools lassen sich mit dem native-Board ganze virtuelle Sensornetzwerke aufbauen.
Das kompilieren für das native-Board ist relativ simpel. Befindet man sich im Ordner „default“, so reicht ein einfaches „make“ und das Kompilieren beginnt.

RiotOS kompilieren - 18092018-Mobile-51KB, generic.de

Abbildung 1 – Riot OS kompilieren

Man sieht nun sehr gut, welche Dateien / Treiber mit eingebunden werden. Nach dem Kompilieren kann das Programm nun auf dem native-Board ausgeführt werden – „make term“.

Riot OS starten - 18092018-Mobile-14KB, generic.de

Abbildung 2 – Riot OS starten

Das native-Board ist gestartet und man befindet sich nun im Programm, welches dank der gestarteten Shell nun auf Befehle wartet. Mit „help“ lassen sich alle verfügbaren Befehle auflisten, welche jedoch im Default-Programm noch nicht sehr viele sind.

Riot OS - Auflistung aller Befehle - 18092018-Mobile-28KB, generic.de

Abbildung 3 – Riot OS Auflistung aller Befehle

Zusammenfassung

Ein Riot OS Programm ist relativ simpel aufgebaut und ermöglicht dankt der Modul-Bauweise einen schnellen Einstieg und ein unkompliziertes Entwickeln eigener Projekte. Dank des Simulationsboards „native“ lassen sich Projekte schnell testen, ohne bereits echte Hardware verwenden zu müssen und sich somit unter Umständen zusätzliche Fehler einzufangen.

Um einen guten Überblick über die weiteren Funktionen von Riot OS zu bekommen, empfehle ich euch die anderen Beispielprogramme durchzugehen. In diesen werden eine Vielzahl der Funktionen von Riot OS gezeigt. Die meisten Programme lassen sich zudem auf dem native-Board ausführen.

In meinem nächsten Blogbeitrag werde ich dann auf das eigentliche Sensornetzwerk eingehen und euch zeigen, wie ihr ein solches Sensornetzwerk aufbaut. Und dank des native-Boards, wird auch hier zunächst keine echte Hardware benötigt, so lässt sich die Funktionsweise super erklären.