<?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>datenkobold.de &#187; Programmierung</title>
	<atom:link href="http://www.datenkobold.de/weblog/tags/programmierung/feed" rel="self" type="application/rss+xml" />
	<link>http://www.datenkobold.de/weblog</link>
	<description>das Weblog von Steffen Bauch</description>
	<lastBuildDate>Fri, 09 Dec 2011 21:58:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Speicheroptimierung mit pahole</title>
		<link>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole</link>
		<comments>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole#comments</comments>
		<pubDate>Tue, 22 Dec 2009 09:05:03 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[pahole]]></category>
		<category><![CDATA[Speicheroptimierung]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=517</guid>
		<description><![CDATA[Bei der Nutzung der Programmiersprache C ist der Softwareentwickler neben den g&#228;ngigen Optimierungen durch den Compiler zum Gro&#223;teil selbst f&#252;r die Optimierung des Laufzeitverhaltens eines Programms und des Speicherbedarfs der Datenstrukturen zust&#228;ndig. Im folgenden Artikel wird zur Unterst&#252;tzung bei der Speicheroptimierung das Linux-Tool pahole vorgestellt. Werden bei der Programmierung in C zusammengesetzten Datentypen wie struct [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2011/02/hardware-pwm-fuer-foxboard-g20' rel='bookmark' title='Hardware-PWM f&#252;r Foxboard G20'>Hardware-PWM f&#252;r Foxboard G20</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Bei der Nutzung der Programmiersprache C ist der Softwareentwickler neben den g&#228;ngigen Optimierungen durch den Compiler zum Gro&#223;teil selbst f&#252;r die Optimierung des Laufzeitverhaltens eines Programms und des Speicherbedarfs der Datenstrukturen zust&#228;ndig. Im folgenden Artikel wird zur Unterst&#252;tzung bei der Speicheroptimierung das Linux-Tool pahole vorgestellt.</p>
<p>Werden bei der Programmierung in C zusammengesetzten Datentypen wie <code>struct</code> verwendet ist es m&#246;glich, dass aus Gr&#252;nden des Alignments zwischen den Teilelementen der Struktur nicht genutzte F&#252;llbytes eingef&#252;gt werden. Zur&#252;ckzuf&#252;hren ist das Einf&#252;gen dieser F&#252;llbytes auf die Rechnerarchitektur und die Art und Weise wie ein Prozessor auf den Hauptspeicher zugreift. Wenn ein Prozessor Daten aus dem Hauptspeicher liest, dann erfolgt der Zugriff mit der Verarbeitungsbreite des Prozessors. Ist der Prozessor ein 32-bit Prozessor, dann werden in einem Schritt 4 Byte gelesen. Diese Annahme gilt f&#252;r alle weiteren Beispiele.</p>
<p>Ein Datenelement ist dann richtig im Speicher angeordnet, wenn seine Speicheradresse einem ganzzahligen Vielfachen seiner Gr&#246;&#223;e entspricht. F&#252;r diesen Fall kann der Prozessor das Datenelement optimal einlesen (ohne &#220;berlappung und notwendige Verschiebung) und das Datenelement wird als aligned bezeichnet. Werden nun Elemente mit unterschiedlichen Speichergr&#246;&#223;en wie unsigned short (2 Byte), unsigned char (1 Byte) oder unsigned int (4 Byte) in einem Verbunddatentyp gemischt verwendet ist es m&#246;glich, dass F&#252;llbytes eingef&#252;gt werden um das Alignment zu gew&#228;hrleisten.</p>
<p>Zur weiteren Erkl&#228;rung soll nun folgende Datenstruktur betrachtet werden:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> test_data <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">short</span> alpha<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> beta<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> gamma<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> delta<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>In dieser Datenstruktur wird zwischen den Elementen beta und gamma ein F&#252;llbyte eingef&#252;gt um gamma entsprechend den Alignment-Anforderungen auszurichten. Das F&#252;llbyte ist notwendig, da alpha und beta zusammen 3 Byte, also beispielhaft die Adressen 0 bis 2 belegenen und gamma als Datentyp mit 4 Byte Speicherbedarf auf Adresse 4 ausgerichtet wird. Die Adresse 3 bleibt dann ungenutzt und geht als verf&#252;gbarer Speicher verloren. Diese L&#246;cher in den Strukturen sind nicht optimal und k&#246;nnen teilweise durch Umordnen der Elemente entfernt werden. Das manuelle Berechnen dieser L&#246;cher ist zwar m&#246;glich, durch geeignete Werkzeuge allerdings auch automatisierbar.</p>
<p>Das Linux-Werkzeug pahole (Poke-a-Hole) ist ein Hilfsmittel um Datenstrukturen zu analysieren, Alignement-L&#246;cher zu identifizieren und Umordnungsvorschl&#228;ge anzugeben. Ziel ist die Reduzierung von Strukturgr&#246;&#223;en im Speicher und dadurch die Reduzierung des Speicherbedarfs von Programmen w&#228;hrend der Laufzeit. Ein wichtiger Effekt ist au&#223;erdem die bessere Ausnutzung von Caches und dadurch eine Beschleunigung des Programms bei Speicheroperationen. Durch die Entfernung der F&#252;llbytes entsteht eine geringere Belastung des Speicherbusses.</p>
<p>Da pahole kein Tool zur statischen Quellcodeanalyse ist, sondern den mit Debug-Informationen ausgestatteten Object-Code untersucht, sind neben dem Build-Werkzeug <code>cmake</code> zum Kompilieren noch weitere Bibliotheken zur Unterst&#252;tzung des DWARF2-Debug-Formates notwendig. Die Installation erfolgt unter Ubuntu mit:</p>
<pre>
sudo aptitude install libdw-dev libelf-dev cmake
</pre>
<p>Der Programmcode von pahole ist aufgrund des Ursprungs in der Linux-Kernel-Entwicklergemeinde im Kernel-Git-Repository verf&#252;gbar, man erh&#228;lt den Quellcode mit folgendem Befehl:</p>
<pre>
git clone git://git.kernel.org/pub/scm/linux/kernel/git/acme/pahole.git
</pre>
<p>Unter Ubuntu 9.10 Karmic Koala ist unter Umst&#228;nden wie in diesem <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=534529">Bugreport</a> beschrieben vor dem Kompilieren noch ein Patch notwendig. Dabei ist der <code>find_library</code> Ausdruck f&#252;r <code>EBL_LIBRARY</code> in <code>cmake/modules/FindDWARF.cmake</code> durch <code>set (EBL_LIBRARY -ldw)</code> zu ersetzen.</p>
<p>Das Kompilieren und die Installation erfolgt dann im Verzeichnis pahole mit den Befehlen:</p>
<pre>
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
sudo make install
</pre>
<p>Das zu untersuchende Programm <code>hello</code> oder Object-File <code>hello.o</code> ist dann mit dem Compiler im Debug-Modus, also <code>gcc -g</code> zu kompilieren. Der Befehl</p>
<pre>
pahole hello
</pre>
<p>beziehungsweise</p>
<pre>
pahole hello.o
</pre>
<p>gibt dann einen Bericht in folgender Art f&#252;r alle verwendeten, nicht-anonymen Strukturen aus:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> test_data <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">short</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span>         alpha<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     0     2 */</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span>              beta<span style="color: #339933;">;</span>         <span style="color: #808080; font-style: italic;">/*     2     1 */</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/* XXX 1 byte hole, try to pack */</span>
&nbsp;
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span>               gamma<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     4     4 */</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span>              delta<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     8     1 */</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/* size: 12, cachelines: 1, members: 4 */</span>
	<span style="color: #808080; font-style: italic;">/* sum members: 8, holes: 1, sum holes: 1 */</span>
	<span style="color: #808080; font-style: italic;">/* padding: 3 */</span>
	<span style="color: #808080; font-style: italic;">/* last cacheline: 12 bytes */</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Der hinzugef&#252;gte Kommentar enth&#228;lt f&#252;r jedes Element die Adresse in Bezug auf den Anfang der Struktur und die Gr&#246;&#223;e des Elementes. Zus&#228;tzlich werden L&#246;cher in den Strukturen und die Gesamtgr&#246;&#223;e der Struktur angegeben.</p>
<p>Neben der Identifikation der ungenutzten Speicherbereiche kann mit dem Befehl</p>
<pre>
pahole -RC test_data hello
</pre>
<p>auch ein Hinweis f&#252;r die Reorganisation der Elemente ausgegeben werden. Im vorhandenen Beispiel w&#228;re dies die Anordnung des Elementes delta nach beta und vor gamma um das Loch von einem Byte zu f&#252;llen.</p>
<p>Abschlie&#223;end bleibt anzumerken, dass die Relevanz dieser Optimierungen auf modernen 64-bit Architekturen h&#246;her ist, da durch die gr&#246;&#223;ere Verarbeitungsbreite L&#246;cher in den Strukturen h&#228;ufiger auftreten und diese auch gr&#246;&#223;er sind.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2011/02/hardware-pwm-fuer-foxboard-g20' rel='bookmark' title='Hardware-PWM f&#252;r Foxboard G20'>Hardware-PWM f&#252;r Foxboard G20</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diplomarbeit</title>
		<link>http://www.datenkobold.de/weblog/2008/04/diplomarbeit</link>
		<comments>http://www.datenkobold.de/weblog/2008/04/diplomarbeit#comments</comments>
		<pubDate>Mon, 21 Apr 2008 19:06:06 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Diplom]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Studium]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/2008/04/diplomarbeit</guid>
		<description><![CDATA[Seit heute schreibe ich offiziell an meiner Diplomarbeit. In den n&#228;chsten vier Monaten werde ich das Thema “Entwicklung einer Pr&#252;fsoftware auf einer embedded i.MX31-Plattform mit Betriebssystem Linux” bearbeiten. Es geht darum, f&#252;r ein Embedded-Board mit i.MX31-Mikrocontroller und sehr vielen unterschiedlichen Schnittstellen (CAN, Ethernet, USB als Host und als Client, mehrere Displayschnittstellen) und Onboard-Peripherie (verschiedene Flashspeicher, [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/02/asus-wl-500g-premium-mit-openwrt-kamikaze' rel='bookmark' title='Asus WL-500g Premium mit OpenWrt Kamikaze'>Asus WL-500g Premium mit OpenWrt Kamikaze</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/08/bericht-aus-zentralasien' rel='bookmark' title='Bericht aus Zentralasien'>Bericht aus Zentralasien</a></li>
<li><a href='http://www.datenkobold.de/weblog/2010/01/speicherverbrauch-unter-linux-messen' rel='bookmark' title='Speicherverbrauch unter Linux messen'>Speicherverbrauch unter Linux messen</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Seit heute schreibe ich offiziell an meiner Diplomarbeit. In den n&#228;chsten vier Monaten werde ich das Thema “Entwicklung einer Pr&#252;fsoftware auf einer embedded i.MX31-Plattform mit Betriebssystem Linux” bearbeiten. Es geht darum, f&#252;r ein Embedded-Board mit <a href="http://www.freescale.com/imx31">i.MX31-Mikrocontroller </a>und sehr vielen unterschiedlichen Schnittstellen (CAN, Ethernet, USB als Host und als Client, mehrere Displayschnittstellen) und Onboard-Peripherie (verschiedene Flashspeicher, RTC und produktspezifische Schaltkreise) eine Software zu schreiben, die alle Komponenten ansteuert und auf Funktionalit&#228;t testet. Das Ganze passiert in der N&#228;he von Ravensburg, deswegen wohne ich auch seit sechs Wochen zeitweise in <a href="http://www.weingarten-online.de/">Weingarten</a>.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/02/asus-wl-500g-premium-mit-openwrt-kamikaze' rel='bookmark' title='Asus WL-500g Premium mit OpenWrt Kamikaze'>Asus WL-500g Premium mit OpenWrt Kamikaze</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/08/bericht-aus-zentralasien' rel='bookmark' title='Bericht aus Zentralasien'>Bericht aus Zentralasien</a></li>
<li><a href='http://www.datenkobold.de/weblog/2010/01/speicherverbrauch-unter-linux-messen' rel='bookmark' title='Speicherverbrauch unter Linux messen'>Speicherverbrauch unter Linux messen</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2008/04/diplomarbeit/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chumby</title>
		<link>http://www.datenkobold.de/weblog/2007/02/chumby</link>
		<comments>http://www.datenkobold.de/weblog/2007/02/chumby#comments</comments>
		<pubDate>Wed, 28 Feb 2007 06:46:37 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Chumby]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/2007/02/chumby</guid>
		<description><![CDATA[Chumby (Bilder hier), ein kompaktes Ger&#228;t das sich wie ein Wecker verhalten kann, ist ein Eingebettetes System mit WLAN-Anschluss. Das Hardware-Layout f&#252;r das Ger&#228;t ist frei und sollte bei Anmeldung zug&#228;nglich sein. Leider wird in den Bedingungen der Anmeldung zu viel von Payment geredet, so das ich mich nicht angemeldet habe. Hauptzweck des Ger&#228;tes soll [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/02/asus-wl-500g-premium-mit-openwrt-kamikaze' rel='bookmark' title='Asus WL-500g Premium mit OpenWrt Kamikaze'>Asus WL-500g Premium mit OpenWrt Kamikaze</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/01/avr-butterfly' rel='bookmark' title='AVR Butterfly'>AVR Butterfly</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/02/serielle-schnittstelle-am-avr-butterfly' rel='bookmark' title='Serielle Schnittstelle am AVR Butterfly'>Serielle Schnittstelle am AVR Butterfly</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.chumby.com/">Chumby</a> (<a href="http://www.flickr.com/photos/33515138@N00/">Bilder hier</a>), ein kompaktes Ger&#228;t das sich wie ein Wecker verhalten kann, ist ein Eingebettetes System mit WLAN-Anschluss. Das Hardware-Layout f&#252;r das Ger&#228;t ist frei und sollte bei Anmeldung zug&#228;nglich sein. Leider wird in den Bedingungen der Anmeldung zu viel von Payment geredet, so das ich mich nicht angemeldet habe.</p>
<p>Hauptzweck des Ger&#228;tes soll sein, kleine Applikationen, die in Adobe Flash entwickelt, sind anzuzeigen. Beispielapplikationen sind ein Wecker, Wetteranzeige, Flickr-Bilder, Google-News usw.</p>
<p>Technisch setzt das Ger&#228;t auf einen Freescale iMX21 266MHz ARM9 controller, hat 32MB SDRAM, 64 MB NAND FLASH, einen 320×240 3.5-inch Touchscreen mit 12Hz, Stereo 2W Lautsprecher, einen Audio-Ausgang und Mikrophone-Eingang, einen USB-Anschluss und eine WLAN-Karte.</p>
<p>Auf dem Ger&#228;t l&#228;uft Linux 2.4.20, <a href="http://www.chumby.com/developers/devlinux">eine Toolchain und die Kernelquellen</a> sind auch verf&#252;gbar. Weitere Experimente habe ich noch nicht durchgef&#252;hrt, da ich keine Hardware besitze. Chumby Industries scheint aber Probeexemplare unter das Volk zu bringen oder bringen zu wollen, auf der Seite gibt es ein entsprechendes Angebot f&#252;r “alpha-geek hacker”</p>
<p>Was mir bei Analyse der Chumby-Seiten fraglich geblieben ist, ist das Format der Images f&#252;r Chumby und das integrierte System zum Digital-Rights-Management. Ziel ist wohl, einen Abomechanismus mit dem Ger&#228;t zu verkaufen.</p>
<p>Irgendwann im M&#228;rz soll es das dann auch zu kaufen geben. Das k&#246;nnte durchaus ein Hype werden, wenn der angestrebte Preis von 150$ erreicht wird und es auch ohne Abo geht.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/02/asus-wl-500g-premium-mit-openwrt-kamikaze' rel='bookmark' title='Asus WL-500g Premium mit OpenWrt Kamikaze'>Asus WL-500g Premium mit OpenWrt Kamikaze</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/01/avr-butterfly' rel='bookmark' title='AVR Butterfly'>AVR Butterfly</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/02/serielle-schnittstelle-am-avr-butterfly' rel='bookmark' title='Serielle Schnittstelle am AVR Butterfly'>Serielle Schnittstelle am AVR Butterfly</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2007/02/chumby/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Serielle Schnittstelle am AVR Butterfly</title>
		<link>http://www.datenkobold.de/weblog/2007/02/serielle-schnittstelle-am-avr-butterfly</link>
		<comments>http://www.datenkobold.de/weblog/2007/02/serielle-schnittstelle-am-avr-butterfly#comments</comments>
		<pubDate>Mon, 19 Feb 2007 22:42:35 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Butterfly]]></category>
		<category><![CDATA[Elektronik]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Schnittstellen]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/2007/02/serielle-schnittstelle-am-avr-butterfly</guid>
		<description><![CDATA[Um die serielle Schnittstelle am AVR Butterfly nutzen zu k&#246;nnen ist nicht viel Arbeit erforderlich. Ein serieller Pegelwandler von Low-Voltage-Seriell auf den h&#246;heren Pegel an der seriellen Schnittstelle eines PCs ist bereits auf dem Butterfly integriert. Es bietet sich an den Butterfly mit Stiftleisten zu best&#252;cken um Kabel einfach anschlie&#223;en zu k&#246;nnen. Ich habe ein [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/avr-butterfly' rel='bookmark' title='AVR Butterfly'>AVR Butterfly</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/01/microcontroller-bastelei' rel='bookmark' title='Microcontroller-Bastelei'>Microcontroller-Bastelei</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Um die serielle Schnittstelle am AVR Butterfly nutzen zu k&#246;nnen ist nicht viel Arbeit erforderlich. Ein serieller Pegelwandler von Low-Voltage-Seriell auf den h&#246;heren Pegel an der seriellen Schnittstelle eines PCs ist bereits auf dem Butterfly integriert.<br />
Es bietet sich an den Butterfly mit Stiftleisten zu best&#252;cken um Kabel einfach anschlie&#223;en zu k&#246;nnen. Ich habe ein paar g&#252;nstige Bauteile von <a href="http://www.reichelt.de/">Reichelt</a> genutzt, dieses Material gibt es aber auch bei anderen Elektronik-H&#228;ndlern.</p>
<ul>
<li>3 Stifte einer 36-poligen, einreihigen geraden Stiftleiste mit Rasterma&#223; 2,54 (SL 1X36G 2,54)</li>
<li>eine 3-poligen Platinensteckverbinder gerade, weiss (PS 25/3G WS)</li>
<li>D-SUB-Buchse, 9-polig, L&#246;tkelch zum PC-Anschluss (D-SUB BU 09)</li>
</ul>
<p>Das ganze ist schnell verl&#246;tet, die PIN-Belegung ist aus der Grafik ersichtlich und ist im User-Manual des Butterfly dokumentiert. (RXD an Pin 3, TXD an Pin 2 und GND an Pin 5)</p>
<p><img src="http://www.datenkobold.de/weblog/wp-content/uploads/2007/02/butterfly_serial_1.jpg" alt="butterfly_serial_1" title="butterfly_serial_1" width="400" height="300" class="aligncenter size-full wp-image-405" /></p>
<p><img src="http://www.datenkobold.de/weblog/wp-content/uploads/2007/02/butterfly_serial_2.jpg" alt="butterfly_serial_2" title="butterfly_serial_2" width="400" height="300" class="aligncenter size-full wp-image-406" /></p>
<p>Das Ganze kann man dann in der Beispielanwendung bei der Namenseingabe mit dem Terminalprogramm Minicom testen. Die genaue Vorgehensweise ist unter Punkt 2.2.2 des <a href="http://www.atmel.com/dyn/resources/prod_documents/doc4271.pdf">Usermanual</a> beschrieben. Zur Kommunikation unter Linux stellt man am besten als Supernutzer den Default von Minicom mit</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">minicom -s</pre></div></div>

<p>unter &#8220;Serial Port Default&#8221; auf Serial Device /dev/ttyS0, Communication Parameter auf 19200 8N1 und keine Hardware- und Software-Flusskontrolle. Das ganze speichert man als Default dfl. Nun kann man entsprechend der Anleitung einen ersten Test der Kommunikation durchf&#252;hren, der eingegebene Name sollte auch wenn kein Echo im Terminal eingestellt ist oder vom Butterfly zur&#252;ckgegeben wird nach Best&#228;tigen mit Enter auf dem Display erscheinen.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/avr-butterfly' rel='bookmark' title='AVR Butterfly'>AVR Butterfly</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/01/microcontroller-bastelei' rel='bookmark' title='Microcontroller-Bastelei'>Microcontroller-Bastelei</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2007/02/serielle-schnittstelle-am-avr-butterfly/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Asus WL-500g Premium mit OpenWrt Kamikaze</title>
		<link>http://www.datenkobold.de/weblog/2007/02/asus-wl-500g-premium-mit-openwrt-kamikaze</link>
		<comments>http://www.datenkobold.de/weblog/2007/02/asus-wl-500g-premium-mit-openwrt-kamikaze#comments</comments>
		<pubDate>Fri, 16 Feb 2007 22:11:17 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenWrt]]></category>
		<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/2007/02/asus-wl-500g-premium-mit-openwrt-kamikaze</guid>
		<description><![CDATA[Ich habe zu Testzwecken einen WLAN-Router von Asus erworben. Es handelt sich um das Modell Asus WL-500g Premium mit 8 MB Flash-Speicher und 32 MB RAM sowie zwei USB-Ports. Preislich liegt das Ger&#228;t bei ungef&#228;hr 70 Euro bei Ebay. Der WLAN-Router l&#228;sst sich mit OpenWRT unter Linux betreiben. Betrieben wird das Ger&#228;t von mir unter [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2005/03/chemnitzer-linux-tage-2005' rel='bookmark' title='Chemnitzer Linux-Tage 2005'>Chemnitzer Linux-Tage 2005</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/02/chumby' rel='bookmark' title='Chumby'>Chumby</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/01/avr-butterfly' rel='bookmark' title='AVR Butterfly'>AVR Butterfly</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Ich habe zu Testzwecken einen WLAN-Router von Asus erworben. Es handelt sich um das Modell <a href="http://www.asus.com/products4.aspx?l1=12&#038;l2=43&#038;l3=0&#038;model=1121&#038;modelmenu=1">Asus WL-500g Premium</a> mit 8 MB Flash-Speicher und 32 MB RAM sowie zwei USB-Ports. Preislich liegt das Ger&#228;t bei ungef&#228;hr 70 Euro bei Ebay. Der WLAN-Router l&#228;sst sich mit <a href="http://openwrt.org/">OpenWRT</a> unter Linux betreiben.</p>
<p><img src="http://www.datenkobold.de/weblog/wp-content/uploads/2007/02/asus_wl_500g_premium.jpg" alt="asus_wl_500g_premium" title="asus_wl_500g_premium" width="200" height="200" class="aligncenter size-full wp-image-402" /></p>
<p>Betrieben wird das Ger&#228;t von mir unter der neuen Entwicklungsversion von OpenWrt mit dem Namen <a href="http://openwrt.pbwiki.com/">Kamikaze</a>.<br />
Die Quellen daf&#252;r bekommt man durch einen Checkout aus dem Subversion-Repository.</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">svn co https://svn.openwrt.org/openwrt/trunk/</pre></div></div>

<p>Anschlie&#223;end f&#252;hrt man im trunk/-Verzeichnis die Konfiguration des Firmware-Build-Prozesses mit</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">make menuconfig</pre></div></div>

<p>aus und baut die Firmware mit</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">make</pre></div></div>

<p>Um den Router zu Flashen ben&#246;tigt man einen tftp-client, es wird atftp empfohlen. Unter Gentoo installiert man</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">emerge atftp</pre></div></div>

<p>Nun muss man als Erstes den Router in den Diagnose-Modus versetzen:</p>
<ol>
<li>Entfernen der Versorgungsspannung.</li>
<li>Dr&#252;cken des RESET-Tasters (nicht der rote EZSETUP) mit einem Stift/Feinschraubenzieher w&#228;hrend des Einschaltens f&#252;r ein paar Sekunden.</li>
<li>Loslassen des RESET-Tasters.</li>
</ol>
<p>Man erkennt das der Router im Diagnosemodus ist daran, dass die POWER-LED langsam blinkt. Der Router befindet sich nun im Bootloader CFE (Common Firmware Environment). Nun f&#252;hrt man folgendende Eingaben in dem Verzeichnis durch, in dem das Image der Firmware liegt ( z.B. trunk/bin )</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;"># atftp
connect 192.168.1.1
mode octet
trace
timeout 1
put openwrt-brcm-2.4-squashfs.trx</pre></div></div>

<p>Das Image wird jetzt auf den Router &#252;bertragen.</p>
<p class="alert">Achtung: Nach &#220;bertragung muss der Router noch mindestens 6 Minuten eingeschaltet bleiben, da das Image erst nach dem &#252;bertragen in den Flash geschrieben wird. Der Router startet nach Beenden des Schreibvorgangs nicht automatisch neu: Man wartet also lieber ein wenig l&#228;nger und f&#252;hrt dann einen Reset durch.</p>
<p>Nun sollte man sich mit telnet auf 192.168.1.1 verbinden k&#246;nnen und mit passwd ein root-Passwort f&#252;r die Nutzung von ssh setzen k&#246;nnen. Das Default-Passwort f&#252;r root ist nicht gesetzt, der Zugang &#252;ber ssh funktioniert aber erst nach dieser Aktion.<br />
Wenn alles funktioniert bekommt man einen Prompt und ein kleines eingebettes Linux-System f&#252;r wenig Geld:</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;"># uname -a
Linux OpenWrt 2.4.34 #2 Thu Feb 15 20:47:24 CET 2007 mips unknown</pre></div></div>

<p>Um den vollst&#228;ndigen Leistungsumfang des Ger&#228;tes nutzen zu k&#246;nnen muss man noch ein paar spezielle Aktionen durchf&#252;hren, zum Beispiel muss noch die volle Menge des Speichers nutzbar gemacht werden.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2005/03/chemnitzer-linux-tage-2005' rel='bookmark' title='Chemnitzer Linux-Tage 2005'>Chemnitzer Linux-Tage 2005</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/02/chumby' rel='bookmark' title='Chumby'>Chumby</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/01/avr-butterfly' rel='bookmark' title='AVR Butterfly'>AVR Butterfly</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2007/02/asus-wl-500g-premium-mit-openwrt-kamikaze/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arithmetik ohne Begrenzungen</title>
		<link>http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen</link>
		<comments>http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen#comments</comments>
		<pubDate>Sun, 28 Jan 2007 22:37:48 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Arithmetik]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Mathematik]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen</guid>
		<description><![CDATA[Selbst wenn man nur einfache Probleme in Theoretischer Informatik, Zahlentheorie oder Diskreter Mathematik bearbeitet und durch Programme in C zu erschlie&#223;en versucht, gelangt man schnell an die Grenzen der darstellbaren Wertebereiche f&#252;r ganze Zahlen. Das Implementieren einer eigenen Bibliothek f&#252;r gro&#223;e Zahlen ist zwar m&#246;glich, mit GMP (GNU Multi Precision Arithmic Library) gibt es aber [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno' rel='bookmark' title='Statische Codeanalyse mit Uno'>Statische Codeanalyse mit Uno</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/12/unmaintainable-code' rel='bookmark' title='Unmaintainable Code'>Unmaintainable Code</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/02/mathematik-ist' rel='bookmark' title='Mathematik ist.'>Mathematik ist.</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Selbst wenn man nur einfache Probleme in Theoretischer Informatik, Zahlentheorie oder Diskreter Mathematik bearbeitet und durch Programme in C zu erschlie&#223;en versucht, gelangt man schnell an die Grenzen der darstellbaren Wertebereiche f&#252;r ganze Zahlen. Das Implementieren einer eigenen Bibliothek f&#252;r gro&#223;e Zahlen ist zwar m&#246;glich, mit <a href="http://www.swox.com/gmp/">GMP</a> (GNU Multi Precision Arithmic Library) gibt es aber bereits eine freie und gut gepflegte Implementierung.</p>
<p>Eine einfache, experimentelle Erkundung des <a href="http://de.wikipedia.org/wiki/Collatz-Problem">Syracuse-Problems</a> k&#246;nnte so aussehen:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> a<span style="color: #339933;">;</span>
&nbsp;
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">!=</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d &quot;</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	a <span style="color: #339933;">=</span> syracuse<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;1<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> syracuse<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>n <span style="color: #339933;">%</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">3</span> <span style="color: #339933;">*</span> n <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> n <span style="color: #339933;">/</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Mit der GNU MP Bignum Library wird daraus:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;gmp.h&gt;</span>
&nbsp;
<span style="color: #993333;">void</span> mpz_syracuse<span style="color: #009900;">&#40;</span>mpz_t n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    mpz_t a<span style="color: #339933;">;</span>
    mpz_init<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    mpz_inp_str <span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> mpz_cmp_si<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	mpz_out_str <span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	mpz_syracuse<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;1<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> mpz_syracuse<span style="color: #009900;">&#40;</span>mpz_t n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>mpz_divisible_ui_p<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">,</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	mpz_divexact_ui <span style="color: #009900;">&#40;</span>n<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	mpz_mul_ui <span style="color: #009900;">&#40;</span>n<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	mpz_add_ui <span style="color: #009900;">&#40;</span>n<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Damit kann man dann auch f&#252;r sehr gro&#223;e nat&#252;rliche Zahlen die Zahlenfolge bestimmen, kompiliert wird wie gewohnt, allerdings muss man mit -lgmp linken.</p>
<p><img src="http://www.datenkobold.de/weblog/wp-content/uploads/2007/01/syracuse.png" alt="syracuse" title="syracuse" width="400" height="300" class="aligncenter size-full wp-image-396" /></p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno' rel='bookmark' title='Statische Codeanalyse mit Uno'>Statische Codeanalyse mit Uno</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/12/unmaintainable-code' rel='bookmark' title='Unmaintainable Code'>Unmaintainable Code</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/02/mathematik-ist' rel='bookmark' title='Mathematik ist.'>Mathematik ist.</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AVR Butterfly</title>
		<link>http://www.datenkobold.de/weblog/2007/01/avr-butterfly</link>
		<comments>http://www.datenkobold.de/weblog/2007/01/avr-butterfly#comments</comments>
		<pubDate>Wed, 17 Jan 2007 20:53:24 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Butterfly]]></category>
		<category><![CDATA[Elektronik]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Mikrocontroller]]></category>
		<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/2007/01/avr-butterfly</guid>
		<description><![CDATA[Der AVR Butterfly ist eine Evaluationsumgebung f&#252;r den Mikroprozessor ATmega169 von Atmel. Die Ausstattung an Schnittstellen und Sensor ist f&#252;r so ein kleines und g&#252;nstiges System recht beachtlicht. F&#252;r um die 20 Euro bekommt man ein 6-stelliges LCD, einen 4-Wege-Taster mit Druckknopf, 512 kByte Flash-Speicher, Licht- und Temperatursensor, einen Piezo-Schallwandler und einen Zugang &#252;ber serielle [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/02/serielle-schnittstelle-am-avr-butterfly' rel='bookmark' title='Serielle Schnittstelle am AVR Butterfly'>Serielle Schnittstelle am AVR Butterfly</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/02/asus-wl-500g-premium-mit-openwrt-kamikaze' rel='bookmark' title='Asus WL-500g Premium mit OpenWrt Kamikaze'>Asus WL-500g Premium mit OpenWrt Kamikaze</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/01/microcontroller-bastelei' rel='bookmark' title='Microcontroller-Bastelei'>Microcontroller-Bastelei</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Der <a href="http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3146">AVR Butterfly</a> ist eine Evaluationsumgebung f&#252;r den Mikroprozessor <a href="http://www.atmel.com/dyn/products/product_card.asp?part_id=3012">ATmega169</a> von <a href="http://www.atmel.com/">Atmel</a>.</p>
<p><img src="http://www.datenkobold.de/weblog/wp-content/uploads/2007/01/avrbutterfly_front.jpg" alt="avrbutterfly_front" title="avrbutterfly_front" width="400" height="300" class="aligncenter size-full wp-image-393" /></p>
<p>Die Ausstattung an Schnittstellen und Sensor ist f&#252;r so ein kleines und g&#252;nstiges System recht beachtlicht. F&#252;r um die 20 Euro bekommt man ein 6-stelliges LCD, einen 4-Wege-Taster mit Druckknopf, 512 kByte Flash-Speicher, Licht- und Temperatursensor, einen Piezo-Schallwandler und einen Zugang &#252;ber serielle Schnittstelle (mit Pegelwandler auf dem Board). Als weitere Kommunikationspfade mit dem System kann man JTAG, SPI und I2C nutzen. Zudem arbeitet der Butterfly sehr stromsparend und ist mit einer Lithium-Batterie autark spannungsversorgt.</p>
<p>Das System ist in C programmierbar, einen entsprechenden Compiler und Werkzeuge zur Daten&#252;bertragung auf das System gibt es auch f&#252;r Linux.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/02/serielle-schnittstelle-am-avr-butterfly' rel='bookmark' title='Serielle Schnittstelle am AVR Butterfly'>Serielle Schnittstelle am AVR Butterfly</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/02/asus-wl-500g-premium-mit-openwrt-kamikaze' rel='bookmark' title='Asus WL-500g Premium mit OpenWrt Kamikaze'>Asus WL-500g Premium mit OpenWrt Kamikaze</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/01/microcontroller-bastelei' rel='bookmark' title='Microcontroller-Bastelei'>Microcontroller-Bastelei</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2007/01/avr-butterfly/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Statische Codeanalyse mit Uno</title>
		<link>http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno</link>
		<comments>http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno#comments</comments>
		<pubDate>Thu, 21 Dec 2006 23:20:43 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Codeanalyse]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Softwaretest]]></category>
		<category><![CDATA[Uno]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=312</guid>
		<description><![CDATA[Statische Codeanalyse ist eine Art von Softwaretest, bei der Quellcode bestimmten formalen und algorithmischen Pr&#252;fungen unterzogen wird um Fehler in Software zu finden. Die &#220;berpr&#252;fung erfolgt hier im Gegensatz zur dynamischen Analyse nicht zur Laufzeit und wird deswegen als statische Analyse bezeichnet. Uno ist ein Tool, mit dem man nach drei der h&#228;ufigsten Fehlerarten in [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/12/unmaintainable-code' rel='bookmark' title='Unmaintainable Code'>Unmaintainable Code</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/10/cache-attack-auf-aes' rel='bookmark' title='Cache Attack auf AES'>Cache Attack auf AES</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Statische Codeanalyse ist eine Art von Softwaretest, bei der Quellcode bestimmten formalen und algorithmischen Pr&#252;fungen unterzogen wird um Fehler in Software zu finden. Die &#220;berpr&#252;fung erfolgt hier im Gegensatz zur dynamischen Analyse nicht zur Laufzeit und wird deswegen als statische Analyse bezeichnet.</p>
<p><a href="http://spinroot.com/uno/">Uno</a> ist ein Tool, mit dem man nach drei  der h&#228;ufigsten Fehlerarten in C-Quellcode suchen kann:</p>
<ul>
<li>Nutzung uninitialisierter Variablen</li>
<li>Dereferenzierung von NULL-Pointern</li>
<li>Bereichs&#252;berschreitung bei der Array-Adressierung</li>
</ul>
<p>Entsprechende Beispiele und ein Download des Werkzeuges sind auf der Seite von Uno zu finden. Eine kurze Probe hier hat gezeigt, da&#223; sich sowohl einfache Beispiele konstruieren lassen bei dem Dereferenzierungsfehler gefunden werden, als auch Beispiele, bei dem das Werkzeug die Fehler &#252;bersieht.</p>
<p>Hier wird der Fehler gefunden:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ptr<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ptr<span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> <span style="color: #0000dd;">123</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">else</span>
        <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> <span style="color: #0000dd;">345</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">uno:#1: possible global use or deref before def:
[R ptr global_nullptr_deref.c 9]
in fct main global_nullptr_deref.c 4</pre></div></div>

<p>und hier nicht:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ptr<span style="color: #339933;">;</span>
    ptr <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ptr<span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> <span style="color: #0000dd;">123</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">else</span>
        <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> <span style="color: #0000dd;">345</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Generell ist die quelloffene Verf&#252;gbarkeit von leistungsf&#228;higen Werkzeugen zur Codeanalyse nicht gegeben, die Werkzeuge &#252;bersehen Fehler oder liefern zuviele Falschpositive. Professionelle Tools wie <a href="http://www.coverity.com/">Coverity</a> stehen wiederum nicht zur freien Verf&#252;gung. Wer sich mehr mit diesem Thema besch&#228;ftigen will, findet allerdings auf der Seite von <a href="http://www.stanford.edu/%7Eengler/">Dawson Engler</a>, dem Gr&#252;nder von Coverity, einen guten Einstiegspunkt mit ein paar interessanten Ver&#246;ffentlichungen, auch zur probalistischen Analyse von Quellcode.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/12/unmaintainable-code' rel='bookmark' title='Unmaintainable Code'>Unmaintainable Code</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/10/cache-attack-auf-aes' rel='bookmark' title='Cache Attack auf AES'>Cache Attack auf AES</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microcontroller-Bastelei</title>
		<link>http://www.datenkobold.de/weblog/2006/01/microcontroller-bastelei</link>
		<comments>http://www.datenkobold.de/weblog/2006/01/microcontroller-bastelei#comments</comments>
		<pubDate>Sun, 01 Jan 2006 13:40:53 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Asuro]]></category>
		<category><![CDATA[Elektronik]]></category>
		<category><![CDATA[Fnordlicht]]></category>
		<category><![CDATA[Mikrocontroller]]></category>
		<category><![CDATA[Robotik]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=437</guid>
		<description><![CDATA[Hardware-Bastelei und Programmierung liegt ja zur Zeit total im Trend. Die einen basteln Fnordlichter, manche spielen mit dem Butterfly oder der halvedDisc, wieder andere bauen Mini-Roboter wie den Asuro. Allem gemeinsam ist, dass die Intelligenz der Ger&#228;te durch Microcontroller verwirklich wird. Bei mikrocontroller.net findet man gute Dokumentation, unter anderem ein umfassendes Tutorial zur Atmel-Programmierung in [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/avr-butterfly' rel='bookmark' title='AVR Butterfly'>AVR Butterfly</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
<li><a href='http://www.datenkobold.de/weblog/2010/01/fox-board-g20' rel='bookmark' title='FOX Board G20'>FOX Board G20</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Hardware-Bastelei und Programmierung liegt ja zur Zeit total im Trend. Die einen basteln <a href="http://koeln.ccc.de/prozesse/running/fnordlicht/">Fnordlichter</a>, manche spielen mit dem <a href="http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3146">Butterfly</a> oder der <a href="http://halveddisc.htwm.de/">halvedDisc</a>, wieder andere bauen Mini-Roboter wie den <a href="http://asurowiki.de/index.php">Asuro</a>.</p>
<p><img src="http://www.datenkobold.de/weblog/wp-content/uploads/2009/08/atmega8.jpg" alt="atmega8" title="atmega8" width="200" height="126" class="aligncenter size-full wp-image-438" /></p>
<p>Allem gemeinsam ist, dass die Intelligenz der Ger&#228;te durch Microcontroller verwirklich wird. Bei <a href="http://www.mikrocontroller.net/">mikrocontroller.net</a> findet man gute Dokumentation, unter anderem ein umfassendes <a href="http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial">Tutorial zur Atmel-Programmierung in C</a>.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/avr-butterfly' rel='bookmark' title='AVR Butterfly'>AVR Butterfly</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
<li><a href='http://www.datenkobold.de/weblog/2010/01/fox-board-g20' rel='bookmark' title='FOX Board G20'>FOX Board G20</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2006/01/microcontroller-bastelei/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unmaintainable Code</title>
		<link>http://www.datenkobold.de/weblog/2005/12/unmaintainable-code</link>
		<comments>http://www.datenkobold.de/weblog/2005/12/unmaintainable-code#comments</comments>
		<pubDate>Sat, 03 Dec 2005 10:56:50 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[CodingStyle]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=276</guid>
		<description><![CDATA[#include &#60;stdio.h&#62; float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main&#40;&#41;&#123;for&#40;;s%L&#124;&#124; &#40;h-=o,T= -2&#41;,s;4 -&#40;r=O*O&#41;&#60;&#40;l=I*I&#41;&#124;++_==L&#38;&#38;write&#40;1,&#40;--s%L?_&#60;L?--_ %6:6:7&#41;+&#34;123456 \n&#34;,1&#41;&#38;&#38;&#40;O=I=l=_=r=0,T+=o/2&#41;&#41;O=I*2*O+h,I=l+T-r;&#125; Wem so etwas Spa&#223; macht, sollte einfach mal das Unmaintainable Code Howto von Roedy Green anschauen. &#196;hnliche Artikel:Arithmetik ohne Begrenzungen Statische Codeanalyse mit Uno The Code Linux


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno' rel='bookmark' title='Statische Codeanalyse mit Uno'>Statische Codeanalyse mit Uno</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #993333;">float</span> o<span style="color: #339933;">=</span><span style="color:#800080;">0.075</span><span style="color: #339933;">,</span>h<span style="color: #339933;">=</span><span style="color:#800080;">1.5</span><span style="color: #339933;">,</span>T<span style="color: #339933;">,</span>r<span style="color: #339933;">,</span>O<span style="color: #339933;">,</span>l<span style="color: #339933;">,</span>I<span style="color: #339933;">;</span>int _<span style="color: #339933;">,</span>L<span style="color: #339933;">=</span><span style="color: #0000dd;">80</span><span style="color: #339933;">,</span>s<span style="color: #339933;">=</span><span style="color: #0000dd;">3200</span><span style="color: #339933;">;</span>main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span>s<span style="color: #339933;">%</span>L<span style="color: #339933;">||</span>
<span style="color: #009900;">&#40;</span>h<span style="color: #339933;">-=</span>o<span style="color: #339933;">,</span>T<span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>s<span style="color: #339933;">;</span><span style="color: #0000dd;">4</span> <span style="color: #339933;">-</span><span style="color: #009900;">&#40;</span>r<span style="color: #339933;">=</span>O<span style="color: #339933;">*</span>O<span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span><span style="color: #009900;">&#40;</span>l<span style="color: #339933;">=</span>I<span style="color: #339933;">*</span>I<span style="color: #009900;">&#41;</span><span style="color: #339933;">|++</span>_<span style="color: #339933;">==</span>L<span style="color: #339933;">&amp;&amp;</span>write<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">--</span>s<span style="color: #339933;">%</span>L<span style="color: #339933;">?</span>_<span style="color: #339933;">&lt;</span>L<span style="color: #339933;">?--</span>_
<span style="color: #339933;">%</span><span style="color:#800080;">6</span><span style="color: #339933;">:</span><span style="color: #0000dd;">6</span><span style="color: #339933;">:</span><span style="color: #0000dd;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #ff0000;">&quot;123456 <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;&amp;</span><span style="color: #009900;">&#40;</span>O<span style="color: #339933;">=</span>I<span style="color: #339933;">=</span>l<span style="color: #339933;">=</span>_<span style="color: #339933;">=</span>r<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>T<span style="color: #339933;">+=</span>o<span style="color: #339933;">/</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>O<span style="color: #339933;">=</span>I<span style="color: #339933;">*</span><span style="color: #0000dd;">2</span><span style="color: #339933;">*</span>O<span style="color: #339933;">+</span>h<span style="color: #339933;">,</span>I<span style="color: #339933;">=</span>l<span style="color: #339933;">+</span>T<span style="color: #339933;">-</span>r<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>Wem so etwas Spa&#223; macht, sollte einfach mal das <a href="http://mindprod.com/jgloss/unmain.html">Unmaintainable Code Howto von Roedy Green</a> anschauen.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno' rel='bookmark' title='Statische Codeanalyse mit Uno'>Statische Codeanalyse mit Uno</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2005/12/unmaintainable-code/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free Pascal lebt</title>
		<link>http://www.datenkobold.de/weblog/2005/05/free-pascal-lebt</link>
		<comments>http://www.datenkobold.de/weblog/2005/05/free-pascal-lebt#comments</comments>
		<pubDate>Tue, 17 May 2005 13:26:00 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Compiler]]></category>
		<category><![CDATA[Pascal]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=171</guid>
		<description><![CDATA[Nach 5 Jahren Entwicklungsarbeit wurde jetzt Free Pascal 2.0 ver&#246;ffentlicht. Free Pascal ist ein zu Turbo Pascal und Delphi kompatibler Compiler f&#252;r Pascal und seine objektorientierten Erweiterungen. Als Entwicklungsumgebung kann man zum Beispiel Lazarus benutzen. &#196;hnliche Artikel:Speicheroptimierung mit pahole


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole' rel='bookmark' title='Speicheroptimierung mit pahole'>Speicheroptimierung mit pahole</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Nach 5 Jahren Entwicklungsarbeit wurde jetzt <a href="http://www.freepascal.org/">Free Pascal 2.0</a> ver&#246;ffentlicht. Free Pascal ist ein zu Turbo Pascal und Delphi kompatibler Compiler f&#252;r Pascal und seine objektorientierten Erweiterungen. Als Entwicklungsumgebung kann man zum Beispiel <a href="http://www.lazarus.freepascal.org/">Lazarus</a> benutzen. </p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole' rel='bookmark' title='Speicheroptimierung mit pahole'>Speicheroptimierung mit pahole</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2005/05/free-pascal-lebt/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Primzahlen</title>
		<link>http://www.datenkobold.de/weblog/2005/04/primzahlen</link>
		<comments>http://www.datenkobold.de/weblog/2005/04/primzahlen#comments</comments>
		<pubDate>Thu, 28 Apr 2005 07:32:33 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Mathematik]]></category>
		<category><![CDATA[Primzahlen]]></category>
		<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=139</guid>
		<description><![CDATA[Eins ist keine, zwei ist, drei auch, vier nicht, f&#252;nf wieder … insgesamt gibt es unendlich viele und sie sind &#252;berall. Wer mehr &#252;ber Primzahlen herausfinden will, sollte einfach mal The Prime Pages besuchen. Diese Seite ist zwar auch von unheimlich vielen anderen Seiten verlinkt, aber nur weil sie wirklich interessant und gut gemacht ist. [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2005/07/nachbetrachtungen-zur-wissenschaftsnacht-dresden' rel='bookmark' title='Nachbetrachtungen zur Wissenschaftsnacht Dresden'>Nachbetrachtungen zur Wissenschaftsnacht Dresden</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/03/computergrafik' rel='bookmark' title='Computergrafik'>Computergrafik</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno' rel='bookmark' title='Statische Codeanalyse mit Uno'>Statische Codeanalyse mit Uno</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Eins ist keine, zwei ist, drei auch, vier nicht, f&#252;nf wieder … insgesamt gibt es unendlich viele und sie sind &#252;berall. Wer mehr &#252;ber Primzahlen herausfinden will, sollte einfach mal <a href="http://primes.utm.edu/">The Prime Pages</a> besuchen. Diese Seite ist zwar auch von unheimlich vielen anderen Seiten verlinkt, aber nur weil sie wirklich interessant und gut gemacht ist. Neben der guten Darstellung und Zusammenfassung von Primzahlentest ist auch der Kuriosit&#228;tenbereich der Seite ganz interessant. Just visit! </p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2005/07/nachbetrachtungen-zur-wissenschaftsnacht-dresden' rel='bookmark' title='Nachbetrachtungen zur Wissenschaftsnacht Dresden'>Nachbetrachtungen zur Wissenschaftsnacht Dresden</a></li>
<li><a href='http://www.datenkobold.de/weblog/2005/03/computergrafik' rel='bookmark' title='Computergrafik'>Computergrafik</a></li>
<li><a href='http://www.datenkobold.de/weblog/2006/12/statische-codeanalyse-mit-uno' rel='bookmark' title='Statische Codeanalyse mit Uno'>Statische Codeanalyse mit Uno</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2005/04/primzahlen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

