% Content-encoding: UTF-8 \documentclass[ngerman]{article} \usepackage[T1]{fontenc} \usepackage[latin1]{inputenc} \setcounter{secnumdepth}{0} \setcounter{tocdepth}{0} %\begin{document} \label{m16c} \title{Der M16C von Renesas lernt Forth} \author{Albert van der Horst} \maketitle Mit freundlicher Genehmigung der HCC--Forth--gebruikersgroep aus dem Niederländischen übersetzt von Fred Behringer. Das Original erscheint oder erschien etwa zur gleichen Zeit im Vijgeblaadje 65. Der Autor des vorliegenden Artikels war maßgeblich an der Entwicklung des elektronisch angesteuerten Metall--Xylofons Tingel--Tangel beteiligt. Wir, die aktiven Besucher der Jahrestagungen der Forth--Gesellschaft, haben 2004 auf Fehmarn die Bekanntschaft des Tingel--Tangels machen dürfen, als Willem Ouwerkerk und Albert Nijhof, die bei uns zu Gast waren, eine Vorführung veranstalteten (Bericht im VD--Heft 3/2004). Die Vorführung schlug ein wie eine Bombe. Alle waren begeistert und gleich zum Linux--Tag im anschließenden Jahr, wo auch die Forth--Gesellschaft einen Stand unterhielt, wurde auf Einladung des Direktoriums das Tingel--Tangel als \emph{Kassenmagnet} mitgenommen, diesmal vorgeführt von Albert Nijhof und dem Autor des vorliegenden Artikels. Ganz beiläufig wurden die linux--interessierten Besucher so auch auf Forth aufmerksam und wir konnten einen Zuwachs an FG--Mitgliedern verzeichnen. Der Autor ist in Forth--Kreisen seit Längerem als Entwickler von ciForth bekannt. \begin{multicols}{2} \section{Einleitung} Die meisten von uns führen ihre Entwicklungen auf demselben Computer durch, auf dem dann auch das Programm läuft. Bei eingebetteten Systemen ist das aber längst nicht selbstverständlich. Sie sind zu klein, um darauf auch noch ein Entwicklungssystem mit grafischen Möglichkeiten und einen optimierenden C--Compiler laufen zu lassen. In den 70--er Jahren wurden winzige Systeme als Entwicklungssystem eingesetzt, z.B. mit sagen wir 8 kByte RAM und einer 100--kByte--Floppy. Eine solche Technik ist auch heute noch im Einsatz. Ein Beispiel dafür ist der BASIC--Interpreter in den Lego--Roboter--Bausteinen. Aber der beste Repräsentant dieser Technik heißt Forth. Da hat man dann also ein ganz kleines Betriebssytem auf seinem eingebetteten System mit einem Befehls--Interpreter. Das ist ein großer Vorteil, wenn man unverlässliche, in Entwicklung befindliche Hardware verwendet, so z.B., wenn man sich selbst was zusammengelötet hat. Aber auch in der Industrie zählt dieser Vorteil. Schlechte Dokumentation hat übrigens dieselbe Wirkung wie unzuverlässige Hardware. \section{Demonstration einer Ansteuerung} Auf dem Treffen der Forth--gebruikersgroep am zweiten Samstag im vergangenen Oktober habe ich mit einem Einplatinen--Computer von Renesas ein Steuerungsproblem vorgeführt. Das Tingel--Tangel (ein Metall--Xylophon) spielte die Big--Ben--Melodie und schlug die Stunde. Auf dem Sig--Embedded--Treffen von Cimsolutions die Woche zuvor war diese Demonstration noch nicht gelungen. Immerhin wurden die Primzahlen bis zu 100.000 berechnet: Der Compiler arbeitete gut. Auch konnte ich hoffentlich vermitteln, welche Vorteile ein interaktiver Interpreter mit sich bringt: Mit einfachen Befehlen wurde nachgeprüft, dass die Leitungen zum Tingel--Tangel korrekt angelötet waren. Ich denke, dass man die Geschwindigkeit beim Entwickeln mit Forth in der Tat als einen Vorteil betrachten kann. Die Ansteuerung mit den Timings und Ähnlichem ist nicht trivial, hat aber nicht mehr als nur einen Abend Arbeit gekostet (wobei allerdings das Löten nicht mit eingerechnet ist). \section{Dies ging voraus.} Es ist nun schon wieder zwei Jahre her, dass die europäische (ursprünglich niederländische) Elektronik--Zeitschrift Elektor ihrem Dezemberheft 2005 eine Mikro--Computer--Platine als Geschenk beilegte, ein Reklame--Bravourstückchen des Renesas--Importeurs Glyn. (Der Übersetzer: Ich kann mich noch gut daran erinnern: Heinz Schnitter hatte uns darauf aufmerksam gemacht, als es schon fast zu spät war. Sämtliche Zeitschriften--Kioske waren elektor--ausverkauft. Nach vielem Herumlaufen wurde ich schließlich in Vaterstetten in der Umgebung von München (j.w.d.) fündig. Die wussten nicht, dass sie auf einem Schatz saßen.) Renesas, vormals Mitsubishu (wichtig für die Suche nach Informationen), ist der Marktführer auf dem Gebiet der mittelgroßen flashbasierten Mikro--Controller. Wir haben es hier also nicht mit Kleinstcomputern zu tun, die eine flackernde Leuchtdiode ansteuern (künstliche Wachslichter mit eingebautem Computer, 2 für 1 Euro 50, inklusive Lithium--Batterie\footnote{Ja, das ist auch ein eingebettetes System, und nein, es läuft nicht unter Windows CE.}) ), sondern mit etwas größeren Systemen. Für die anstehenden 10 Euro wollte ich da gern noch mehr davon wissen und ich machte mich daran, meinen Forth--Compiler (ciforth) auf diesen Chip zu portieren. Der Befehlssatz und die übrigen Eigenschaften stimmten mich enthusiastisch. Mit dem (gratis!) mitgelieferten Entwicklungspaket lief der Compiler schon unter dem Emulator recht ordentlich. Für eine serielle Verbindung zum Computer war noch etwas Hilfselektronik nötig. Als das nicht auf Anhieb hinhaute, beschloss ich, gleich mit einem größeren Evaluation--Board, das von Glyn für 50 Euro komplett geliefert wurde, ans Werk zu gehen. (Ich danke hiermit Cimsolutions für die Vermittlung bei der Anschaffung: Glyn scheute sich davor, an privat liefern. Da habe ich dann zehn davon kommen lassen, von denen noch einige weitergegeben werden können. Inklusive CD--ROM und seriellem Kabel.) Hiermit habe ich dann losgelegt, mit dem Ergebnis, dass ich jetzt ein ausgetestetes, dokumentiertes und vor allem brauchbares Entwicklungssystem habe. \section{Flash--basierte Mikro--Controller} Was enthält nun so ein mittelgroßer Controller heutzutage? Zunächst einmal kommen sie mit einer schwindelerregenden Vielfalt daher, was die eingebauten Steuerungsmöglichkeiten betrifft. Normale digitale E/A, um z.B. etwas anzuschalten, AD--Wandler, um z.B. einen Sensor auszulesen, programmierbare Timer, spezielle Hardware zum Ansteuern von Motoren, Schnittstellen zum CAN--Bus, wie er in Autos verwendet wird, ja man kann jederzeit einen Chip finden, der genau das tut, was man haben will, und nicht mehr. \emph{Nicht mehr}, was natürlich vom Kostenstandpunkt aus gesehen sehr wichtig ist. Dieselbe Vielfalt findet man in Bezug auf den Speicher. Da geht es von 48 kByte Flash bis in die Megabytes. Diese kleinen Computer werden im Allgemeinen als Turnkey--Geräte verwendet. Man denke an Bordcomputer im Auto. Man schaltet sie ein und sie beginnen ihre Arbeit. Die Renesas--Prozessoren können Programme im Flash direkt ausführen.\footnote{Populär ausgedrückt: Es sind PCs mit nur BIOS und keiner Festplatte.}) Das RAM ist dann nur für Daten da. Mein Evaluation--Board hat 32 kByte RAM und 512 kByte Flash an Bord. \section{Was wollen wir eigentlich tun?} Ein ausgewachsenes ciForth unter Linux belegt so an die 30 kByte\footnote{Beta 5.18 : 28.542 Bytes, um genau zu sein (und alles sitzt drin, nix mit dynamisch gelinkten Bibliotheken).}) und die Quellbibliothek beläuft sich auf einige Hundert kByte. Ein ciForth--System möchte gern im RAM laufen und die Bibliothek passt prima ins Flash. Mit anderen Worten, das Evaluation--Board erfüllt reichlich die Anforderungen, die man stellen muss, um ein Entwicklungssystem aufzubauen. Worauf wollen wir hinaus? Wir wollen die serielle Verbindung zur Kommunikation mit einem Forth verwenden, das auf der Platine läuft. Das ist das uralte Konsolen--Modell: Man tippt was ein, der Computer führt es aus, liefert seine Antwort ab und meldet sich mit einem Prompt. Sowas nennt man häufig eine DOS--Box\footnote{Abfällig. Computer--Fachleute verwenden den Ausdruck \emph{Console--Window}. Selbst Microsoft kommt übrigens zur Einsicht, dass für Computer--Fachleute ein Konsolenfenster unverzichtbar ist. Man google sich durch nach \emph{Powershell}. }). Dann kann man beispielsweise mit ein paar interaktiven Befehlen austesten, wie man seinen Prozessor achtmal so schnell laufen lassen kann, ob man seine LEDs überhaupt richtig angeschlossen hat, was der Temperatursensor meldet usw. Zu alldem ist es nötig, dass das Forth--Programm beim Starten (aus dem Flash heraus, anders geht es nicht) erst ins RAM kopiert und dort dann ausgeführt wird. \section{Schwierigkeiten beim Entwickeln} Das Entwicklungssystem von Renesas (in Visual--Studio--Aufmachung) wurde unter Windows 98 SE installiert, da ich kein XP--System mit dem erforderlichen seriellen Anschluss habe. Aber damit funktionierte es dann auch auf Anhieb. Es wurde jedoch ganz schnell deutlich, wie stark C--orientiert das System ist. Es traten verschiedene Schwierigkeiten auf, die teilweise im Kontakt mit Glyn beseitigt werden konnten. Ärgerlich war auch das Extra--System, das nötig war, um über den zweiten seriellen Anschluss mit Forth kommunizieren zu können. Als es sich auch noch herausstellte, dass nach dem Laden einige RAM--Adressen systematisch mit 0FF belegt wurden, war das Maß voll. Ich erfuhr, dass es für diesen Chip einen Flasher für Linux gab und dass auch die Version 2.0, die freigegebene DOS--Version des Assemblers, unter dosemu, dem DOS--Emulator von Linux, ausgezeichnet lief. Das ciForth--Entwicklungssystem, das die Assembler--Datei erzeugt, im Verein mit Dokumentation und Testen, läuft natürlich unter Linux. Windows wurde definitiv als Entwicklungssystem verworfen. Es beunruhigte natürlich sehr, dass die eigentliche Struktur eines C--Programms unter niederen h--Dateien verborgen blieb, was um Himmels willen das Monitor--Programm im Flash\footnote{Wo das Windows--Entwicklungssystem mitspricht.}) alles tat, wie die ganze Interrupt--Struktur da eigentlich aussah, wie das mit dem id--Code eingerichtet war, den man fürs Flashen benötigt, und dann die Restart--Vektoren --- neben den Interrupts --- Watch--Dogs, nicht--maskierbare Interrupts, Single--Step--Gebahren ... Bevor es dann richtig losgehen konnte, gab es noch ein Problem. Das Programm muss im RAM laufen, aber im Flash aufbewahrt werden. Das Renesas--Entwicklungssystem, aber auch der Linux--Flasher konnten damit nicht umgehen. Vom Linux--Flasher stand der Quelltext zur Verfügung, so dass ich nach einem Wochenende an harter Arbeit einen Flasher in Forth geschrieben hatte. Dieser Flasher hat noch einen anderen wesentlichen Vorteil. Er löscht nur die Blöcke, die er beschreiben will, so dass ich die Bibliothek und das Forth--System unabhängig voneinander flashen kann. \section{Es beginnt zu funktionieren.} Das erste Programm, zum Anschalten einer LED, war drei (Assembler--)Befehle groß. Des Weiteren musste nur noch der Reset--Vektor so gesetzt werden, dass er auf dieses Programm zeigt. Kurz und gut, alle Lösungen waren simpel. Interrupts? Aus! Id? Auf null! Monitor? Diesen Happen dumpen! Restart: Den Reset setzen. Das war's! Und ... es funktionierte tatsächlich. Jetzt mal schnell etwas einbauen, das dieses 3--Befehls--Programm sich selbst ins RAM kopieren lässt, so dass es dann da laufen kann. Da ging zunächst einmal nichts.\footnote{Mehr erzähl ich nicht. Wer es mir nicht glaubt, der probiere sowas mal selbst aus.}) Nach dem vierten Anlauf lief es dann schließlich. Nun denselben Spaß in Forth einbauen und das Debuggen konnte beginnen. Zwei Stunden später konnte ich die Start--up--Botschaft von ciForth bewundern: \texttt{R16C ciforth beta \$RCSfile: cir30.gnr,v \$ \$Revision: 1.33 \$}. Das bedeutete zugleich, dass das Ausführen von Tests möglich war. Jetzt ging es etwas besser voran. Der Arbeitszyklus bestand aus \mbox{flashen}, Jumper umstecken, erneut starten, Kermit aufrufen. Kermit ist ein \emph{Terminal Emulator}, ein Programm, das sich über eine serielle Schnittstelle mit Forth unterhält. Jetzt kann ich also ein und dieselbe serielle Schnittstelle benutzen. Es ist kein zweites System und kein zweites Kabel mehr nötig. \section{Testen, testen.} Nun konnte damit begonnen werden, die 328 Blöcke, aus denen dieses Forth besteht, zu debuggen. Viele Blöcke sind zum Glück systemunabhängig und bereits ausgiebig getestet, aber 75 Blöcke sind in Assembler geschrieben und enthalten unvermeidlich Fehler. Forth ist interaktiv, höchst modular und hat viele eingebaute Debug--Möglichkeiten. Zehn Tage, nachdem das LED--Programm lief, konnte ich bereits den Hayes--Test --- eine Art Validation der ISO--Aspekte eines Forth--Compilers --- auf mein Forth loslassen, wodurch noch zwei Bugs aufgespürt wurden. Sowohl Kermit wie auch ciForth sind flexibel. Nach Anpassungen des Prompts von ciForth, der dann wieder von Kermit verstanden wird, kann der Test völlig automatisch laufen, bis hin zur Überwachung der Ausgabe. Und für die Experten: Auch alle Ausnahmefälle (exceptions) werden getestet. Das geht, weil der Test über den Interpreter läuft und das System bei einer Ausnahmesituation im Interpreter landet. Automatisch testen ist vielleicht ein von allerlei Marketing--Gags ausgehöhlter Begriff. Unter automatisch verstehe ich Folgendes \begin{verbatim} albert@apple ~/renesas>make test albert@apple ~/renesas>echo $? 0 albert@apple ~/renesas> \end{verbatim} Der Befehl \verb'make test' hat kein Ergebnis geliefert, sehr wohl jedoch einen Return--Code von 0, d.h. okay. Spaßeshalber frage ich den hier explizit ab. Die Struktur ist also so beschaffen, dass dieser Test selbst wieder in einem anderen Test als Baublock verwendet werden kann, und so gehört es sich auch. Das ciForth--Stammprogramm enthält für jeden Baublock neben dem Programm--Code und der Modulbeschreibung auch einen oder mehrere Tests. Jeder Test besteht aus einem Befehl und dem erwarteten Ergebnis. Das alles zusammen bildet den endgültigen Test und der wird neben Hayes auf den Befehl \verb'make test' hin ausgeführt. \section{Die Verwendung des Flash--Speichers} Der Controller auf dem Renesas--Board verfügt über 7 Bereiche von 64 kByte, die getrennt geflasht werden können, 1 von 32 kByte, und dann noch 3 von 8 kByte und 2 von 4 kByte. Der oberste Bereich von 4 kByte erklärt der Platine, wo sie anzufangen hat, und muss immer belegt werden. Er zeigt auf das Startprogramm und an das kommen wir nicht mehr heran. 2 Bereiche von 8 kByte enthalten zusammen das Forth--System, 4 kByte bleiben übrig. Das erste Stück davon ist das Startprogramm, das das besprochene Forth--System ins RAM kopiert. Aber zuerst wird nachgeprüft, ob der Bereich von 32 kByte noch jungfräulich ist, was man nach dem Flash--Säubern an den 0FFs ablesen kann. Wenn nicht, dann ist dieser Bereich von einem Programm belegt. Das kann sowohl ein erweitertes Forth sein, wie auch ein Programm, das etwas Nützliches tut, wie z.B. das Abspielen von Big--Ben oder ein ferngesteuerter Mehrkanal--Lichtdimmer. Zwei Bereiche von 64 kByte enthalten die Forth--Bibliothek. Das lässt uns noch 5 Bereiche von 64 kByte und noch ein paar kleinere Bereiche. \section{Die Bibliothek} Zwei Bereiche von 64 kByte enthalten ein klassisches Forth--Block--System. Das bedeutet, dass es in Blöcken von 1 kByte mit Quelltext unterteilt ist, die allesamt getrennt voneinander eingeladen werden können. In herkömmlicher Weise enthält jede erste Zeile ein Kommentar mit dem Befehl, der hinzugefügt wird, sowie ein bisschen Buchhaltungsinformation. Das wird in ciForth über den Befehl WANT als eine \emph{On--Demand--Bibliothek} verwendet. So sorgt \verb'WANT class' dafür, dass der Befehl \verb'class', eine Erweiterung mit objekt--orientierten Möglichkeiten, geladen wird. Die Renesas--Bibliothek enthält das meiste von dem, was die ciForth--Systeme unter Linux und Windows auch haben: Generische Algorithmen: Binärsuche, Quicksort, Merge\-sort Code--Untersuchung: Decompiler, Aufsuchen der Wortquellen Objekte: Definieren von Klassen und Methoden Beispiele und Benchmarks: Primzahlensieb, Verschachtelungsbenchmark, Byte--Benchmark, Automatisierung des Entwicklungskreislaufs Nützliche Tools: Speicherdump, Umschalten auf case--insensitive, \verb'SAVE-SYSTEM' , \verb'TURNKEY' Was fehlt, ist der Pentium--Assembler, der hier keinen großen Nutzen hat. Auf die Werkzeuge \verb'SAVE-SYSTEM' und \verb'TURNKEY' gehen wir jetzt noch etwas näher ein. \section{Das Tingel--Programm als Turnkey} Die Quelle des Tingel--Programms ist in einem der freien Flash--Bereiche untergebracht, im Block--Stil. Mein Flash--Programm kann auch diese Bereiche beschreiben, so dass der Quelltext auf Wunsch unter Linux gehalten bleiben kann. (Hatte ich schon erzählt, dass mein \mbox{Flasher} mit Quelltexten genauso leicht umgehen kann wie mit Code?). Auf diese Weise kann es mit den gebräuchlichen Befehlen (\verb|THRU|) eingeladen werden. Danach haben wir dann ein Forth, an das u.a. Befehle wie big ben boing big--ben angefügt wurden. Nach dem Eintippen von \verb'12 big-ben' und bei angeschlossenem Tingel--Tangel wird dann also die Big--Ben--Melodie gespielt und anschließend erklingen 12 Glockenschläge. Der Befehl \verb|SAVE-SYSTEM| bereitet den 32--kByte--Flash--Bereich sauber vor und legt dort unser neues System komplett mit Big--Ben hinein. Wenn wir am Morgen das Evaluation--Board wieder anschalten, können wir direkt \verb'6 big-ben' eintippen, da anstelle des gewohnten Forth--Systems das erweiterte System eingeladen wird. Der Befehl TURN--KEY geht noch einen Schritt weiter. Hierbei startet Forth nicht mehr mit dem Befehls--Interpreter, sondern mit einem mitzugebenden Befehl wie beispielsweise bei \verb'SPOKENUUR TURN-KEY'. Der Befehl \verb|SPOKENUUR| (zu Deutsch: Geisterstunde) ist dabei als \verb'12 big-ben' definiert. Jedesmal wenn das System angeschaltet wird, ertönt nun die \emph{Geisterstunde}. \section{Zusammenfassung} Die heutigen Mikro--Controller sind kräftig genug, um einfache Entwicklungssysteme mit aufzunehmen. Entwickeln auf dem Zielsystem hat gewaltige Vorteile, vor allem beim Hardware--Debuggen. Der Einsatz von Flash--Speicher erlaubt es, ohne spezielle Apparatur, wie EPROM--Programmierer, Turnkey--Systeme zu entwickeln und diese auch schnell weiter anzupassen. Evaluation--Boards sind dermaßen preiswert, dass sie als Turnkey eingesetzt werden können. Für 53 Euro zuzüglich Versandkosten können bei mir noch einige ECBM16C/62P--Evaluation--Boards bezogen werden. \end{multicols} \end{document}