<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.191.213.106</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.191.213.106"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/178.191.213.106"/>
	<updated>2026-04-10T21:47:28Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Libraries&amp;diff=59635</id>
		<title>Libraries</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Libraries&amp;diff=59635"/>
		<updated>2011-08-19T20:32:46Z</updated>

		<summary type="html">&lt;p&gt;178.191.213.106: /* Bestehende Libraries */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dies soll ein Beitrag zum Erstellen und Benutzen von Libraries mit den Tools rund um GCC werden. Da das Erstellen von Libraries relativ plattformunabhängig ist, werde ich die &#039;native-tools&#039;, sprich gcc, ar, ld etc. ohne Target-Prefix (avr-/arm-elf-/...) erwähnen.&lt;br /&gt;
Wenn ihr Verbesserungen und/oder Korrekturen kennt, dann fügt sie doch bitte gleich in den Artikel ein.&lt;br /&gt;
&lt;br /&gt;
= Was ist eine &#039;Library&#039; =&lt;br /&gt;
&lt;br /&gt;
Eine Library (Bibliothek) ist eine Ansammlung von Funktionen, die bereits in kompilierter Form vorliegen.&lt;br /&gt;
Sie besteht aus zwei Teilen: dem Archiv und dem Interface in Form von Headern.&lt;br /&gt;
Ohne Header ist eine Library nicht verwendbar, da die Deklarationen (und damit das Interface) fehlen.&lt;br /&gt;
Es gibt verschiedene Arten von Libraries: statische, dynamische und &#039;shared&#039;.&lt;br /&gt;
&lt;br /&gt;
In diesem Artikel soll vorerst nur auf statische Libraries für den C-Compiler eingegangen werden.&lt;br /&gt;
In der Regel enden sie auf die Dateinamenerweiterung &#039;.a&#039;.&lt;br /&gt;
&lt;br /&gt;
= Bestehende Libraries =&lt;br /&gt;
* [http://www.amelek.gda.pl/avr/libc/avr-libc-reference.html AVR libc function reference] Beschreibung der in AVR-GCC enthaltenden Bilbiotheken&lt;br /&gt;
* [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon AVRlib] AVRlib is a library of easy-to-use C functions for a variety of common and uncommon tasks using AVR processors&lt;br /&gt;
&lt;br /&gt;
= Organisation =&lt;br /&gt;
&lt;br /&gt;
Beim Erstellen einer Library sind einige Punkte zu beachten:&lt;br /&gt;
&lt;br /&gt;
* strikte/saubere Trennung von Codedefinition und -Deklaration bei Schnittstellen&lt;br /&gt;
* eindeutige Namensgebung bei Sourcefiles (bsp.: &#039;up()&#039; gehört nicht in &#039;down.c&#039;)&lt;br /&gt;
* Optionale Funktionen in eigene Sourcefiles auslagern (Linker!)&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Damit der Linker später möglichst kleine Binaries erzeugen kann, sollten alle Funktionen, die nicht unmittelbar verheiratet sind, in eigene Sourcefiles ausgelagert werden.&lt;br /&gt;
Der Linker kann später nur die Objekte aus dem Binary rauslassen, wenn auch wirklich keine der Funktionen in diesen Objekten verwendet wird!&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 libmylibfunc1.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;quot;mylib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
libmylibfunc1(unsigned char cParam)&lt;br /&gt;
{&lt;br /&gt;
  int rVal = 0;&lt;br /&gt;
&lt;br /&gt;
  rVal = (int)((unsigned int) cParam);&lt;br /&gt;
  return rVal;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 libmylibfuncs.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;quot;mylib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
libmylibfunc2(void)&lt;br /&gt;
{&lt;br /&gt;
  for(;;)&lt;br /&gt;
    ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
libmylibfunc3(void)&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;called...\n&amp;quot;);&lt;br /&gt;
  libmylibfunc2();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mylib.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int libmylibfunc1(unsigned char);&lt;br /&gt;
void libmylibfunc2(void);&lt;br /&gt;
void libmylibfunc3(void);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei diesem Beispiel kann der Linker, je nach Verwendung, entscheiden, ob &#039;libmylibfunc1&#039;, &#039;libmylibfunc2&#039; _und_ &#039;libmylibfunc3&#039; oder keine der Funktionen im späteren Binary existieren.&lt;br /&gt;
Wird &#039;libmylibfunc1&#039; als einzige verwendet, so ist auch nur diese Funktion im späteren Binary vorhanden.&lt;br /&gt;
Wird aber nur eine der beiden Funktionen aus libmylibfuncs.c verwendet, sind später _beide_ im Binary vorhanden! Das liegt daran, daß der Linker nur auf Objektebene selektieren kann.&lt;br /&gt;
&lt;br /&gt;
= Compileraufruf =&lt;br /&gt;
&lt;br /&gt;
Da eine Library lediglich kompiliert und assembliert, aber nicht gelinkt werden soll, muss das beim Compileraufruf berücksichtigt werden. Der Kommandozeilenschalter dafür ist &#039;-c&#039;.&lt;br /&gt;
&lt;br /&gt;
 $ gcc -c -ggdb -O2 -o libmylibfunc1.o libmylibfunc1.c&lt;br /&gt;
&lt;br /&gt;
= Archiv erstellen =&lt;br /&gt;
&lt;br /&gt;
Das Archivierungsprogramm &#039;ar&#039; wird dazu verwendet, um die kompilierten Objektfiles zu einer Library zusammen zu fügen.&lt;br /&gt;
&lt;br /&gt;
 $ ar -rcs libmylib.a libmylibfunc1.o libmylibfuncs.o&lt;br /&gt;
&lt;br /&gt;
Den Inhalt der frisch erzeugten Library kann man sich Beispielsweise mit &#039;nm&#039; anzeigen lassen:&lt;br /&gt;
&lt;br /&gt;
 $ nm -s libmylib.a&lt;br /&gt;
&lt;br /&gt;
= Fertige Library =&lt;br /&gt;
&lt;br /&gt;
Es existieren jetzt zwei Dateien, die zum Export der Library benötigt werden:&lt;br /&gt;
&lt;br /&gt;
# &#039;mylib.h&#039;, in der das Interface &amp;quot;Dokumentiert&amp;quot; ist.&lt;br /&gt;
# &#039;libmylib.a&#039;, die Library selber, in Kompilierter Form.&lt;br /&gt;
&lt;br /&gt;
= Verwenden =&lt;br /&gt;
&lt;br /&gt;
Hat man die Library jetzt in seinem Projektordner vorliegen, dann kann man (Beispielsweise) die Funktionen im Sourcecode verwenden:&lt;br /&gt;
&lt;br /&gt;
 main.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;mylib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main(void)&lt;br /&gt;
{&lt;br /&gt;
  return libmylibfunc1(&#039;A&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kompilieren und linken mit:&lt;br /&gt;
&lt;br /&gt;
 $ gcc -ggdb -O2 -o projekt.elf main.c -Wl,-Map=projekt.map,--cref -L. -lmylib&lt;br /&gt;
&lt;br /&gt;
Erklärungen:&lt;br /&gt;
&lt;br /&gt;
 -Wl,...&lt;br /&gt;
* Dieser Kommandozeilenschalter sagt gcc, daß alles nachfolgende an den Linker weitergereicht werden soll. Bei jedem Komma beginnt eine neue Option.&lt;br /&gt;
 -L.&lt;br /&gt;
* ...erweitert den Librarysuchpfad um das aktuelle Verzeichnis&lt;br /&gt;
 -lmylib&lt;br /&gt;
* ...sagt dem Linker, daß er die Library &#039;libmylib.a&#039; beim Linken verwenden soll (alle Libraries haben das Prefix &#039;lib&#039;, welches hier nicht angegeben werden darf!)&lt;br /&gt;
&lt;br /&gt;
In der Datei &#039;projekt.map&#039; kann man sich jetzt Beispielsweise anschauen, welche Objektfiles der libmylib.a wirklich hinzugefügt wurden.&lt;br /&gt;
In unserem Beispiel ist lediglich das Objektfile &#039;libmylibfunc1.o&#039; vorhanden. Wenn ihr jetzt ausprobieren wollt, was mit &#039;libmylibfuncs.o&#039; passiert, dann müsst ihr im &#039;main.c&#039; lediglich eine der Funktionen aus &#039;libmylibfuncs.c&#039; verwenden und das &#039;projekt.elf&#039; neu übersetzen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C]]&lt;/div&gt;</summary>
		<author><name>178.191.213.106</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=59634</id>
		<title>AVR-GCC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-GCC&amp;diff=59634"/>
		<updated>2011-08-19T20:32:04Z</updated>

		<summary type="html">&lt;p&gt;178.191.213.106: /* Bibliotheken / Libraries */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
AVR-GCC ist ein kostenloser [[C]]-Cross-[[Compiler]] für [[AVR]]-[[Mikrocontroller]].&lt;br /&gt;
&lt;br /&gt;
AVR-GCC kann von der Leistungsfähigkeit her mit kommerziellen [[Compiler]]n gut mithalten. Sogar C++-Programme sind möglich, in der aktuellen Fassung wird C++ jedoch nur eingeschränkt unterstützt (Stand 6/2007).&lt;br /&gt;
&lt;br /&gt;
== Bestandteile ==&lt;br /&gt;
&lt;br /&gt;
Die Toolchain (Werkzeugsammlung) besteht aus mehreren Kommandozeilen-Programmen, die sich auf einfache Weise in einen Editor oder eine Entwicklungsumgebung einbinden lassen (typischerweise als Aufrufe von make mit Parameter, vgl. [[AVR-GCC-Tutorial]]). &lt;br /&gt;
&lt;br /&gt;
Die Bestandteile im einzelnen:&lt;br /&gt;
* Binutils: Assembler, Linker und weitere Hilfsprogramme.&lt;br /&gt;
* GCC: Der eigentliche C(++)-Compiler.&lt;br /&gt;
* AVR-LIBC: Die C-Standardbibliothek mit AVR-spezifischen Headerdateien und Funktionen.&lt;br /&gt;
* ([[AVRDUDE]]: universelle AVR-Programmiersoftware, kein eigentlicher Teil der Toolchain, aber oft verwendet)&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Linux/Unix ===&lt;br /&gt;
&lt;br /&gt;
Wenn keine aktuelle AVR-GCC-Version als Paket für die verwendete Distribution zur Verfügung steht, dann können sich [[Unix]]/[[Linux]]-Nutzer den Sourcecode herunterladen und selbst kompilieren. Schritt-für-Schritt-Anleitungen gibt es [http://www.nongnu.org/avr-libc/user-manual/install_tools.html hier] und [http://www.roboternetz.de/wissen/index.php/Avr-gcc_und_avrdude_installieren hier].&lt;br /&gt;
&lt;br /&gt;
Das [http://www.femtoos.org FemtoOS]-Paket beinhaltet Scripte zum automatischen Herunterladen und Bauen einer aktuellen AVR-GCC Version.&lt;br /&gt;
&lt;br /&gt;
Empfehlenswert ist auch [http://cdk4avr.sf.net CDK4AVR], das die entsprechenden tools als einfach installierbare Linux-Pakete bereitstellt (distributionsunabhängig als .tar.gz). Leider ist das Projekt schon etwas älter, im [http://www.mikrocontroller.net/topic/130972 Forum] findet sich ein Beitrag, aktuellere Sourcen mit den entsprechenden Patches zu versehen und zu kompilieren. Patches zu den Binutils und GCC Sourcen sind unumgänglich, da die offiziellen Sourcen aufgrund des Umfangs an Prozessortargets den aktuellsten Entwicklungen hinterherhinken und damit bereits bekannte Fehler eventuell noch nicht behoben sind. Weitere Tipps zur AVR Programmierung unter Linux stehen im Artikel [[AVR und Linux]].&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
Die beste fertige Toolchain ist das [http://www.obdev.at/crosspack/ Crosspack]. Dieses enthält auch die avr-libc, avrdude und avarice. Leider gab es bei Mac OS 10.5.6 eine tiefgreifende Änderung beim fork()-Systemcall, der bewirkt, dass avarice mit JTAGICE mkII und Dragon nicht funktioniert. Geräte mit Serial-USB-Konvertern (AVRISP clones etc) funktionieren dagegen problemlos. &lt;br /&gt;
&lt;br /&gt;
Wer die Toolchain von Hand bauen möchte kann das natürlich auch tun, dazu einfach den unter &amp;quot;Linux/Unix&amp;quot; verlinkten Anleitungen folgen. Unter [[Mac OS X]] muss man dazu zuerst die [http://developer.apple.com/Tools/ Apple Developer Tools] installieren.&lt;br /&gt;
&lt;br /&gt;
Teile der Toolchain (avr-libc und avrdude) kann man mit dem Paketsystem [http://www.macports.org/ MacPorts] installieren. Die Compiler-Toolchain kann man dann installieren, indem man folgenden Befehl im Terminal eingibt:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avr-libc&lt;br /&gt;
&lt;br /&gt;
Das Programmiertool avrdude bekommt man genauso:&lt;br /&gt;
&lt;br /&gt;
 sudo port install avrdude&lt;br /&gt;
&lt;br /&gt;
Weblinks:&lt;br /&gt;
&lt;br /&gt;
* [http://tinkerlog.com/2007/09/29/programming-avr-with-a-macbook/ Programming AVR with a MacBook] (engl.)&lt;br /&gt;
* [http://www.ladyada.net/library/avrdevtut/setup-mac.html AVR Tutorial from Lady Ada] (engl.)&lt;br /&gt;
* [http://www.obdev.at/crosspack/ Crosspack]&lt;br /&gt;
* [http://www.digithink.com/OSX-AVR OSX-AVR (nicht mehr aktuell)]&lt;br /&gt;
* [http://www.definefalsetrue.com/index.php/Mac-OS-X/bootfeedx.html BootFeedX Bootloaderfrontend]&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Für MS-Windows gibt es das fertig kompilierte Softwarepaket [[WinAVR]].&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebungen ==&lt;br /&gt;
&lt;br /&gt;
Win32:&lt;br /&gt;
* [[AVR-Studio]]: ab Version 4.12 mit WinAVR-Unterstützung, integrierter Simulator, Debugger, rudimentäre Projektverwaltung&lt;br /&gt;
* Programmers-Notepad: wird bei [[WinAVR]] mitgeliefert, ein guter Editor mit einer rudimentären Projektverwaltung&lt;br /&gt;
* [http://www.myavr.info/download/benutzerhandbuch_sisy_avr.pdf SiSy-AVR]: ein CASE-Tool mit WinAVR-Unterstützung, das eine Entwicklungsumgebung bereitstellt.&lt;br /&gt;
&lt;br /&gt;
Platformunabhängig:&lt;br /&gt;
* [http://www.eclipse.org/ Eclipse] mit CDT und dem [http://avr-eclipse.sourceforge.net/index.html AVR Eclipse Plugin]&lt;br /&gt;
* [[Code::Blocks]]: vielseitige, freie Entwicklungsumgebung für Windows und Linux&lt;br /&gt;
* [http://www.netbeans.org/ Netbeans] in der C++ - Version mit [[WinAVR]] oder [[avr-gcc]] als Toolchain&lt;br /&gt;
&lt;br /&gt;
== Bibliotheken / Libraries ==&lt;br /&gt;
&lt;br /&gt;
Die [http://www.nongnu.org/avr-libc/ avr-libc] ist die gebräuchliche &amp;quot;Laufzeitbibliothek&amp;quot; zum avr-gcc C-Compiler, welche den Zugriff auf die AVR-Hardware erheblich erleichtert. Die offizielle Dokumentation zur avr-libc mit vielen Hinweisen auch zum Compiler avr-gcc und verschiedener Tools (z.&amp;amp;nbsp;B. [[AVRDUDE]]) findet man [http://www.nongnu.org/avr-libc/user-manual/index.html hier].&lt;br /&gt;
&lt;br /&gt;
Auch die [http://www.procyonengineering.com/embedded/avr/avrlib/ Procyon AVRlib] enthält nützlichen Code z.&amp;amp;nbsp;B. für UART, LCD,.... Bei der Procyon AVRlib ist die Lizenz zu beachten (in Kurzform: man muss dritten auf Verlangen den gesamten Quellcode der Firmware zur Verfügung stellen, falls Teile der Procyon Bibliothek genutzt werden).&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf interne Funktionen oder externe Peripherie existieren einige fertige Komponenten. Z.B. &amp;quot;Projects&amp;quot;-Bereich von [http://www.avrfreaks.net/ avrfreaks.net] (Anmeldung erforderlich (kostenlos)). &lt;br /&gt;
&lt;br /&gt;
Die Erstellung eigener Bibliotheken ist im Artikel  [[Libraries]] erklärt.&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
&lt;br /&gt;
Eine (hoffentlich wachsende) Liste mit einigen Hinweisen:&lt;br /&gt;
&lt;br /&gt;
* Keine &amp;quot;antiken&amp;quot; Versionen verwenden. Für MS-Windows-Nutzer: aktuelles WinAVR installieren. Für Linux/Unix-Nutzer: letzte stabile Version selbst kompilieren oder aus &amp;quot;Distribution-Packages&amp;quot; installieren (z.&amp;amp;nbsp;B. [http://cdk4avr.sourceforge.net/ cdk4avr]).&lt;br /&gt;
&lt;br /&gt;
* Bei Problemen zuerst in die &#039;&#039;&#039;[http://www.nongnu.org/avr-libc/user-manual/index.html Anleitung] der avr-libc&#039;&#039;&#039; schauen. Insbesondere die FAQ lesen.&lt;br /&gt;
&lt;br /&gt;
* Sicherstellen, dass der MCU-Parameter (zum Compiler/Linker, meist im Makefile defniert) mit dem Zielprozessor übereinstimmt.&lt;br /&gt;
&lt;br /&gt;
* [[AVR-GCC-Tutorial]] in diesem Wiki lesen.&lt;br /&gt;
&lt;br /&gt;
* Im Zweifel &#039;&#039;&#039;nicht INTERRUPT(...) sondern SIGNAL(...)&#039;&#039;&#039; nutzen. In neueren Versionen der avr-libc wurde &#039;&#039;&#039;ISR&#039;&#039;&#039; als Ersatz für SIGNAL eingeführt und sollte genutzt werden (SIGNAL und INTERRUPT werden langfristig entfallen). Darauf achten, dass die Vektor- bzw. Signal-Namen (&amp;quot;Parameter&amp;quot;) zu ISR bzw. SIGNAL (und INTERRUPT wenn denn unbedingt erforderlich) richtig geschrieben sind. Die Namen sind in der in der entsprechenden Header-Datei (ioxxx.h) für den Controller und der avr-libc-Dokumenation aufgelistet. Im Zweifel den erzeugten Interrupt-Vektor im Assembler-Listing prüfen, es darf &#039;&#039;&#039;kein&#039;&#039;&#039; SIG_&#039;&#039;xxx&#039;&#039; oder xxx_vect mehr zu sehen sein, sondern _vector_&#039;&#039;N&#039;&#039; (wobei &#039;&#039;N&#039;&#039; eine Zahl ist). Neuere Versionen der avr-gcc zeigen eine Warnung, falls etwas falsch geschrieben wurde, ältere Versionen nicht.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Zugriff auf Daten(-Tabellen) im Programmspeicher&#039;&#039;&#039; (Flash) erfolgt über Program-Space-Funktionen (pgm_read*). Lediglich die Definition einer Variablen/eines Feldes mit dem PROGMEM Attribut zu versehen, reicht (im Gegensatz zu Codevision, IAR, Imagecraft) nicht aus.&lt;br /&gt;
&lt;br /&gt;
* Nicht alle AVRs werden vollständig von der avr-libc bzw. dem Compiler unterstützt. Bei Problemen hilft oft ein Blick in den erzeugten Assembler-Code. Die Anzahl der unterstützen Controller steigt jedoch mit Version zu Version von binutils, avr-libc und avrdude. Evtl. reicht einfach ein Update auf neuere Software-Versionen (z.&amp;amp;nbsp;B. im jeweils aktuellen WinAVR-Packet).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;inp(), outp(), sbi() und cbi()&#039;&#039;&#039; werden in der aktuellen Bibliotheksversion nicht offiziell unterstützt (man muss eine spezielle Header-Datei einbinden(deprecated.h). Es wird schon seit längerem empfohlen, diese Makros nicht mehr zu nutzen. Einige Anleitungen sind in diesem Punkt veraltet. Mit halbwegs aktuellen avr-gcc/avr-libc-Versionen kann einfach z.&amp;amp;nbsp;B. DDRB=0xfe bzw. foo=PINB geschrieben werden.  Mit PORTB |= _BV(1) setzt man PORTB.1, mit PORTB &amp;amp;= ~_BV(1) löscht man es wieder, mit PORTB ^= _BV(1) kann man es umschalten (_BV(x) entspricht dabei (1&amp;lt;&amp;lt;x)). Die ersten beiden Varianten erzeugen bei eingeschalteter Optimierung und passenden Parametern (wie hier im Beispiel Register im &amp;quot;unteren&amp;quot; Speicherbereich) die SBI bzw. CBI Prozessorbefehle.&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool &#039;&#039;&#039;avr-nm&#039;&#039;&#039; erhält man eine Übersicht über die Platzausnutzung in der erzeugten ELF-Datei bzw. dem damit gefüllten AVR. Das Tool wird per Kommandozeile mit &lt;br /&gt;
::&amp;lt;pre&amp;gt;avr-nm --size-sort --print-size -r -td &amp;lt;your_ELF_file&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
:aufgerufen. Alle Symbole mit einem &amp;quot;T&amp;quot; (globale Funktionen), &amp;quot;t&amp;quot; (lokale Funktionen) und letztlich auch mit einem &amp;quot;D&amp;quot; oder &amp;quot;d&amp;quot; (globale bzw. lokale Daten mit Initialisierungswerten im ROM) betreffen das FLASH-ROM.  &amp;quot;B&amp;quot; und &amp;quot;b&amp;quot; brauchen ausschließlich RAM (werden beim Start mit 0 initialisiert). Die erste Spalte ist die Adresse des Symbols, die zweite ist die Größe . (vgl. [http://www.mikrocontroller.net/topic/59960#467920 Forenbeitrag] von Jörg Wunsch)&lt;br /&gt;
&lt;br /&gt;
* Mit dem Tool &#039;&#039;&#039;avr-size&#039;&#039;&#039; erhält man eine Übersicht über den Platzbedarf in den text, data und bss Sektionen innerhalb der ELF Binärdatei. Die Sektionen text und data benötigen Platz im FLASH-ROM und die Sektionen data und bss benötigen zur Laufzeit Platz im SRAM.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [[AVR-GCC-Codeoptimierung]]&lt;br /&gt;
* [[GCC: unbenutzte Funktionen entfernen]]&lt;br /&gt;
* [http://www.roboternetz.de/wissen/index.php/Avr-gcc/Interna AVR-GCC Interna]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://winavr.sourceforge.net/install_config_WinAVR.pdf Tutorial von C. O&#039;Flynn und E. Weddington] Einstieg in die Nutzung des avr-gcc unter MS-Windows mit WinAVR (englisch)&lt;br /&gt;
* [http://www.linuxfocus.org/Deutsch/November2004/article352.shtml AVR-GCC und Linux]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/list-2-1.html GCC-Forum auf mikrocontroller.net]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Category:Compiler]]&lt;br /&gt;
[[Kategorie:avr-gcc| ]]&lt;/div&gt;</summary>
		<author><name>178.191.213.106</name></author>
	</entry>
</feed>