ARM Programmierung

Hier finden sich verschiedene Dinge rund um die Programmierung von ARM Prozessoren. Ich arbeite hier mit dem Cortex M3 Design umgesetzt von NXP und auf dem Evaluationsboard der microbuilder.eu aufgebracht.

Bild des Cortex M3 Evaluationsboards von microbuilder.eu

Immer wenn mir irgendwas unklar war und ich länger nachforschen musste, werde ich es hier niederschreiben. :)


Installation des Toolchains - Linux

Um den toolchain für den Cortex-M3 unter Linux aufzusetzen, bietet es sich an, das gnu-arm-installer paket von Waipot Ngamsaad an.
Um den Toolchain zu installieren müssen allerdings zunächst noch ein paar Pakete (unter Debian Lenny und Squeeze) installiert werden. Am Besten einfach die folgenden Befehle ausführen:

apt-get install patch texinfo libncurses5-dev libx11-dev libgmp3-dev libmpfr-dev

cd ~
mkdir arm-none-eabi
cd arm-none-eabi
svn checkout http://hobbycode.googlecode.com/svn/trunk/gnu-arm-installer gnu-arm-installer

cd gnu-arm-installer/src/
wget http://ftp.gnu.org/gnu/binutils/binutils-2.19.tar.bz2
wget http://ftp.gnu.org/gnu/gcc/gcc-4.3.2/gcc-4.3.2.tar.bz2
wget ftp://ftp.fi.debian.org/pub/gentoo/distfiles/newlib-1.16.0.tar.gz
wget ftp://gcc.gnu.org/pub/insight/releases/insight-6.8-1.tar.bz2
cd ..

Gnuarm war in den letzten Tagen nicht allzu zuverlässig erreichbar - daher sollte man vielleicht bei google nach den einzelnen Paketen inklusive "mirror" suchen und die entsprechenden Versionen von den Spiegelservern runterladen..
Da insight-6.8.tar.bz2 nicht die aktuellste Version ist bzw. es einen schwereren Fehler in dieser Version gibt, wurde oben insight-6.8-1.tar.bz2 heruntergeladen. Damit diese nun auch genutzt wird, müssen folgende Anpassungen in der gnu-arm-installer.sh vorgenommen werden:

INSIGHT_SRC=insight-6.8-1.tar.bz2
INSIGHT_VERSION=6.8-1
INSIGHT_DIR=insight-$INSIGHT_VERSION

Es ist Geschmackssache, ob man arm-elf oder arm-none-eabi nutzt (einige unsichere Quellen meinen, dass elf die alte Bezeichnung für eabi ist, andere Quellen meinen, dass elf ein Betriebssystem voraussetzt... Hauptsache ist jedoch, dass die hier gebauten Binaries am Ende firmwares rauswerfen, die auf die Cortex gespielt werden können ;-) ). Da die existierenden Makefiles (beispielsweise von microbuilder.eu) jedoch arm-none-eabi nutzen, bieteten sich folgende Möglichkeiten: Entweder man schreibt einmal in der Datei gnu-arm-installer.sh alle arm-elf zu arm-none-eabi um, oder zukünftig in allen Makefiles, oder aber man legt nach dem Bauen des toolchains symbolische Verknüpfungen von allen arm-elf binaries zu arm-non-eabi binaries an.
Für welchen Weg man sich auch entscheidet (ich habe in gnu-arm-installer.sh alle arm-elf zu arm-none-eabi ersetzt) - der Toolchain wird nun gebaut mit:

./gnu-arm-installer.sh

Abschließend muss noch der install/bin-Ordner in der PATH-Variable hinzugefügt werden

vim ~/.bashrc

und einfügen:

export PATH=~/arm-none-eabi/install/bin/:$PATH

und los geht's mit der Entwicklung für die Cortex M3 Plattform und diverse andere ARM-Plattformen.


Installation des Toolchains - Mac OS X

Neulich kam eine Lieferung von Bitmanufaktur mit 2 OpenBeacon USB 2 zum basteln.
Diese sind wie auch das oben abgebildete Board mit je einer 32 bit Cortex M3 ausgestattet.
Zur Programmierung dieser OpenBeacon Tags setzte ich mit dem unten zu sehendem Script den Toolchain für Mac OS X auf.
Wichtig ist, dass man vorher per MacPorts sowohl gmp, als auch mpfr installiert.

sudo port install gmp mpfr

Anschließend kann man mit folgendem abgewandelten Script den Toolchain aufsetzen:

