News   Magazin   Börse   Links   ArcArchie   Homepages
 Magazin  RISC OS & C-Programmierung 2: Aufruf von Routinen des Betriebssystems Home 
Hardware   Software   Praxis   Sonstiges  
RISC OS & C-Programmierung 2: Aufruf von Routinen des Betriebssystems  Alexander Ausserstorfer 23. 2. 2015

Bei SWIs handelt es sich um Software-Interrupts. Dahinter verbergen sich Betriebssystemroutinen, welche uns RISC OS zur Verfügung stellt. Man kann von einem Programm aus diese Routinen anspringen und ihnen dabei Parameter, Werte oder Daten mit übergeben, damit sie irgendwas damit machen. Das Grundkonzept entspricht weitgehend den uns schon aus dem ersten Teil bekannten C-Funktionen.

Das Interessante an dem ARM-Prozessor und RISC OS ist, dass beide gemeinsam miteinander erschaffen worden, also füreinander ausgelegt sind. Die ARM-CPU verfügt bereits über einen Maschinenbefehl zur Benutzung von SWIs, was zeigt, wie sehr RISC OS und die ARM-CPU miteinander verschmolzen sind.

Die meisten SWIs von RISC OS werden in den "Programmer's Reference Manuals" (PRMs) erklärt. Diese sind auf dem Raspberry Pi nach Installation von RISC OS als PDF-Dateien zu finden unter $.Documents.Books.PRMs. [Anm. cms: Ansonsten findet man die PRMs auch im Internet.] Dabei handelt es sich jedoch noch um eine alte Version, die ursprünglich vom Hersteller Acorn als gedruckte Handbücher für RISC OS 3 ausgeliefert worden ist. [Anm. cms: Zusätzlich gibt es das StrongHelp Handbuch Wimp. Das ist nicht so ausführlich wie die Programmer's Reference Manuals, kann beim Programmieren zum Nachschlagen aber doch sehr hilfreich sein.]

RISC OS besteht aus sogenannten Modulen. Diese Module können nahezu beliebig zusammengesetzt werden. Jedes dieser Module erweitert das Gesamtsystem um neue Funktionen und stellt daher auch die entsprechenden SWIs zur Verfügung. Die PRMs decken nur die wesentlichen Module aus der Zeit von RISC OS 3 ab. Spätere Module werden dabei nicht berücksichtigt, und auch nicht Module von Drittherstellern. Die Dokumentation über deren Module und bereitgestellten SWIs muss man daher oft gesondert suchen gehen. Die auf dem System vorhandenen Module können durch Druck auf die Taste F12 und Eingabe von *Modules oder *Help Modules abgerufen werden. Nähere Informationen zu den einzelnen Modulen findet man per *Help <Modulname>.

HelloWorld Programm Fehlt solch ein Modul, lässt sich der zugehörige SWI natürlich nicht ansprechen, da er nicht existiert.

SWIs lassen sich in der RISC OS Version von GCC aus direkt über die Libraries SharedCLibrary und SharedUnixLibrary mit Hilfe der Funktionen _swix() und _kernel_swi() ansprechen. Im Prinzip stellen diese Funktionen nur ein Interface zur Verfügung, damit man von GCC aus an die SWIs herankommt. Man muss hierzu die beiden Libraries kernel und swis nutzen. Beide sind bereits in der Standard-Version von GCC für RISC OS integriert.

Das Beispielprogramm im Bild nutzt statt der Standardlibrary stdlib und der in C standardisierten Funktion printf() die direkte Methode durch Aufruf eines SWIs.

Dieser C-Quellcode ist bereits RISC OS spezifisch. Er lässt sich nicht mehr für andere Betriebssysteme nutzen. Compiliert und ausgeführt erhält man jedoch das selbe Ergebnis wie mit dem Beispielprogramm aus dem ersten Teil.

Um zu wissen, was der SWI OS_Write0 macht, schaut man im PRM 1 (1-504, PDF Seite 534) nach. Ein Programm, welches in seinem frei verfügbaren Quellcode massiv von diesen beiden Funktionen _swix() und _kernel_swi() Gebrauch macht ist der E-Mail-Client POPStar.

So gut und einfach diese Lösung auch ist, denn es lassen sich alle verfügbaren SWIs nutzen, einen Haken hat sie: Der Compiler GCC verfügt über keine näheren Informationen zu diesen SWIs und kann deshalb auch keine Datentypen etc. prüfen. Denn jede Funktion erwartet bei der Übergabe von Daten bestimmte Vereinbarungen. Es werden letzten Endes zwar immer Binärmuster übergeben, aber diese können zum Teil ganz unterschiedliche Bedeutungen haben:

  • Dezimalwert
  • ASCII-Zeichenkette
  • Speicheradresse
  • etc.

HelloWorld kompilieren Die Programmiersprache C trägt diesem Sachverhalt Rechnung, indem sie verschiedene Datentypen einführt, um bei der Kompilierung eine Überprüfung zu ermöglichen, ob die gegebenen Datentypen auch mit den aufzurufenden Funktionen zusammenpassen. Ist dies nicht der Fall, so erhält man bei der Kompilierung des Programms eine Warnung oder gar einen Fehler. In letzterem Fall lässt sich der Quellcode gar nicht erst compilieren. Man erhält damit kein ausführbares Programm.

Damit dem Compiler diese Datentypen bekannt gemacht werden können, hat man weitere Libraries erstellt, welche an Stelle der SWIs richtige C-Funktionen zur Verfügung stellen. Diese C-Funktionen greifen dann direkt auf die entsprechenden SWIs zurück, verwenden aber die C zugrunde liegenden Datentypen und -strukturen und ermöglichen somit eine Überprüfung während des Compilier-Vorganges.

Für RISC OS gibt es zwei solcher Bibliotheken:

[Anm. cms: Es gab und gibt weitere C-Libraries, aber OSLib und DeskLib sind heute die gebräuchtlichsten.] Um es gleich vorweg zu sagen: C-Quellcode, der für die Library OSLib geschrieben ist, lässt sich nicht mit DeskLib verwenden und umgekehrt.

 
Weiter geht es im dritten Teil mit der Parameterübergabe.

Einen Fehler im Artikel gefunden, etwas unklar, Ergänzung oder ein Tipp? Einfach eine Nachricht schicken!

Name: *

EMail:

Text: *
Hardware   Software   Praxis   Sonstiges  
ArcSite   News   Magazin   Börse   Links   ArcArchie   Homepages