{"id":5109,"date":"2023-04-15T20:04:57","date_gmt":"2023-04-15T19:04:57","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=5109"},"modified":"2025-07-12T09:03:33","modified_gmt":"2025-07-12T08:03:33","slug":"avr-gcc-12-fur-linux-installieren-compilieren","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=5109","title":{"rendered":"AVR-GCC 15 f\u00fcr Linux installieren \/ compilieren"},"content":{"rendered":"<p>Es gibt bereits eine sehr gute Anleitung f\u00fcr das Installieren vom avr-gcc [1] [2] ..., aber sie sind veraltet. Ich werde im folgenden nur das beste von diesen Artikel \u00fcbernehmen.<\/p>\n<p><a href=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2023\/04\/illustration.gif\" rel=\"attachment wp-att-5112\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2023\/04\/illustration.gif\" alt=\"illustration\" width=\"208\" height=\"148\" class=\"alignnone size-full wp-image-5112\" \/><\/a><\/p>\n<p><em>Zusammenfassung<\/em>:<\/p>\n<p>Der AVR 8-Bit RISC Mikrocontroller von Atmel ist ein sehr verbreiteter Mikrocontroller. Es ist nur ein Chip mit EEPROM, RAM, Analog zu Digital Umwandler, einer Menge digitaler Ein- und Ausgabezeilen, Timern, UART f\u00fcr RS 232 Kommunikation und vielen anderen Dingen. <\/p>\n<p>Das beste ist jedoch, dass es daf\u00fcr unter Linux eine vollst\u00e4ndige Programmierumgebung gibt: Man kann diesen Mikrocontroller in C++ programmieren, mit dem GCC Compiler. <\/p>\n<p>Die Anleitung ist in mehrere Teile gegliedert. Im ersten Teil wird die Installation erkl\u00e4rt. IM zweiten ein kleines Testprojekt. Im dritten wird gezeigt, wie man damit denn nun seine Programme f\u00fcr den AVR erstellt. Im vierten Teil stehen noch ein paar typische Fehlermeldungen und die L\u00f6sungen. Und im letzten ein paar weiterf\u00fchrende Links.<\/p>\n<h1>Fertige Pakete<\/h1>\n<p>Leider gibt es zu diesem Zeitpunkt (04.2023) keine aktuellen AVR GCC Pakete in den Repositories der Distributionen. Es f\u00fchrt also kein Weg am compilieren vorbei. Wenn die Repositories aktualisiert werden, werde ich das hier vermerken.<br \/>\nAusnahme bildet das Paket avrdude, dass mit Version 6.3 (2016, Debian 11 bullseye) zwar auch schon etwas \u00e4lter ist, aber dennoch wird es funktionieren. In der n\u00e4chsten Debian Version, welche wahrscheinlich im Juni 2023 ver\u00f6ffentlicht wird, ist ein aktuelleres avrdude mit der Version 7.1 dabei. Auf er github Seite von avrdude [7] gibt es Informationen, wie man jetzt schon die neuste Version bekommt.<\/p>\n<p>Avrdude l\u00e4sst sich mit dem folgenden Befehl aus den Repositories installieren:<br \/>\n<code><br \/>\n# apt-get install avrdude<br \/>\n<\/code><\/p>\n<h1>Eure Voraussetzungen<\/h1>\n<p>Ihr m\u00fcsst grunds\u00e4tzliche Linux Kenntnisse mitbringen und den Willen sich durch die Anleitung durch zu bei\u00dfen. Es kann an der ein oder andere Stelle Probleme geben, dann Ruhe bewahren und meist findet man die einfache L\u00f6sung schnell von selbst.<\/p>\n<h1>AVR GCC compilieren<\/h1>\n<p>Also los. Wir brauchen folgende Software: <\/p>\n<p>binutils<br \/>\n<a href=\"https:\/\/ftp.gnu.org\/gnu\/binutils\/binutils-2.44.tar.bz2\">binutils-2.44.tar.bz2<\/a><br \/>\noder<br \/>\n<a href=\"https:\/\/sourceware.org\/pub\/binutils\/releases\/binutils-2.44.tar.bz2\">binutils-2.44.tar.bz2<\/a><\/p>\n<p>GCC<br \/>\n<a href=\"https:\/\/ftp.fu-berlin.de\/unix\/languages\/gcc\/releases\/gcc-15.1.0\/gcc-15.1.0.tar.gz\">gcc-15.1.0.tar.gz<\/a><\/p>\n<p>avr libc<br \/>\n<a href=\"https:\/\/github.com\/avrdudes\/avr-libc\/releases\/download\/avr-libc-2_2_1-release\/avr-libc-2.2.1.tar.bz2\">avr-libc-2.2.1.tar.bz2<\/a><\/p>\n<p>Um m\u00f6glicherweise bestehende AVR GCC Installationen nicht zu \u00fcberschreiben, werden die Programme nach ~\/bin\/avrgcc-15 installiert.<\/p>\n<h2>Software Voraussetzungen<\/h2>\n<p>Um einem Compiler zu compilieren ist Voraussetzung, dass schon ein Compiler installiert ist - logisch.<br \/>\nWelche Pakete daf\u00fcr zu installieren sind, variiert etwas zwischen den unterschiedlichen Linux Distributionen. Aber f\u00fcr Debian basierte System ist es im wesentlichen das Paket build-essential sowie das Paket texinfo f\u00fcr binutils.<\/p>\n<p><code><br \/>\n# apt-get install build-essential texinfo<br \/>\n<\/code><\/p>\n<h2>binutils compilieren<\/h2>\n<p>Das binutils Paket enth\u00e4lt alle n\u00f6tigen low-level Utilities, um Objektdateien zu bauen. Es beinhaltet einen AVR assembler (avr-as), Linker (avr-ld), library handling tools (avr-ranlib, avr-ar), Programme, zum Erzeugen von Objektdateien, die auf das EEPROM des Microcontrollers (avr-objcopy) geladen werden k\u00f6nnen, disassembler (avr-objdump) und utilities wie avr-strip und avr-size. <\/p>\n<p>Und so wird's gemacht:<br \/>\n<code><br \/>\n$ tar xjf binutils-2.44.tar.bz2<br \/>\n$ cd binutils-2.44<br \/>\n$ mkdir build<br \/>\n$ cd build<br \/>\n$ ..\/configure --target=avr --disable-nls --prefix $HOME\/bin\/avrgcc-15<br \/>\n$ make -j 2<br \/>\n$ make install<br \/>\n<\/code><\/p>\n<p>Die Kompilation dauert etwa ein bis zwei Minuten. <\/p>\n<p>Die binutils ist nun in dem Verzeichnis $HOME\/bin\/avrgcc-15\/ installiert. Um sie auch aufrufen zu k\u00f6nnen, muss das Verzeichnis der PATH Umgebungsvariable hinzugef\u00fcgt werden. Dies geschieht mit folgenden Kommando:<\/p>\n<p><code><br \/>\n$ export PATH=$HOME\/bin\/avrgcc-15\/bin\/:$PATH<br \/>\n<\/code><\/p>\n<p>Nun testen wir, ob auch alles klappt. Mit dem Programm 'witch' wird \u00fcberpr\u00fcft ob eines der binutils Programme, genauer gesagt das Programm avr-objcopy, erreichbar ist.<\/p>\n<p><code><br \/>\n$ which -a avr-objcopy<br \/>\n\/home\/kater\/bin\/avrgcc-15\/bin\/avr-objcopy<br \/>\n\/usr\/bin\/avr-objcopy<br \/>\n<\/code><\/p>\n<p>Da ich zwei Installationen des avr gcc habe, eine alte Systeminstallation mit dem GCC 5 und die neue mit dem GCC 15, werden bei mir zwei Zeilen ausgegeben. Wichtig ist, dass die neue Installation, also der Path \/home\/kater\/bin\/avrgcc-15\/ ganz oben steht, denn dieser wird als erstes durchsucht.<br \/>\nUm das avrgcc Verzeichnis dauerhaft in der PATH Variablen zu seichern, tragt ihr die export Zeile an das Ende der .bashrc Datei ein, die sich im Homeverzeichnis befindet.<\/p>\n<h2>AVR GCC compilieren<\/h2>\n<p>avr-gcc ist unser eigentlicher Compiler. Diesen zu compilieren ist der aufwendigste Teil, da es am l\u00e4ngsten dauert und beim Compilieren am meisten schief gehen kann.<br \/>\nDie f\u00fcr den GCC notwendigen Pakete wie gmp, mpfr, mpc und isl m\u00fcssen nicht von Hand installiert werden. Dies kann durch das Skript contrib\/download_prerequisites erledigt werden. Am besten f\u00fchrt ihr folgende Befehle Schritt f\u00fcr Schritt aus und achtet auf m\u00f6gliche Fehlermeldungen die kommen k\u00f6nnten. Nicht einfach blind die Befehle copy&pasten!<\/p>\n<p><code><br \/>\n$ tar xzf gcc-15.1.0.tar.gz<br \/>\n$ cd gcc-15.1.0\/<br \/>\n$ .\/contrib\/download_prerequisites<br \/>\n$ mkdir build<br \/>\n$ cd build\/<br \/>\n$ ..\/configure --target=avr --disable-nls --enable-languages=c,c++ --disable-libssp  --with-double=64 --with-long-double=64 --prefix $HOME\/bin\/avrgcc-15\/<br \/>\n$ make -j 2<br \/>\n$ make install<br \/>\n<\/code><\/p>\n<p>Das Kompilieren hat bei mir etwa 35 Minuten gedauert. Genug Zeit um gem\u00fctlich den n\u00e4chsten Absatz zu lesen ;)<\/p>\n<p>Die Optionen von configure bedeuten folgendes<\/p>\n<li>--target=avr Wir wollen f\u00fcr die Zielplattform AVR compilieren -- logisch<\/li>\n<li>--disable-nls Native Language Support (NLS) brauchen wir nicht. Es ist sinnvoller die Compiler Meldungen auf englisch zu googlen, dann bekommt man schneller die passende Antwort.<\/li>\n<li>--enable-languages=c,c++ Unsere Zielsparache ist C++<\/li>\n<li>--disable-libssp libraries for stack smashing protection - Ist sicher einen gute Sache, auch auf einem AVR bestimmt wertvoll, ich mus mal nachschauen warum das in den anderen Anleitungen deaktiviert wurde...<\/li>\n<li>--prefix $HOME\/bin\/avrgcc-15\/ Der Compiler soll in der Homeverzeichnis nach bin\/avrgcc-15 installiert werden und nicht in die Systemverzeichnisse.<\/li>\n<li>--with-double=64 --with-long-double=64 Den Floatingpoint Typ (long)double mit 64bit compilieren und nicht mit 32.<\/li>\n<p>Der letzte Punkt bedarf etwas Erkl\u00e4rung. Wir alle wissen, dass (32\/64bit) Gleitkommaberechnungen auf einem 8bit Controller nicht unbedingt die beste Idee ist, da dies sehr viele Instruktionen erzeugt und der Speicherplatz sehr beschr\u00e4nkt ist. Es ist technisch m\u00f6glich, aber man will es in der Praxis vermeiden. Wahrscheinlich ist das der Grund, warum der double-precision Typ f\u00fcr AVR auch auf 32bit eingestellt ist, statt 64bit. Anders sieht das bei Berechnungen zur Kompilierzeit aus. Diese werden auf einem normalen Computer erledigt, der im Vergleich zum AVR unendlich viel Speicherplatz hat und auch millionenfach schneller ist. Seit C++11 mit constexpr k\u00f6nnen bequem in normalen Code Berechnungen zur Kompilierzeit ausgef\u00fchrt werden, es ist kein Gefummelt mit Makros mehr n\u00f6tig. Und die M\u00f6glichkeiten werden mit jeder neuen C++ Version stetig verbessert. Zum Beispiel gibt es in C++23 (GCC13) das Keyword \"consteval\" welches garantiert, dass eine Funktion nur zur Kompilierzeit ausgef\u00fchrt wird. Genau das Richtige f\u00fcr Mikrocontroller! Es spricht also nichts dagegen Berechnungen, die zur Kompilierzeit ausgef\u00fchrt werden, mit 64bit double zu berechnen. <\/p>\n<p>Hier ein Beispiel das Probleme mit 32bit double Typen aufzeigt: die UBRR Berechnung f\u00fcr den USART. Wie genau die Berechnung aussieht ist dabei egal, wichtig ist nur, dass die Eingangswerte, die CPU Frequenz (z.B 20000000Hz) und die Baudrate (z.B. 1000000), als 32bit integer vorliegen m\u00fcssen, da die Zahlen f\u00fcr 16bit Typen zu gro\u00df sind. Nun kann eine 32bit Ganzzahl nicht verlustfrei in eine 32bit Gleitzahl konvertiert werden, was in einer Warnung (oder Fehler je nach Einstellung) resultiert. F\u00fcr diesen Fall wissen wir, dass der Verlust an Ziffern kein Problem ist, da wir die m\u00f6glichen CPU Frequenz und Baud Rate kennen, aber wenn nicht mal dieses eine Beispiel zu 100% mit 32bit double funktioniert, wie soll das erst mit komplizierten Berechnungen funktionieren?!<\/p>\n<p>Aus diesem Grund habe ich double, wie gewohnt, auf 64bit eingestellt. Wenn man auf dem AVR unbedingt Gleitkommaberechnugen braucht, kann man den Typ float nutzen und alles ist wie immer. <\/p>\n<p>So, nach diesen Gedanken sollte die Kompilation fertig sein :)<\/p>\n<p>Zum Abschluss starte ich den Compiler und lasse mir die Versionsnummer ausgeben<\/p>\n<p><code><br \/>\n$ avr-gcc --version<br \/>\navr-gcc (GCC) 15.1.0<br \/>\n<\/code><\/p>\n<p>Weiter geht es mit der Installation der avr-libc<\/p>\n<h2>avr-libc compilieren<\/h2>\n<p>Die Compilation der avr-libc gestaltet sich \u00e4hnlich. Folgende Befehle sind auszuf\u00fchren:<\/p>\n<p><code><br \/>\n$ tar xjf avr-libc-2.2.1.tar.bz2<br \/>\n$ cd avr-libc-2.2.1\/<br \/>\n$ mkdir build<br \/>\n$ cd build\/<br \/>\n$ ..\/configure --build=`.\/config.guess` --host=avr --prefix=$HOME\/bin\/avrgcc-15\/<br \/>\n$ make -j 2<br \/>\n$ make install<br \/>\n<\/code><\/p>\n<p>Die Kompilation dauert etwa drei Minuten.<\/p>\n<p>Danach ist die Installation komplett und wir k\u00f6nnen mit dem Beispiel Projekt weiter machen.<\/p>\n<h1>Ein kleines Testprojekt<\/h1>\n<h2>Die Hardware<\/h2>\n<p>Wir beginnen mit einer kleinen Testschaltung, die du dann sp\u00e4ter erweitern kannst. Unser Testprogramm, so wie es hier dargestellt ist, bringt einfach eine LED zum Blinken. Man kann fertige Experimentierboards nutzen oder sich eine kleine Schaltung selbst zusammen l\u00f6ten. Das Beispiel ist f\u00fcr den ATmega8 geschrieben, kann aber leicht auf andere Typen angepasst werden.<\/p>\n<div id=\"attachment_5129\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2023\/04\/circuit.gif\" rel=\"attachment wp-att-5129\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-5129\" src=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2023\/04\/circuit-300x200.gif\" alt=\"Schaltplan und Pinbelegung\" width=\"300\" height=\"200\" class=\"size-medium wp-image-5129\" \/><\/a><p id=\"caption-attachment-5129\" class=\"wp-caption-text\">Schaltplan und Pinbelegung<\/p><\/div>\n<div id=\"attachment_5131\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2023\/04\/avrm8ledtest_circuit.jpg\" rel=\"attachment wp-att-5131\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-5131\" src=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2023\/04\/avrm8ledtest_circuit-300x286.jpg\" alt=\"Aufgebaute Schaltung\" width=\"300\" height=\"286\" class=\"size-medium wp-image-5131\" \/><\/a><p id=\"caption-attachment-5131\" class=\"wp-caption-text\">Aufgebaute Schaltung<\/p><\/div>\n<p>Ein externer Kristall an dem Mikrocontroller ist f\u00fcr dieses Beispiel nicht notwendig, da der eingebaute Oszillator benutzt wird der von Werk aus auf 1MHz eingestellt ist.<\/p>\n<h2>Die Software<\/h2>\n<p>Ein guter Start f\u00fcr die Programmierung von Mikrocontroller ist das AVR-GCC Tutorial [6] und, nat\u00fcrlich, das Datenblatt des verwendeten Kontrolles.<br \/>\nViel besser als alle Theorie ist ein richtiges Beispiel. Wir schreiben ein kleines Programm, das unsere LED blinken l\u00e4sst. Nicht sehr n\u00fctzlich, aber sehr gut f\u00fcr den Anfang.<br \/>\nIhr k\u00f6nne es hier runterladen: <a href=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2023\/04\/avrblink10zip.zip\"rel=\"\">avrblink10zip<\/a> Das zip enth\u00e4lt den folgenden Quelltext und eine Makefile.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/*\r\n * blink.cpp\r\n * ATmega8 mit 1 MHz\r\n * PORTB wird ueber ein Timer alle 0.263s ein- und ausgeschaltet. Das entspricht 3.81Hz\r\n *\r\n * Der Takt betr\u00e4gt 1Mhz. Der Timer Prescaler ist auf 1024 eingestellt und ein 8 Bit Timer\r\n * l\u00e4uft nach 256 Increments \u00fcber. Also\r\n * 1000000Hz \/ 1024 \/ 256 = 3.81Hz\r\n *\/\r\n\r\n#include &lt;avr\/io.h&gt;\r\n#include &lt;avr\/interrupt.h&gt;\r\n\r\n\/\/ Overflow Interrupt Routine von Timer 0\r\nISR(TIMER0_OVF_vect) {\r\n  \/\/ PORTB inventieren\r\n  PORTB =~ PORTB;\r\n}\r\n\r\nint main() {\r\n  \/\/ PORTB als Ausgang schalten\r\n  DDRB  = 0xFF;\r\n  \/\/ Alle Ausgaenge auf 0 schalten\r\n  PORTB = 0x00;\r\n\r\n  \/\/ Prescaler von Timer0 auf 1024 stellen\r\n  TCCR0 |= (1 &lt;&lt; CS02) | (1 &lt;&lt; CS00);\r\n  \/\/ Timer 0 Overflow Interrupt aktivieren\r\n  TIMSK  |= (1 &lt;&lt; TOIE0);\r\n\r\n  \/\/ Interrupts einschalten\r\n  sei();\r\n\r\n  \/\/ Endlosschleife. Hier ist kein weiterer Code n\u00f6tig.\r\n  \/\/ Das Ein und Ausschalten der LED geschiet in der Overflow Interrupt Routine\r\n  for(;;);\r\n}\r\n<\/pre>\n<p>Die reichlichen Kommentare im Quelltext kommentieren ihn hoffentlich ausreichend.<br \/>\nKommen wir zum Makefile. Ich hab es extra super super super einfach gehalten, da das Ziel dieses Artikel nicht ist, Makefiles zu schreiben, sondern schnell das Beispiel erfolgreich zu bestreiten.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nall:\r\n        avr-g++ -O1 -Wall -Wextra -Wconversion blink.cpp -mmcu=atmega8 -o blink.elf\r\n        avr-objcopy -O ihex blink.elf blink.hex\r\n\r\nload:\r\n        avrdude -p m8 -c avr911 -P \/dev\/ttyUSB0 -U flash:w:blink.hex:i\r\n\r\nclean:\r\n        rm -f *.o *.hex *.elf\r\n<\/pre>\n<p>Das Makefile besteht aus drei Targets \"all\", \"load\" und \"clean\". Zum compiliere des Quelltest, zum hochladen auf den Mikrocontroller und zum entfernen der compilat Datein. Die Angabe des Mikrocontroller Typs \"atmega8\" geschiet direkt mit der Compiler Option \"-mmcu\" und nicht \u00fcber eine extra Makefile Variable, um die Sache einfacher zu halten. Wenn das Projekt w\u00e4chst kann das Makefile entsprechend erweitert werden. <strong>Achtet unbedingt achten, da\u00df die Einr\u00fcckungen im Makefile explizit durch TABs erfolgen und nicht durch Leerzeichen!<\/strong> Das ist nervig, aber das ist nunmal so...<\/p>\n<p>Die Optionen \"-Wall -Wextra -Wconversion\" schalten viele Warnings ein. Auch solche die Anzeigen wenn einen implizite conversion statt findet. Also z.B. 16bit auf 8bit Integer was auf einem 8Bit Mikrocontroller nicht unbedingt das ist, was man eigentlich programmieren wollte. So kann man viele Stellen finden die m\u00f6glicherweise Fehler enthalten und potentiell ein paar Instrutionen sparen. Denn das Debuggen auf einem Mikrocontroller ist schwer bis garnicht m\u00f6glich.<\/p>\n<h1>Allgemeine Fehlermeldungen<\/h1>\n<p>Fehlermeldungen sollten eigentlich keine vorkommen. Wenn doch, vergewissert euch, dass ihr euch genau an die Anleitung gehalten und nichts falsch abgeschrieben habt!<\/p>\n<p>Hier ein paar typische Fehlermeldungen und ihr L\u00f6sungen: <\/p>\n<p><strong>Permission denied<\/strong><br \/>\nIhr habt nicht die Rechte, um diesen Befehl auszuf\u00fchren. In dieser Anleitung m\u00fcssen nur die Befehle zum installieren mit apt-get als root (also mit su oder sudo) ausgef\u00fchrt werden.<\/p>\n<p>programmer is not responding<br \/>\n    Es kann keine Verbindung zum Programmer aufgenommen werden: Defektes Kabel, Programmer an der falschen Schnittstelle angeschlossen (default: \/dev\/ttyS0 statt z.B. \/dev\/ttypUSB0), kein Strom am Programmer etc.<\/p>\n<h1>Fehlermeldungen beim compilieren von AVR GCC<\/h1>\n<p><strong>\/usr\/bin\/ld: .libs\/hwasan.o: relocation R_X86_64_PC32 against undefined symbol `__ehdr_start' can not be used when making a shared object; recompile with -fPIC<\/strong><br \/>\nUh... Ich habe etwas rumgefrage und gegoogelt und am wahrscheinlichsten ist es, dass das Linux einfach zu alt ist. Ich bekam den Fehler bei einem ubuntu 19.04.<\/p>\n<h1>Links<\/h1>\n<p>[1] <a href=\"https:\/\/rn-wissen.de\/wiki\/index.php\/Avr-gcc_und_avrdude_installieren\">https:\/\/rn-wissen.de\/wiki\/index.php\/Avr-gcc_und_avrdude_installieren<\/a> by Me 2006, GCC<br \/>\n[2] <a href=\"https:\/\/web.archive.org\/web\/20080611141419\/http:\/\/www.tldp.org:80\/linuxfocus\/English\/November2004\/article352.shtml\">https:\/\/web.archive.org\/web\/20080611141419\/http:\/\/www.tldp.org:80\/linuxfocus\/English\/November2004\/article352.shtml<\/a> Guido Socher 2008, GCC 3.4, Example with ATmega8 (Englisch)<br \/>\n[3] <a href=\"http:\/\/www.linuxfocus.org\/Deutsch\/November2004\/article352.shtml\">http:\/\/www.linuxfocus.org\/Deutsch\/November2004\/article352.shtml<\/a> Selber Artikel in Deutsch<br \/>\n[4] <a href=\"https:\/\/web.archive.org\/web\/20080611143624\/http:\/\/www.tldp.org\/linuxfocus\/English\/March2002\/article231.shtml\">https:\/\/web.archive.org\/web\/20080611143624\/http:\/\/www.tldp.org\/linuxfocus\/English\/March2002\/article231.shtml<\/a>  Guido Socher 2002, GCC 3.0, Example with AT90S4433 (Englisch)<\/p>\n<p>[5] <a href=\"http:\/\/roboblog.fatal-fury.de\/?p=4076\">http:\/\/roboblog.fatal-fury.de\/?p=4076<\/a> GCC 8 compilieren<br \/>\n[6] <a href=\"https:\/\/www.mikrocontroller.net\/articles\/AVR-GCC-Tutorial\">https:\/\/www.mikrocontroller.net\/articles\/AVR-GCC-Tutorial<\/a><br \/>\n[7] <a href=\"https:\/\/github.com\/avrdudes\/avrdude\/\">https:\/\/github.com\/avrdudes\/avrdude\/<\/a><br \/>\n[8] <a href=\"https:\/\/gcc.gnu.org\/install\/\">https:\/\/gcc.gnu.org\/install\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt bereits eine sehr gute Anleitung f\u00fcr das Installieren vom avr-gcc [1] [2] ..., aber sie sind veraltet. Ich werde im folgenden nur das beste von diesen Artikel \u00fcbernehmen. Zusammenfassung: Der AVR 8-Bit RISC Mikrocontroller von Atmel ist ein sehr verbreiteter Mikrocontroller. Es ist nur ein Chip mit EEPROM, RAM, Analog zu Digital Umwandler, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-5109","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/5109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5109"}],"version-history":[{"count":39,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/5109\/revisions"}],"predecessor-version":[{"id":5355,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/5109\/revisions\/5355"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5109"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}