Shell Kommandos – Kommunikation mit Riot OS

Nachdem mit dem Beispielprogramm "hello world" erste Erfahrungen mit Riot OS gesammelt werden konnten, kann man sich nun daran machen, etwas mehr mit Riot OS in Verbindung zu treten. Riot OS bietet dazu die sogenannten Shell-Kommandos. Mit diesen Kommandos kann man in Kontakt mit Riot OS treten und diverse Aktionen ausführen. In diesem Beitrag möchte ich euch zeigen, welche System-Kommandos es gibt und wie man eigene Shell-Kommandos einrichtet.

Die Shell

Die Shell im Allgemeinen ist sozusagen die Schnittstelle zwischen dem Betriebssystem und dem Benutzer. Sie wird auch als Kommandozeileninterpreter bezeichnet. Über sie lassen sich Befehle ausführen, welche vom Betriebsystem direkt umgesetzt werden. Die Kommandozeile in Linux-Systemen oder die Eingabeaufforderung bei Windows ist auch eine sogenannte Shell. Verbindet man sich also zum Beispiel per SSH mit einem Raspberry, so gelangt man auf die Shell des Raspberrys. Verbindet man sich nun mit seinem Riot-Board, so gelangt man auf die Shell von Riot OS. 

Vorbereitung

Wie ich bereits beim Beispielprogramm "hello world" erklärt haben, werden im Makefile die benötigten Module eingebunden. Die Shell wird in Riot OS ebenfalls als Modul gesehen und muss somit im Makefile eingebunden werden.

Ein benötigtes Modul lautet "shell". Möchte man neben den Systemshell-Befehlen auch zusätzlich  eigene Shell-Befehle definieren, so muss auch noch das Modul "shell_commands" eingebunden werden. Das Modul "ps" wird für die Systemshell benötigt, da dieses eine Funktion der Systemshell bereitstellt. 

Zusätzlich zu den Angaben im Makefile müssen auch im main.c-File die entsprechenden Header-Files eingebunden werden.

System-Shell - vordefinierte Systemkommandos

Riot OS definiert, je nach eingebundenen Module, bereits diverse Shell-Kommandos, welche ohne eigenes Zutun verwendet werden können. Bei Programmen mit Netzwerkfunktion sind dies zum Beispiel Kommandos zum Abfragen der IP-Adressen oder zum Senden von einfachen UDP-Paketen.

Wie schon erwähnt, sind es je nach Programm unterschiedliche vordefinierte Shell-Kommandos. Zwei Befehle sind jedoch immer dabei.

Zum Einen der Befehl "reboot". Wie der Name schon sagt, startet dieser Befehl das Riot-Board neu. Der zweite Befehle lautet "ps". Dieser zeigt alle aktuell laufende Prozesse auf dem Riot-Board. 

Eigene Shell-Kommandos - Das Testprogramm "shell"

Riot OS bietet ein kleines Test-Programm um einen kleinen Einblick in die Shell von Riot OS zu bekommen. Man findet es im Riot OS Ordner im Unterordner "tests/shell".

main.c

Schaut man sich die main-Funktion im c-File "main.c" an, so erkennt man sehr gut, mit welchem Befehl die Shell aktiviert wird. 

Zum Beginn wird ein Buffer erstellt, welcher vom Shell zum Zwischenspeichern verwendet wird. Anschließend wird der Befehl zum Starten der Shell ausgeführt. Hier unterscheidet man zwischen zwei unterschiedlichen Arten des Aufrufens. Je nachdem ob man zusätzliche eigene Shell-Kommandos erstellen möchte oder man nur die Systembefehle benutzen möchte.

Nur die System-Shell

shell_run(NULL, line_buf, SHELL_DEFAULT_BUFSIZE)

Hier wird die Funktion zum Aktivieren der Shell aufgerufen - "shell_run(...)". Als Übergabewert wird ein NULL-Pointer, die Buffer-Variable und die Größe des Buffers. 

zusätzliche eigene Shell-Befehle

shell_run(shell_commands, line_buf, SHELL_DEFAULT_BUFSIZE)

Wie man nun sofort erkennt, ist die aufgerufene Funktion die gleiche. Der Unterschied liegt in den Übergabewerten. Neben der Buffervariable und der Buffergröße werden nun zusätzlich die eigenen Befehle übergeben. Diese werden in einer Art Array-Struktur vom Datentyp "shell_command_t" abgespeichert. 

Um also eigene Befehle anzulegen, muss diese innerhalb des Programms definiert werden. Im Testprogramm "shell" erfolgt dies direkt über der main-Funktion.

Mann erkennt sehr schnell die Syntax. Jeder Befehl wird in einer separaten Zeile definiert. Eine solche Zeile wird in geschweiften Klammer gesetzt. Begonnen wird mit dem eigentlichen Befehl. In diesem Fall "start_test". Darauf folgt die Beschreibung des Befehls. Abschluss der Zeile macht der Name der Funktion, welche beim Ausführen des Befehls aufgerufen werden soll. 

Hat man nach diesem Syntax seine Befehle definiert, folgt zum Abschluss eine NULL-Zeile.

Die in der Struktur angegebenen Funktionen, die beim Ausführen des Befehls aufgerufen werden sollen, müssen nun natürlich noch angelegt werden. Im Testprogramm erfolgt dies direkt über der shell_command_t-Struktur.

Der Aufbau dieser Funktionen erfolgen ebenfalls nach einer bestimmten Syntax. Diese Funktionen bekommen als Übergabewert die Anzahl der Befehlen (int argc) und den Befehl (char **argv) selber. Setzt man also zum Beispiel den Befehl "send Hallo Welt" über die Shell ab, so beinhaltet die Variable argc eine "4" und der Pointer "**argv" würde auf ein Array mit folgendem Inhalt zeigen: "send", "Hallo", "Welt". 

Nach den beiden Einträgen "(void) argc" und "(void) argv" kann nun der eigentliche Code der Funktion angegeben werden. 

Verbinden mit der Shell

Hat man seine Befehle definiert und die entsprechenden Funktionen erstellt, kann man sein Programm kompilieren und sich mit dem Riot-Board verbinden. Dazu loggt man sich auf seiner virtuellen Maschine ein und wechselt in den Ordner des Tesprogramms "shell". Anschließend kann man sich mit dem Befehl "make term all" mit dem nativ-Board verbinden.

Man hat sich nun mit der Shell des Riot-Betriebsystems verbunden und kann nun die vorher definierten Befehle ausführen. Um eine Auflistung aller möglichen Befehle zu bekommen, kann man nun den Befehl "help" ausführen. 

Hier sieht man nun die beiden System-Kommandos und die drei zusätzlich definierten Shell-Kommandos. 

Spätere Programme und Projekte haben natürlich noch viel mehr Befehle. Sei es das Messen von Temperatur oder halt diverse Netzwerkbefehle. Dazu aber später mehr, wenn es soweit ist. Ich hoffe ich konnte euch einen Einblick in die Shell von Riot OS geben und euch zeigen, wie ihr eigene Shell-Befehle definiert. 


Du möchtest keinen Beitrag zum Thema Riot OS verpassen?

Abonniere meine Email-Benachrichtigung und erhalte eine Email, sobald ich einen neuen Beitrag veröffentliche. Du kannst dich selbstverständlich jederzeit wieder austragen.


 

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
Fotos und Bilder
 
 
 
sonstiges Dateiformat
 
 
 
  Subscribe  
Benachrichtige mich zu: