Programmierung des Handy Boards

Die Möglichkeiten des Handy Boards

Das Handy Board ist ein etwa handgroßes, batteriebetriebenes Microcontrollerboard.

Technische Daten:

Die Verbindung zum Host-Rechner wird über ein serielles Interface hergestellt, daß per gewöhnlicher Telefonleitung mit dem Handy Board verbunden wird. Auf diesem Weg wird sowohl die Firmware auf das Handy Board runtergeladen als auch der jeweilige Programmcode zur Steuerung der Boardfunktionen.

Der Motorola 68HC11

Die Programmierung eines Mikroprozessors ist komplex (siehe PDF-Anleitung) und soll hier nicht im Detail beschrieben werden. Ich möchte allerdings auf einige spezifische Eigenschaften des 68HC11 eingehen, um die Möglichkeiten darzulegen.

Der Motorola 68HC11 besitzt einen 16bit- bzw. zwei 8bit-Akkumulatoren, zwei Index-Register und jeweils ein Register für stack pointer und program counter. Spezielle Features:

Der Prozessoreigene Speicher (64kb Adressraum, 16bit-pointer) ist unterteilt in die Bereiche Die Datentransfers zum Benutzen obiger Features basieren einfach auf Lese-/Schreibzugriffen in den entsprechenden Registern. Hardwareseitig hat der Prozessor dazu fünf Ports, jeweils entweder nur für Ein- bzw. Ausgabe oder beides konzipiert. Jeder Port hat eine Datenbreite von 8 bit, repräsentiert als Pins auf der Platine.

Die softwareseitige Steuerung

Um das Board zu aktivieren, muß es zunächst in den sog. bootstrap mode gebracht werden. Der mit der Programmierumgebung mitgelieferte Downloader läd dann eine Hexdatei in den Boardspeicher, die angibt, welche Daten wo im Speicher unterzubringen sind. Desweiteren muß das CONFIG-Register des Prozessors programmiert werden, um auf den Speicher des Boards zugreifen zu können. Von hier an bestimmt die Implementierung der Programmierschnittstelle das weitere Vorgehen.

Möglichkeiten zur Programmierung

Das Board kann auf verschiedene Arten programmiert werden. Es werden im Folgenden zwei Implementierungen vorgestellt:

Interactive C

Das MIT stellt zur Programmierung des Handy Boards Interactive C (IC), eine plattformübergreifende, multitaskingfähige Version der Programmiersprache C zur Verfügung. Der Sprachumfang von IC ist eine Untermenge von C, die alle wesentlichen syntaktischen Elemente abdeckt. IC besteht zum einen aus einem Compiler, zum anderen aus einem Laufzeit-Pseudocode-Interpreter. Der Compiler produziert also keinen nativen Prozessorcode, sondern Pseudecode, der laufzeitinterpretiet wird. Dieser Ansatz bietet Vorteile im Hinblick auf:

Die Taskverwaltung wird dabei komplett vom Interpreter übernommen. Der einfache, Stack-basierte Aufbau erlaubt es dabei, zwischen den Tasks zu wechseln, indem einfach ein neuer Stackpointer samt zugehörigem program counter geladen wird. Der Geschwindigkeitsnachteil gegenüber nativem Code ist gegenüber diesen Vorteilen vernachlässigt worden.

Wird IC gestartet, versucht es, mit dem Board Kontakt herzustellen, daß eingeschaltet sein und auf dem sich die Hexdatei befinden muß. Ist dies der Fall, werden die Standard-Bibliotheken auf das Board geladen und man findet sich im interaktiven Modus von IC wieder, in dem nun C-Anweisungen eingegeben werden können, die direkt interpretiert werden, oder ein IC-Kommando eingegeben werden kann, um z.B. einen kompletten Quelltext (oder mittels Gruppierung in einer Listendatei gleich mehrere) zu compilieren und auf das Board zu laden. Genauso kann gezielt eine einzelne Datei wieder entfernt werden. Dabei werden automatisch alle restlichen Dateien neu geladen. Man hat weiterhin die Möglichkeit, sich alle z.Zt. geladenen Dateien anzeigen zu lassen, ebenso wie alle aktuell definierten Funktionen oder globalen Variablen. Außerdem können die aktuell laufenden Prozesse ermittelt und beendet werden.

IC erlaubt es, innerhalb eines normalen C-Quelltextes Maschinencode-Programmteile wie Funktionen zu laden, oder sogar Maschinencode direkt in den Boardspeicher zu laden, der dann über Software- oder Hardwareinterrupts gestartet wird. Ein Großteil der mitgelieferten Bibliotheksfunktionen ist auf diese Weise implementiert worden.

Java

Diese Implementierung ist als eigenständiges Miniaturbetriebssystem realisiert und sticht durch geringen Platzbedarf hervor. Die VM selbst ist in nativem 68HC11 Assemblercode geschrieben und benötigt weniger als 10kb plus 100 Bytes Datenspeicher, wobei zu beachten ist, daß die Applikationen selbst natürlich zusätzlichen Speicher benötigen. Threads werden (bis auf einige Einschränkungen wie fehlendes synchronized) preemptiv per Zeitscheibe implementiert, und bei einer Taktung von 8MHz sollen mindestens 4-8 Threads zeitgleich ablaufen können. Die Java.lang Klassen wurden speziell optimiert, um Speicherplatz zu sparen, Exceptions und Interfaces sind vollständig implementiert, ebenso wie ein garbage collector (640 Bytes). Über Startoptionen lassen sich Parameter wie Stack- und Heapgröße sowie die Anzahl der Threads festlegen. Weiterhin ist eine Klasse für direkten Speicher- und Kontrollregisterzugriff implementiert worden. Einige Einschränkungen bezüglich Performance oder Details hinsichtlich der Klassenportierungen sind zugunsten des geringen Speicherbedarfes allerdings hinzunehmen.

Um die geringe Rechenleistung des Prozessors nicht zu überfordern, werden die Applikationen auf dem Hostsystem fertig gelinkt und erst anschließend auf das Board transferiert. Beim Linken der .class-Dateien zur downloadfertigen Applikation werden nur tatsächlich referenzierte Komponenten eingefügt. Ebenso werden symbolische Referenzen innerhalb der .class-Dateien direkt durch relative Speicheroffsets ersetzt, was die Ausführungsgeschwindigkeit signifikant steigert.

Auf der Homepage finden sich weitere Details zu Features und unterstützter Hardware.