<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>alios pad &#187; Embedded</title>
	<atom:link href="http://www.alios.org/blog/category/gebastel-und-gelot/embedded/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alios.org/blog</link>
	<description>a scratchpad for my thoughts</description>
	<lastBuildDate>Mon, 21 Nov 2011 13:36:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Cortex-M3 On Chip Debugging unter Linux</title>
		<link>http://www.alios.org/blog/2010/01/cortex-m3-on-chip-debugging-unter-linux/</link>
		<comments>http://www.alios.org/blog/2010/01/cortex-m3-on-chip-debugging-unter-linux/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 13:01:21 +0000</pubDate>
		<dc:creator>alios</dc:creator>
				<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Gebastel und Gelöt]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[CDT]]></category>
		<category><![CDATA[cortex-m3]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[iar]]></category>
		<category><![CDATA[j-link]]></category>
		<category><![CDATA[jtag]]></category>
		<category><![CDATA[keil]]></category>
		<category><![CDATA[MCBSTM32E]]></category>
		<category><![CDATA[memory map]]></category>
		<category><![CDATA[ocd]]></category>
		<category><![CDATA[on chip debugging]]></category>
		<category><![CDATA[openocd]]></category>
		<category><![CDATA[segger]]></category>

		<guid isPermaLink="false">http://www.alios.org/blog/?p=188</guid>
		<description><![CDATA[Im letzten Eintrag habe ich berichtet wie man sich die GNU ARM Cortex-M3 Compiler Toolchain baut. Heute möchte ich kurz dokumentieren wie ich On-Chip-Debugging (OCD) ans laufen gebracht habe.
On-Chip-Debugging
Beim On-Chip-Debugging geht es darum, ein compiliertes Stück Software auf der Zielhardware auszuführen (in meinem Fall auf einem Keil MCBSTM32E Board mit einem Cortex-M3 Controller von ...]]></description>
			<content:encoded><![CDATA[<p>Im <a title=" GNU ARM Cortex-M3 Toolchain selber bauen" href="http://www.alios.org/blog/2009/12/gnu-arm-cortex-m3-toolchain-selber-bauen/" target="_blank">letzten Eintrag</a> habe ich berichtet wie man sich die GNU ARM Cortex-M3 Compiler Toolchain baut. Heute möchte ich kurz dokumentieren wie ich <em>On-Chip-Debugging (OCD)</em> ans laufen gebracht habe.</p>
<h3>On-Chip-Debugging</h3>
<p>Beim <em>On-Chip-Debugging</em> geht es darum, ein compiliertes Stück Software auf der Zielhardware auszuführen (in meinem Fall auf einem <a title="Keil MCBSTM32E" href="http://www.keil.com/mcbstm32e/" target="_blank">Keil MCBSTM32E</a> Board mit einem <a title="Cortex-M3 bei STM" href="http://www.st.com/mcu/inchtml-pages-stm32.html" target="_blank">Cortex-M3 Controller von STM</a>) und der Möglichkeit es vom Entwicklungsrechner aus zu debuggen.</p>
<p>Die meisten modernen Controller bieten eine <a title="Wikipedia (de) - JTAG" href="http://de.wikipedia.org/wiki/JTAG">JTAG Schnittstelle</a>. Über diese kann der Prozessor angehalten werden und Speicher und Register können ausgelesen und beschrieben werden. Früher hat man die JTAG Pins des Controllers über direkt über die <a title="Wikipedia (de) - IEEE 1284" href="http://de.wikipedia.org/wiki/IEEE_1284" target="_blank">IEEE 1284 Schnittstelle </a>(Drucker Schnittstelle) des Entwicklungsrechners angeschlossen. Da die meisten PCs diese nicht mehr haben und diese zudem aus Timinggründen nicht immer optimal war, werden mittlerweile meist USB JTAG Adapter eingesetzt. Ich habe hier einen <em>J-Link ARM-KS</em> von <a title="Segger Embedded Software Solutions" href="http://www.segger.com" target="_blank">Segger</a> (von IAR gebranded).</p>
<div id="attachment_187" class="wp-caption aligncenter" style="width: 331px"><a href="http://www.alios.org/blog/wp-content/uploads/2010/01/P1010593_small.jpg"><img class="size-full wp-image-187" title="P1010593_small" src="http://www.alios.org/blog/wp-content/uploads/2010/01/P1010593_small.jpg" alt="Keil SMT32 Eval mit JTAG am Notebook" width="321" height="240" /></a><p class="wp-caption-text">Keil SMT32 Eval mit JTAG am Notebook</p></div>
<p><em>OpenOCD</em> selber kann entweder über eine eigne <em>TCL</em> basierte Sprache gesteuert werden, stellt aber auch ein <a title="GNU Debugger" href="http://www.gnu.org/software/gdb/" target="_blank"><em>GNU Debugger (GDB)</em></a> kompatible Schnittstelle zur Verfügung. Über das GDB Interface kann man dann z.B. den Debugger der<em> <a title="C/C++ Development Tools (CDT)" href="http://www.eclipse.org/cdt/" target="_blank">C/C++ Development Tools (CDT)</a></em> für Eclipse verwenden, um Software direkt auf dem Target System zu debuggen.</p>
<h3>Installation gdb</h3>
<p>Als Erstes benötigt man einen für die Zielarchitektur (arm-elf) gebauten GDB:</p>
<p><code><br />
$ cd /home/alios/src/toolchain<br />
$ cvs -d :pserver:anoncvs@sourceware.org:/cvs/src login<br />
<em>{"anoncvs" als Passwort eingeben}</em><br />
$ cvs -d :pserver:anoncvs@sourceware.org:/cvs/src co gdb<br />
$ mkdir build-arm-elf/gdb<br />
$ cd build-arm-elf/gdb<br />
$ ./configure --target=arm-elf --prefix=/usr/local/arm-elf<br />
$ make all<br />
$ make install<br />
</code></p>
<p>Wenn alles geklappt hat und <code>/usr/local/arm-elf/bin</code> im Pfad ist, sollte man <code>$ arm-elf-gdb</code> starten können.</p>
<h3>Installation OpenOCD</h3>
<p>Als Nächstes muss dann noch das OpenOCD Paket gebaut werden:<br />
<code><br />
$ cd /home/alios/src/toolchain<br />
$ git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd<br />
$ mkdir build-openocd<br />
$ cd build-openocd<br />
$ ../openocd/configure --enable-jlink --disable-httpd --disable-doxygen-html<br />
</code><br />
In dem Aufruf des <code>configure</code> Scripts sage ich, mit <code>--enable-jlink</code>, dass die Unterstützung für den von mir verwendeten JLink JTAG Adapter mit gebaut wird. Eine Liste aller Optionen für das <code>configure</code> Script und damit auch für eine Liste aller unterstützter JTAG Adapter erhält man mit <code>../openocd/configure --help</code>.<br />
Nun muss OpenOCD nur noch gebaut und installiert werden:<br />
<code><br />
$ make all<br />
$ make install<br />
</code><br />
Nach der Installation sollte sich <code>openocd</code> starten lassen.</p>
<h3>Konfiguration OpenOCD</h3>
<p>Eine Standard Konfiguration für OpenOCD wird beim Start von OpenOCD u.A. in <code>$HOME/.openocd/openocd.cfg</code> Gesucht. Meine Konfiguration sieht so aus:</p>
<p><code><br />
set WORKAREASIZE 0xffff<br />
source [find interface/jlink.cfg]<br />
source [find interface/stm32.cfg]<br />
source [find cpu/arm/cortex_m3.tcl]<br />
source [find chip/st/stm32/stm32.tcl]<br />
reset_config srst_only<br />
target cortex_m3 little run_and_init 0<br />
flash bank stm32 0x08000000 0x00010000 0 0<br />
flash auto_erase on<br />
gdb_flash_program enable<br />
</code></p>
<p>Zunächst wird die maximale Größe der Workarea festgelegt. Dies ist die maximale RAM Menge, die z.B. vom Flash Programm auf dem Controller verwendet werden kann. Da der von mir verwendete <em>STM32F103</em> über 64kB RAM verfügt, habe ich sie auf <code>0xffff</code> gesetzt. Als Nächstes verweise ich auf einige der mit OpenOCD mitgelieferten Konfigurationsdateien (finden sich unter im Normalfall unterhalb von <code>/usr/local/share/openocd/scripts</code>). Mit den letzten 3 Zeilen wird das Flashen konfiguriert. Eine ausführliche Beschreibung der Konfigurationsmöglichkeiten findet sich im <a title="OpenOCD User's Guide" href="http://openocd.berlios.de/doc/html/index.html" target="_blank">OpenOCD User&#8217;s Guide</a>.</p>
<p>Ist alles richtig konfiguriert, der JTAG Adapter mit Entwicklungsrechner und Target Board verbunden und das Target mit Spannung versorgt, sollte man durch Eingabe von <code>$ openocd</code> den OpenOCD Daemon starten können. Dieser lauscht sowohl auf <em>TCP Port 4444</em> (telnet Verbindung), wie auch auf <em>TCP Port 3333</em> (gdb Verbindung).</p>
<h3>GDB verwenden</h3>
<p>Nun kann man sich mit dem GDB zum OpenOCD Verbinden. Die folgenen gdb-Befehle können sowohl im gdb Prompt eingegeben werden, oder in einer Datei zusammengefasst werden, die dem GDB beim Start übergeben wird:</p>
<p><code><br />
target remote localhost:3333<br />
set remote hardware-watchpoint-limit 4<br />
set remote hardware-breakpoint-limit 6<br />
monitor reset<br />
</code></p>
<p>Wenn alle geklappt hat, sollte man mit dem Target verbunden sein und kann mit dem Debuggen anfangen. Weiterführende Infos zum GDB findet ihr im <a title="GDB User Guid" href="http://sourceware.org/gdb/current/onlinedocs/gdb/" target="_blank">GDB User Guide</a>.</p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.alios.org/blog/2010/01/cortex-m3-on-chip-debugging-unter-linux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GNU ARM Cortex-M3 Toolchain selber bauen</title>
		<link>http://www.alios.org/blog/2009/12/gnu-arm-cortex-m3-toolchain-selber-bauen/</link>
		<comments>http://www.alios.org/blog/2009/12/gnu-arm-cortex-m3-toolchain-selber-bauen/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 14:17:24 +0000</pubDate>
		<dc:creator>alios</dc:creator>
				<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Gebastel und Gelöt]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[binutils]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[cortex]]></category>
		<category><![CDATA[cortex-m3]]></category>
		<category><![CDATA[crosscompiler]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[newlib]]></category>
		<category><![CDATA[toolchain]]></category>

		<guid isPermaLink="false">http://www.alios.org/blog/?p=162</guid>
		<description><![CDATA[Die GNU Toolchain unterstütz u.a. auch die neue Cortex-M3 Familie von ARM. Ich möchte hier kurz vorstellen, wie man sich selber die entsprechende Crosscompiler Toolchain baut.

Um eine vollständige Toolchain zu erhalten werden 3 Pakete benötigt:

	GNU binutils
	GNU Compiler Collection (GCC)
	newlib (libc für embedded Systeme)

Zunächst legt man sich ein Verzeichnis an, in dem der gesamte Buildprozess ...]]></description>
			<content:encoded><![CDATA[<p>Die GNU Toolchain unterstütz u.a. auch die neue <a title="ARM: Cortex-M3 Familie" href="http://www.arm.com/products/CPUs/ARM_Cortex-M3.html" target="_blank">Cortex-M3 Familie</a> von ARM. Ich möchte hier kurz vorstellen, wie man sich selber die entsprechende Crosscompiler Toolchain baut.</p>
<p>Um eine vollständige Toolchain zu erhalten werden 3 Pakete benötigt:</p>
<ul>
<li><a title="GNU Binutils" href="http://sourceware.org/binutils/" target="_blank">GNU binutils</a></li>
<li><a title="GNU Compiler Collection GCC" href="http://gcc.gnu.org/" target="_blank">GNU Compiler Collection (GCC)</a></li>
<li><a title="Newlib: C library intended for use on embedded systems" href="http://sourceware.org/newlib/" target="_blank">newlib (libc für embedded Systeme)</a></li>
</ul>
<p>Zunächst legt man sich ein Verzeichnis an, in dem der gesamte Buildprozess und die Sourcen liegen werden. Bei mir ist dies <code>/home/alios/src/toolchain.</code><br />
Die Toolchain wird vollständig nach <code>/usr/local/arm-elf</code> installiert. Für ein anderes Verzeichnis einfach den Parameter <code>--prefix=</code> bei den <code>configure</code> Aufrufen entsprechend abändern.</p>
<h3>binutils installieren</h3>
<p>Eine aktuelle Version der binutils kann hier heruntergeladen werden: <a href="ftp://sourceware.org/pub/binutils/snapshots" target="_blank">ftp://sourceware.org/pub/binutils/snapshots</a></p>
<p>Die Version sollte im Prinzip egal sein, ich habe <a href="ftp://sourceware.org/pub/binutils/snapshots/binutils-2.20.51.tar.bz2">Version 2.20.51</a> gewählt. Im Anschluss werden die Sourcen entpackt, gebaut und installiert.</p>
<p><code><br />
$ mkdir /home/alios/src/toolchain<br />
$ cd /home/alios/src/toolchain<br />
$ wget ftp://sourceware.org/pub/binutils/snapshots/binutils-2.20.51.tar.bz2<br />
$ tar -jxf binutils-2.20.51.tar.bz2<br />
$ mkdir build-arm-elf<br />
$ mkdir build-arm-elf/binutils<br />
$ cd build-arm-elf/binutils<br />
$ ../../binutils-2.20.51/configure --prefix=/usr/local/arm-elf --target=arm-elf<br />
<em> [ ... configure output ... ] </em><br />
$ make all<br />
<em> [ ... build output ... ] </em><br />
$ sudo make install<br />
</code></p>
<h3>GCC Teil 1 bauen</h3>
<p>Der gcc wird in 2 Schritten gebaut. Zunächst wird der <em>C</em> und der <em>C++</em> Compiler gebaut. Die <em>libstdc++</em>, die auch zum GCC gehört, kann allerdings erst gebaut werden,<br />
nachdem eine <em>libc</em> installiert wurde (die <em>newlib </em>in diesem Fall). Daher wird der Build Prozess nach einer Weile mit einem Fehler <span id="dpfsent_4" onclick="spellCheckers0.showSentLenMenu(this.id);"><span id="dpfgram0_611de_4_0" lang="abbrechen ..." onclick="spellCheckers0.showGramMenu(this.id);">abbrechen</span></span> &#8211; davon nicht irritieren lassen.</p>
<p>Als Version habe ich mich für den aktuellen 4.4 Branch aus dem GCC subversion repository entschieden.</p>
<p><code><br />
$ cd /home/alios/src/toolchain<br />
$ svn co  svn://gcc.gnu.org/svn/gcc/branches/gcc-4_4-branch<br />
$ mkdir build-arm-elf/gcc<br />
$ cd build-arm-elf/gcc<br />
$ ../../gcc-4.4-branch/configure --target=arm-elf --prefix=/usr/local/arm-elf --disable-nls --disable-shared --disable-threads --with-gnu-ld --with-gnu-as --disable-multilib --disable-libssp --disable-libmudflap --disable-libgomp --with-dwarf2 --with-newlib -v --disable-werror --with-cpu=cortex-m3 --with-tune=cortex-m3 --with-mode=thumb --enable-target-optspace --with-float=soft --enable-languages=c,c++<br />
<em> [ ... configure output ... ] </em><br />
$ make all<br />
<em> [ ... build output ... ] </em><br />
<em><br />
checking for type equivalent to int8_t... configure: error: no 8-bit type<br />
exit: Illegal number: please<br />
exit: Illegal number: please<br />
gmake[1]: *** [configure-target-libstdc++-v3] Error 1<br />
gmake[1]: Leaving directory `/usr/home/alios/src/toolchain/build-arm-elf/gcc'<br />
</em><br />
$ sudo make install<br />
</code></p>
<p>Nun sollte der GCC installiert sein. Ggf. muss das Verzeichnis bevor es weiter geht noch in den Pfad mit aufgenommen werden (<code>$ export PATH=/usr/local/arm-elf/bin:$PATH </code>).</p>
<p>Ein Aufruf von <code>$ arm-elf-gcc --version</code> sollte funktionieren.</p>
<h3>newlib installieren</h3>
<p>Die Newlib ist eine für embedded System optimierte Implementierung der <em>C Standard Bibliothek</em> (libc). Die aktuellste Version erhält man aus dem CVS.</p>
<p><code><br />
$ cd /home/alios/src/toolchain<br />
$ mkdir newlib-cvs<br />
$ cd newlib-cvs<br />
$ cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/src login<br />
<em>Als Passwort "anoncvs" eingeben</em><br />
$ cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/src co newlib<br />
<em>[ ... auschecken des Sourcecodes ... ]</em><br />
$ cd ..<br />
$ mkdir build-arm-elf/newlib<br />
$ cd build-arm-elf/newlib<br />
$ ../../newlib-cvs/src/configure --with-newlib --disable-newlib-io-float --disable-newlib-supplied-syscalls --prefix=/usr/local/arm-elf --target=arm-elf<br />
<em> [ ... configure output ... ] </em><br />
$ make all<br />
<em> [ ... build output ... ] </em><br />
$ sudo make install<br />
</code></p>
<h3>GCC Teil 2 bauen</h3>
<p>Nun ist auch die <em>libc </em>installiert und es fehlt nur noch die <em>libstdc++</em>. Dazu wird in das gcc Build-Verzeichniss zurrück gekehrt und der Build Prozess fortegesetzt.</p>
<p><code><br />
$ cd /home/alios/src/build-arm-elf/gcc<br />
$ make all<br />
<em> [ ... build output ... ] </em><br />
$ sudo make install</code></p>
<p>Eine vollständige C/C++ Toolchain für den Cortex-M3 ist nun installiert.</p>
<p>In einem <a title="Cortex-M3 On Chip Debugging" href="http://www.alios.org/blog/2010/01/cortex-m3-on-chip-debugging-unter-linux/" target="_blank">weiteren Artikel</a> erkläre ich wie man OpenOCD mit GDB zum On Chip Debugging einsetzt.</p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.alios.org/blog/2009/12/gnu-arm-cortex-m3-toolchain-selber-bauen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

