Der Gnu-C-Compiler für den H8

Auf der Suche nach einem Entwicklungssystem für den H8, daß auch auf Linux funktioniert, bin ich (wen wunderts) bei dem GNU-Compiler hängengeblieben.

Im Web gibt es allerlei Information zu dem Thema, allerdings scheint der H8 in Japan wesentlich populärer zu sein als hierzulande, daher sind viele der Websites schlicht unlesbar (zumindest für mich, ich kann kein Japanisch). Nach allerlei Experimenten habe ich eine brauchbare Konfiguration gefunden, die ich hier vorstellen will:

Man nehme den gcc in der Version 2.95, dazu die binutils und die newlib von Cygnus (jetzt bei Red Hat zuhause). Damit kann man schon mal Programme für den H8 kompilieren und linken. In der newlib sind auch die für ein Embedded System wichtigsten Funktionen vorhanden (die glib wäre wohl ein paar Nummern zu groß).

Ich habe hier die von mir verwendeten Versionen zum Download (spart die Suche nach den richtigen Versionen):
binutils-2.11.2.tar.bz2
gcc-2.95.3.tar.gz
newlib-1.9.0.tar.gz

Nach dem erfolgreichen Download kommt das große Rätselraten: wie kompiliere ich den Compiler so, daß es hinterher auch alles klappt? Ich hab die Antwort darauf hier:
Einfaches Script um das Zeug zu compilieren

Nach erfolgreicher Anwendung des Scriptes sollten eigentlich die Tools und die Library installiert sein. Aufrufen läßt sich der Compiler dann z.B. mit h8300-hms-gcc. Generell sind jetzt alle H8-spezifischen Programme als h8300-hms-x installiert.

Was mach ich jetzt mit dem schönen neuen Compiler?
Ein wenig komplizierter ist es schon, damit erfolgreich ein Programm für den H8 zu übersetzen, was dann hinterher auch noch funktionieren soll. Man braucht z.B. ein Linker-Script um dem Linker zu sagen, wo und wie das Programm im Zielsystem im Speicher verteilt werden muß. Es empfiehlt sich z.B. das CrossGCC FAQ.

Um das Programm dann in den H8 zu kriegen, braucht man noch einen Bootloader (zumindest für die Flash-Version H8/3048F). Einen solchen hab ich hier:
H8-Bootloader

Der Bootloader besteht aus einem Programm, das auf dem Linux-Host läuft und dem Boot-Kernel, der in das On-Chip-RAM des H8 übertragen wird. Nach erfolgreicher Übertragung wird das eigentliche Programm (in binärer Form) zum Boot-Kernel geschickt und von diesem in das Flash programmiert.

Als (einfaches?) Anwendungsbeispiel ist in dem Paket noch ein RAM-Loader, der ein beliebiges Programm als S-Records über den seriellen Port empfängt und in ein (externes) RAM schreibt. Nach der Übertragung des Programms wird dieses angesprungen. Da die Interrupts feste Adressen am Anfang des internen Flash verwenden, werden diese von dem RAM-Loader an das Programm im RAM weitergeleitet.

Um das ganze zu benutzen, wird erstmal ein passende Hardware benötigt. Mein Ladegerät ist z.B. nicht für den Ramloader brauchbar, da kein externes RAM vorhanden ist. Mit dem Bootloader kann aber der H8 in dem Ladegerät programmiert werden.

Im Ramloader muß dann die Initialisierung der Hardware (externer BUS, Ports, Baudrate) an die tatsächliche Hardware angepaßt werden. Der kompilierte Ramloader kann dann mit dem Bootloader (h8boot) in den H8 geflashed werden. Wenn der Ramloader läuft, kann mit dem miniterm (Baudrate anpassen) ein S-Record-File zum H8 übertragen werden.

Zurück zur Homepage ... und ein Zaehlpixel hab ich auch :-)