#!/bin/sh
#
# Copyright (c) 2008 the NxOS developers
#
# See AUTHORS for a full list of the developers.
#
# Redistribution of this file is permitted under
# the terms of the GNU Public License (GPL) version 2.
#
# Build an ARM cross-compiler toolchain (including binutils, gcc and
# newlib) on autopilot.

ROOT=`pwd`
SRCDIR=$ROOT/src
BUILDDIR=$ROOT/build
PREFIX=$ROOT/install

GCC_URL=http://ftp.gnu.org/pub/gnu/gcc/gcc-4.4.0/gcc-core-4.4.0.tar.bz2
GCC_VERSION=4.4.0
GCC_DIR=gcc-$GCC_VERSION

BINUTILS_URL=http://ftp.gnu.org/gnu/binutils/binutils-2.19.1.tar.bz2
BINUTILS_VERSION=2.19.1
BINUTILS_DIR=binutils-$BINUTILS_VERSION

NEWLIB_URL=ftp://sources.redhat.com/pub/newlib/newlib-1.17.0.tar.gz
NEWLIB_VERSION=1.17.0
NEWLIB_DIR=newlib-$NEWLIB_VERSION

GDB_URL=ftp://ftp.gnu.org/gnu/gdb/gdb-6.8a.tar.bz2
GDB_VERSION=6.8
GDB_DIR=gdb-$GDB_VERSION

echo "I will build an arm-elf cross-compiler:

Prefix: $PREFIX
Sources: $SRCDIR
Build files: $BUILDDIR

Software: Binutils $BINUTILS_VERSION
Gcc $GCC_VERSION
Newlib $NEWLIB_VERSION
Gdb $GDB_VERSION

Press ^C now if you do NOT want to do this."
read IGNORE

#
# Helper functions.
#
ensure_source()
{
    URL=$1
    FILE=$(basename $1)

    if [ ! -e $FILE ]; then
        echo "getting $FILE"
curl -L -O$FILE $URL
    fi
}

