GCC M68k
GNU GCC Compiler für Freescale M68k
Übersicht
Dieser Artikel beschreibt wie eine GNU Cross Toolchain für die 68000 Mikrocontroller Familie und kompatible (Coldfire) von Freescale erstellt wird. Prinzipiell kann die Anleitung auch für andere Targets verwendet werden, muss dann allerdings angepasst werden.
Entwicklungssystem (host): OpenSuSE Linux 12.1 x86_64
Zielsystem (target): Embedded System mit MC68332CFC16 CPU, 64kB externes RAM
Folgende Softwarepakete werden verwendet:
- Binutils 2.22
- GCC 4.6.2
- Newlib 1.20.0
- GDB 6.8 und 7.3.1
- BDM Tools 1.4.0 pre4
Zum Entpacken und Compilieren der Pakete werden diese in einem gemeinsamen Verzeichnis abgelegt. In dieser Anleitung ist das cross-m68k. Die gesamte Toolchain wird für m68k-elf Target kompiliert. Das Installationsverzeichnis wird /opt/m68k/
Zunächst wird das Build Verzeichnis angelegt und dort hin gewechselt:
mkdir cross-m68k cd cross-m68k
Zudem macht es Sinn das Verzeichnis mit den M68k Binaries gleich zu Beginn in die Pfad Variable aufzunehmen:
export PATH=$PATH:/opt/m68k/bin
Binutils
Die Binutils enthalten den GNU Assembler, Linker, etc. Diese können mit folgenden Kommandos im Verzeichnis cross-m68k heruntergeladen, gebaut und installiert werden:
wget http://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2 tar -xvf binutils-2.22.tar.bz2 cd binutils-2.22 mkdir m68k-obj cd m68k-obj ../configure --target=m68k-elf --prefix=/opt/m68k/ make sudo make install
GCC
GCC ist der eigentliche Compiler. Hier wird nur der C-Compiler eingesetzt, daher genügt es das Paket gcc-core-<version>.tar.bz2 von der GCC Download Seite herunter zu laden. GCC unterstützt eine sehr grosse Anzahl an Parametern und Einstellungen weshalb der Configure Schritt viele Parameter enthält. Eine Übersicht über die Einstellungen Gibt die GCC Build Referenz. Um GCC herunterzuladen, zu kompilieren und installieren müssen folgende Kommandos ausgeführt werden:
wget ftp://ftp.gwdg.de/pub/misc/gcc/releases/gcc-4.6.2/gcc-core-4.6.2.tar.bz2 tar -xvf gcc-core-4.6.2.tar.bz2 cd gcc-4.6.2 mkdir m68k-obj cd m68k-obj ../configure --target=m68k-elf --prefix=/opt/m68k/ --enable-languages=c --with-newlib --disable-libmudflap --disable-libssp --disable-libgomp --disable-libstdcxx-pch --disable-threads --with-gnu-as --with-gnu-ld --disable-nls --with-headers=yes --disable-checking --without-headers make -j6 sudo make install
Newlib
Newlib ist eine für Embedded Projekte zugeschnittene standard ANSI-C Bibliothek. Um sie herunterzuladen, zu bauen und installieren müssen folgende Kommandos ausgeführt werden:
wget ftp://sources.redhat.com/pub/newlib/newlib-1.20.0.tar.gz tar -xvf newlib-1.20.0.tar.gz cd newlib-1.20.0 mkdir m68k-obj cd m68k-obj ../configure --target=m68k-elf --prefix=/opt/m68k/ --enable-newlib-reent-small --disable-malloc-debugging --enable-newlib-multithread --disable-newlib-io-float --disable-newlib-supplied-syscalls --disable-newlib-io-c99-formats --disable-newlib-mb --disable-newlib-atexit-alloc --enable-target-optspace --disable-shared --enable-static --enable-fast-install make -j6 sudo make install
Bei meinen Tests hatte hier der sudo make install Aufruf nicht funktioniert, jedoch nach einem direkten Login als root und einem make install Aufruf hat des funktioniert.
Die GNU Toolchain ist nun einsatzfähig, es können C und Assembler Programme damit kompiliert/assembliert werden.
GDB
GDB ist der GNU Debugger. Er wird mit folgenden Kommandos heruntergeladen, gebaut und installiert:
wget http://ftp.gnu.org/gnu/gdb/gdb-7.3.1.tar.bz2 tar -xvf gdb-7.3.1.tar.bz2 cd gdb-7.3.1 mkdir m68k-obj cd m68k-obj ../configure --target=m68k-elf --prefix=/opt/m68k/ make -j6 sudo make install
Falls eine ältere Version von GDB benötigt wird (die aktuellen 7.x Versionen funktionieren teilweise nicht mit Eclipse - memory view geht nicht). So kann die Version 6.8 mit folgenden Kommandos heruntergeladen, gebaut und parallel zur ober installierten Version installiert werden:
wget http://ftp.gnu.org/gnu/gdb/gdb-6.8a.tar.bz2 tar -xvf gdb-6.8a.tar.bz2 cd gdb-6.8 mkdir m68k-obj cd m68k-obj ../configure --target=m68k-elf --prefix=/opt/m68k/ --program-suffix=6.8 --disable-werror --program-prefix=m68k-elf- make -j6 sudo make install
Der GDB 6.8 kann dann mit m68k-elf-gdb6.8 oder m68k-elf-gdbtui6.8 gestartet werden.
BDM Tools
Die meisten der Freescale Prozessoren und Mikrocontroller besitzen eine eingebaute Debug Hardware (ähnlich JTAG) welche BDM (Background Debug Mode) genannt wird. Die Kommunikation des GDB mit dem Target Prozessor erfolgt über einen BDM Adapter und einen Device Treiber welcher Teil der BDM Tools ist. Die BDM Tools unterstützen 68000 und Coldfire Targets. Bauanleitungen für passende BDM Adapter am PC Parallelport befinden sich auf der BDM Tools Homepage. Für Coldfire Targets kann alternativ das TBLCF USB Interface verwendet werden. Des weiteren funktionieren die Parallelport Wiggler für m68k von Macraigor mit den BDM Tools.
Um die BDM Tools auf einem 64Bit Host System einsetzen zu können müssen diese modifiziert werden, des weiteren wird der MC68332 nicht direkt von den BDM Tools Testprogrammen unterstützt. Statt dessen sind die Testprogramme auf den MC68360 angepasst, welcher sich in Konfigurationsregistern und teilweise in Prozessorregistern unterscheidet. Die Anpassungen für 64Bit Host und MC68332 sind diesem Beitrag als Patch beigefügt.
Datei:M68k-bdm-1.4-pre4-x86 64.patch.tar.bz2
Die BDM tools werden mit dem folgenden Kommandos heruntergeladen, gepatcht, gebaut und installiert:
wget http://sourceforge.net/projects/bdm/files/m68k-bdm/1.4.0/m68k-bdm-1.4-pre4.tar.bz2/download -O m68k-bdm-1.4-pre4.tar.bz2 tar -xvf m68k-bdm-1.4-pre4.tar.bz2 wget http://www.mikrocontroller.net/wikifiles/8/85/M68k-bdm-1.4-pre4-x86_64.patch.tar.bz2 tar -xvf M68k-bdm-1.4-pre4-x86_64.patch.tar.bz2 cd m68k-bdm-1.4-pre4 patch -p1 < ../m68k-bdm-1.4-pre4-x86_64.patch cd m68k mkdir m68k-obj cd m68k-obj ../configure --prefix=/opt/m68k/ --disable-tblcf --enable-bdmctrl make -j6 sudo make install
Parallelport Treiber
Für den Hardwarezugriff muss noch der Device Treiber installiert werden. Dazu muss der Treiber für eines der Host Systeme im cross-m68k/m68k-bdm-1.4-pre4/m68k/driver Verzeichnis kompiliert werden. Für den in OpenSuSE 12.1 verwendeten 3.1 Kernel den Treiber im linux-3 Verzeichnis. Dazu folgendes Kommando ausführen:
make
Um den Treiber zu installieren müssen alle folgende Aktionen als root durchgeführt werden:
make install depmod -a
Die folgenden Schritte hängen Teilweise von der verwendeten Linux Distribution ab. Weitere Informationen zum Einrichten des Device Treibers können auf der BDM Tools Homepage gefunden werden.
Nun muss noch ein Devicenode erstellt werden, dazu als root folgende Kommandos eingeben:
mknod -m666 /dev/bdmicd0 c 34 8 ln -s /dev/bdmicd0 /dev/bdm
Damit die Devicenodes nicht nach jedem Neustart neu erstellt werden müssen können diese auch in die Datei /etc/init.d/boot.local eingetragen werden.
Damit der Treiber automatisch geladen wird muss die Datei /etc/modprobe.d/50-bdm.conf mit folgendem Inhalt als root erstellt werden:
alias char-major-34 bdm
Um die Funktion des Parallelport Treibers zu testen kann das Programm bdm-cpu32-chk verwendet werden. Um es zu starten muss die Target Hardware eingeschaltet sein und über den BDM Parallelport Adapter mit dem PC verbunden sein. Danach das Programm starten:
bdm-cpu32-chk /dev/bdmicd0
Das Testprogramm führt dann über die BDM Schnittstelle folgende Testschritte aus:
- Prozessor Register schreiben/lesen
- Initialisieren der Chip selects CS2 und CS3 für 64k RAM ab Adresse 0x200000
- aktivieren des internen TPURAM
- RAM Test intern
- RAM Test extern
- Testcode in internes RAM laden und ausführen (Einzelschritt und run)
- Testcode in externes RAM laden und ausführen (Einzelschritt und run)
Es kann gegebenenfalls notwendig sein das bdm-cpu32-chk Programm anzupassen da dieser sehr stark von der verwendeten Target Hardware abhängt. Der Sourcecode befindet sich im Verzeichnis cross-m68k/m68k-bdm-1.4-pre4/m68k/test/cpu32-chk.c.
Wenn diese Tests ohne Fehler ausgeführt werden können ist der BDM Adapter und Treiber Software einsatzbereit.
Beispiel
Beispieldatei (main.c):
int main(int argc, char *argv[])
{
int i,j=1;
for(i=0;i<10;i++)
{
j *= (i+1);
}
for(;;);
}
Kompilieren:
m68k-elf-gcc -O0 -gdwarf-2 -o m68ktest.elf main.c
Laden mit Debugger:
m68k-elf-gdb -x gdbinit m68ktest.elf
Die gdbinit Datei:
# connect target targ rem | m68k-bdm-gdbserver pipe /dev/bdmicd0 # reset target monitor bdm-sleep 200 monitor bdm-reset monitor bdm-sleep 200 # I/O is to supervisor program space set $dfc=5 set $sfc=5 # set SIMCR set {unsigned short}(0xfffa00) = 0x42cf # set SYPCR set {unsigned char}(0xfffa21) = 0x06 # set SYNCR set {unsigned short}(0xfffa04) = 0x7f00 # set TRAMBAR #set {unsigned short}(0xfffb04) = 0x1000 # set CSPAR0 set {unsigned short}(0xfffa44) = 0x3fff # set CSPAR1 set {unsigned short}(0xfffa46) = 0x03ff # set CSBAR2 to 0x200000 with 64k even byte set {unsigned short}(0xfffa54) = 0x2003 # set CSOR2 set {unsigned short}(0xfffa56) = 0xd830 #set {unsigned short}(0xfffa56) = 0xdf70 # set CSBAR3 to 0x200000 with 64k odd byte set {unsigned short}(0xfffa58) = 0x2003 # set CSOR3 set {unsigned short}(0xfffa5a) = 0xb830 #set {unsigned short}(0xfffa5a) = 0xbf70 # load program load # set breakpoint to main b main # run to main cont
Hello World
Hier ein Bespielprojekt: Datei:M68k-example.tar.bz2
Links
Binutils Download: http://ftp.gnu.org/gnu/binutils
Binutils Build Referenz: http://sourceware.org/binutils
GCC Download: http://gcc.gnu.org
GCC Build Referenz: http://gcc.gnu.org/install/configure.html
Newlib Homepage: http://sourceware.org/newlib
GDB Homepage: http://www.gnu.org/software/gdb
BDM Tools Homepage: http://bdm.sourceforge.net
TBLCF Forum Thread: http://forums.freescale.com/freescale/board/message?board.id=CFCOMM&message.id=624