unpack_source()
{
(
    cd $SRCDIR
    ARCHIVE_SUFFIX=${1##*.}
    if [ "$ARCHIVE_SUFFIX" = "gz" ]; then
tar zxvf $1
    elif [ "$ARCHIVE_SUFFIX" = "bz2" ]; then
tar jxvf $1
    else
echo "Unknown archive format for $1"
      exit 1
    fi
)
}

# Create all the directories we need.
mkdir -p $SRCDIR $BUILDDIR $PREFIX

(
cd $SRCDIR

# First grab all the source files...
ensure_source $GCC_URL
ensure_source $BINUTILS_URL
ensure_source $NEWLIB_URL
#rboissat: Adding GNU gdb
ensure_source $GDB_URL

# ... And unpack the sources.
unpack_source $(basename $GCC_URL)
unpack_source $(basename $BINUTILS_URL)
unpack_source $(basename $NEWLIB_URL)
unpack_source $(basename $GDB_URL)
)

# Set the PATH to include the binaries we're going to build.
OLD_PATH=$PATH
export PATH=$PREFIX/bin:$PATH

#
# Stage 1: Build binutils
#
(
mkdir -p $BUILDDIR/$BINUTILS_DIR
cd $BUILDDIR/$BINUTILS_DIR

$SRCDIR/$BINUTILS_DIR/configure --target=arm-elf --prefix=$PREFIX \
    --disable-werror --enable-interwork --enable-multilib --with-float=soft \
    && make all install
) || exit 1

#
# Stage 2: Patch the GCC multilib rules, then build the gcc compiler only
#
(
MULTILIB_CONFIG=$SRCDIR/$GCC_DIR/gcc/config/arm/t-arm-elf

echo "

MULTILIB_OPTIONS += mno-thumb-interwork/mthumb-interwork
MULTILIB_DIRNAMES += normal interwork

" >> $MULTILIB_CONFIG

mkdir -p $BUILDDIR/$GCC_DIR
cd $BUILDDIR/$GCC_DIR

$SRCDIR/$GCC_DIR/configure --target=arm-elf --prefix=$PREFIX \
    --enable-interwork --enable-multilib --with-float=soft \
    --with-libiconv-prefix=/opt/local \
    --with-gmp-include=/opt/local/include --with-mpfr-include=/opt/local/include \
    --with-gmp-lib=/opt/local/lib --with-mpfr-lib=/opt/local/lib \
    --enable-languages="c" --with-newlib \
    --with-headers=$SRCDIR/$NEWLIB_DIR/newlib/libc/include \
    && make all-gcc install-gcc
) || exit 1

#
# Stage 3: Build and install newlib
#
(
# And now we can build it.
mkdir -p $BUILDDIR/$NEWLIB_DIR
cd $BUILDDIR/$NEWLIB_DIR

$SRCDIR/$NEWLIB_DIR/configure --target=arm-elf --prefix=$PREFIX \
    --enable-interwork --enable-multilib --with-float=soft \
    && make all install
) || exit 1

#
# Stage 4: Build and install the rest of GCC.
#
(
cd $BUILDDIR/$GCC_DIR

make all install
) || exit 1

#
# Stage 5: Build and install GDB
#
(
mkdir -p $BUILDDIR/$GDB_DIR
cd $BUILDDIR/$GDB_DIR

$SRCDIR/$GDB_DIR/configure --target=arm-elf --prefix=$PREFIX \
    --disable-werror --enable-interwork --enable-multilib --with-float=soft \
    && make all install
) || exit 1

export PATH=$OLD_PATH

echo "export PATH=$PREFIX/bin:\$PATH">$ROOT/env.sh

echo "
Build complete! To use your new toolchain:

- Source the $ROOT/env.sh script in your shell. In bash:
source $ROOT/env.sh

- Or, just add $PREFIX/bin to your PATH manually.

"
News - Sidebar
Ubuntu Touch Backup und Restore
Ubuntu Touch ist nun seit mehr als zwei Jahren mein Betriebssystem der Wahl auf meinem Nexus 4. Leider habe ich mir irgendwie den Update-Mechanismus zerschossen und so kurzerhand beschlossen, das System neu aufzusetzen. Den Prozess habe ich in der ubuntu touch section dokumentiert.
Ableton MIDI CC Automation
In der Audio-Sektion wird nun kurz erläutert, mit welchem Hilfsmittel man im Arrangement View von Ableton Live MIDI CC Parameter eines externen Instruments automatisieren kann.
x0xb0x und Reason 7
In der Audio-Sektion habe ich kurz niedergeschrieben, wie der Sound einer x0xb0x in Reason 7 per MIDI-Clock synchron geroutet werden kann.
LaTeX-Workshop
In der LaTeX-Sektion werden inzwischen Folien und weiteres zu einem LaTeX-Workshop verlinkt.
ClusterGL
Unter Projekte->ClusterGL habe ich ein paar Schritte zur Nutzung von ClusterGL online gestellt.
NFC MobiDoc
Unter Projekte->NFC MobiDoc habe ich eine in einer Gruppe von 5 Stundenten inklusive mir umgesetzte NFC-basierte Krankenhausanwendung dokumentiert.
VotingTool
Unter Projekte->VotingTool habe ich ein Grailsbasiertes VotingTool online gestellt.
neues Design
Heute habe ich ein Geschenk von Max bekommen - ein neues schönes Design. Vielen Dank an dieser Stelle!
ROBERTA
Heute habe ich neben der Übersetzung ins Englische auch eine Featurelist für den Server aus dem ROBERTA-Projekt erstellt.
Git + Apache
Wer sein Git-Repository über HTTP mit Apache und aber ohne VirtualHosts (also ohne Subdomain) verfügbar machen will, findet unter Anleitungen -> Vermischtes nun eine entsprechende Anleitung.
ARM-Toolchain
Wie man einen gcc Toolchain für ARM aufsetzt, findet sich ab sofort unter Anleitungen -> ARM. Diesen nutze ich beispielsweise für die Programmierung von OpenBeacon USB 2-RFID-Tags.
SD-Karte kaputt
Nach dem Netzteil nun auch die SD-Karte: Unter Anleitungen -> Sheevaplug mein Rettungsweg.
Netzteil kaputt
Wem das gleiche Glück mit dem Sheevaplug beschieden, der findet unter Sheevaplug meinen Lösungsweg.
ATMEGA verfust
Wer einen seiner AVR Mikrocontroller verfust hat, findet unter Anleitungen -> AVR nun einen rettenden Beitrag.
Abschlussarbeit
Unter Anleitungen -> LaTeX habe ich eine Vorlage für eine Abschlussarbeit verlinkt.
Etherpad
unter Anleitungen -> Vermischtes findet sich ein Tutorial zur Installation von Etherpad auf Debian Lenny

Valid XHTML 1.0 Strict CSS ist valide!