<?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=Bjoerngust</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=Bjoerngust"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Bjoerngust"/>
	<updated>2026-04-10T11:42:44Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=ARM_GCC&amp;diff=79910</id>
		<title>ARM GCC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=ARM_GCC&amp;diff=79910"/>
		<updated>2013-12-07T18:58:24Z</updated>

		<summary type="html">&lt;p&gt;Bjoerngust: Habe emIDE hinzugefügt zur Liste der GCC Distributionen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:ARM]][[Category:Compiler]]Der [[GCC]] kann auch für [[ARM]] konfiguriert werden. Es gibt diverse fertige Binärdistributionen die für verschiedene Controller mit ARM-Kern verwendet werden können.&lt;br /&gt;
== GCC Binärdistributionen ==&lt;br /&gt;
* [http://www.mentor.com/embedded-software/codesourcery Mentor Graphics Sourcery Tools (vormals CodeSourcery CodeBench Lite)] Windows, Linux&lt;br /&gt;
* [https://launchpad.net/gcc-arm-embedded GCC-ARM-Embedded] für Cortex-R4/R5/M0/M3/M4(F)/M0+. Windows, Linux, Mac, bereitgestellt von ARM selbst,  vollständiger Support für FPU&#039;s, C++11, kein Code-Size-Limit&lt;br /&gt;
* [http://www.emide.org/ emIDE] (Windows, komplette Visual Studio artige Entwicklungsumgebung mit GCC und Debugger) &lt;br /&gt;
* [http://sourceforge.net/projects/devkitpro/ devkitPro]&lt;br /&gt;
* [[ARM GCC toolchain for Linux and Mac OS X]]&lt;br /&gt;
* [http://www.yagarto.de/ Yagarto] (Windows, mit Eclipse-Integration), &lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/#winarm WinARM] (wird derzeit nicht gepflegt)&lt;br /&gt;
* [http://gnuarm.com/ GNUARM] (Linux, Windows, wird derzeit nicht gepflegt)&lt;br /&gt;
&lt;br /&gt;
Bei der Auswahl der Toolchain sollte beachtet werden, dass es größere Unterschiede bei den bereitgestellten C-Bibliotheken gibt. Die Sourcery Codebench Lite-Edition stellt z.B. keine Bibliotheken mit FPU-Unterstützung bereit, so dass trotz vorhandener FPU beim Cortex-M4 nur suboptimaler Code erzegt werden kann. Siehe [http://wiki.debian.org/ArmHardFloatPort/VfpComparison] für ein kleines Beispiel und eine Erklärung.&lt;br /&gt;
&lt;br /&gt;
Die im Netz häufig anzutreffende summon-arm Toolchain hat einen der seltenen Compiler-Bugs [http://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg353473.html] und sollte daher nicht verwendet werden, wenn man floatingpoint-Typen einsetzen möchte. Egal ob mit oder ohne FPU.&lt;br /&gt;
&lt;br /&gt;
Beim Einsatz des gcc in Verbindung mit in C geschriebenem startup-Code bei den Optimierungslevels &amp;quot;-O2&amp;quot; und &amp;quot;-O3&amp;quot; muss zusätzlich &amp;quot;-fno-gcse&amp;quot; gesetzt werden, da ansonsten die von der CPU benötigte NVIC-Tabelle(n) und zugehörige Funktionen u.U. nicht so aussehen wie sie sollten.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [http://embdev.net/topic/129986#1175214 ARM-GCC development resources] im Forum.&lt;br /&gt;
&lt;br /&gt;
== Nutzung mit eigener Umgebung/Kommandozeile ==&lt;br /&gt;
Hier einige Hinweise wie man den GCC direkt verwenden kann (zB. mit selbstgebautem makefile), falls man das nicht von einer Entwicklungsumgebung machen lässt.&lt;br /&gt;
=== Compiler &amp;amp; Linker Flags ===&lt;br /&gt;
Für Eilige, zum Copy&amp;amp;Pasten. Detailinformationen gibt es in der [http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html#Option-Summary GCC Dokumentation], auch [http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html#ARM-Options speziell für ARM].&lt;br /&gt;
* Mit Optimierungen:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tool/Sprache                                          !! Cortex-M3                       !! Cortex-M4F&lt;br /&gt;
|-&lt;br /&gt;
| C-Compiler (gcc) || -mcpu=cortex-m3 -mfloat-abi=soft -mthumb -ffunction-sections -fdata-sections -Os -flto || -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -Os -flto&lt;br /&gt;
|-&lt;br /&gt;
| C++ Compiler (g++) || -mcpu=cortex-m3 -mfloat-abi=soft -mthumb -ffunction-sections -fdata-sections -Os -flto -fno-rtti -fno-exceptions || -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -Os -flto -fno-rtti -fno-exceptions&lt;br /&gt;
|-&lt;br /&gt;
| Assembler (as) || -mcpu=cortex-m3 -mfloat-abi=soft -mthumb || -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb&lt;br /&gt;
|-&lt;br /&gt;
| Linken von C Code (mit gcc-Befehl) || -mcpu=cortex-m3 -mfloat-abi=soft -mthumb -ffunction-sections -fdata-sections -Os -flto -Wl,--gc-sections -static || -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -Os -flto -Wl,--gc-sections -static&lt;br /&gt;
|-&lt;br /&gt;
| Linken von C++ (und C) Code (mit g++-Befehl) || -mcpu=cortex-m3 -mfloat-abi=soft -mthumb -ffunction-sections -fdata-sections -Os -flto -fno-rtti -fno-exceptions -Wl,--gc-sections -static || -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -Os -flto -fno-rtti -fno-exceptions -Wl,--gc-sections -static&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
* Ohne Optimierungen, mit Debug-Informationen:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tool/Sprache                                          !! Cortex-M3                       !! Cortex-M4F&lt;br /&gt;
|-&lt;br /&gt;
| C-Compiler (gcc) || -mcpu=cortex-m3 -mfloat-abi=soft -mthumb -ffunction-sections -fdata-sections -g || -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -g&lt;br /&gt;
|-&lt;br /&gt;
| C++ Compiler (g++) || -mcpu=cortex-m3 -mfloat-abi=soft -mthumb -ffunction-sections -fdata-sections -g -fno-rtti -fno-exceptions || -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -g -fno-rtti -fno-exceptions&lt;br /&gt;
|-&lt;br /&gt;
| Assembler (as) || -mcpu=cortex-m3 -mfloat-abi=soft -mthumb || -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb&lt;br /&gt;
|-&lt;br /&gt;
| Linken von C Code (mit gcc-Befehl) || -mcpu=cortex-m3 -mfloat-abi=soft -mthumb -ffunction-sections -fdata-sections -g -Wl,--gc-sections -static || -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -g -Wl,--gc-sections -static&lt;br /&gt;
|-&lt;br /&gt;
| Linken von C++ (und C) Code (mit g++-Befehl) || -mcpu=cortex-m3 -mfloat-abi=soft -mthumb -ffunction-sections -fdata-sections -g -fno-rtti -fno-exceptions -Wl,--gc-sections -static || -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -ffunction-sections -fdata-sections -g -fno-rtti -fno-exceptions -Wl,--gc-sections -static&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Siehe auch das [https://launchpadlibrarian.net/135588846/readme.txt Readme vom GCC-ARM-Embedded]&lt;br /&gt;
* Um das -flto -Flag verwenden zu können, muss der GCC [http://gcc.gnu.org/onlinedocs/gccint/LTO.html LTO] unterstützen. Beim GCC-ARM-Embedded ist dies ab Version 4.7-2013-q2-update  der Fall.&lt;br /&gt;
* Die LTO erkennt die ISR&#039;s und den Interrupt Vector möglicherweise als &amp;quot;unbenutzt&amp;quot; und optimiert sie daher weg. Dies kann durch Markierung der Funktionen &amp;amp; Variablen mit  &amp;quot;__attribute__ ((used))&amp;quot; verhindert werden.&lt;br /&gt;
* Alle Compileroptionen müssen auch beim Linken mit angegeben werden (ist in obiger Tabelle berücksichtigt), da auch dann u.U. Code generiert werden kann.&lt;br /&gt;
=== Startupcode &amp;amp; Linkerscript ===&lt;br /&gt;
* Damit der compilierte Code an den richtigen Stellen im Controller landet (d.h. dem Flash) muss man dem Linker ein Linkerscript mitgeben. Dies geht per &amp;quot;-T &#039;&#039;pfad_zum_linkerscript.ld&#039;&#039;&amp;quot; an den Linker-Befehl. Das Script ist praktisch Controller-spezifisch, es gibt Beispiel-Scripte der Controller-Hersteller.&lt;br /&gt;
* Damit beim Starten die richtigen Initialisierungen vorgenommen werden (wie globale Variablen und bei C++ Konstruktoren globaler Objekt-Instanzen) muss als erstes ein Startupcode laufen, der dann die main()-Funktion aufruft. Der Startupcode ist meistens in Assembler geschrieben, C/C++-Code ist aber auch möglich. Assemblercode kann per arm-none-eabi-as (Flags s.o.) assemblisiert werden, die resultierende .o -Datei normal mitgelinkt. Auch für den Startupcode gibt es Beispiele der Controller-Hersteller.&lt;br /&gt;
&lt;br /&gt;
Zusammen bieten die beiden Dateien der Anwendung ein Standard-C-Interface, d.h. man kann wie gewohnt globale Variablen verwenden und seinen Code in die main()-Funktion schreiben.&lt;br /&gt;
=== FPU der Cortex-M4F nutzen ===&lt;br /&gt;
Um die FPU zu nutzen, muss dem Compiler per [[#Compiler_.26_Linker_Flags|Flag]] dazu gebracht werden, FPU-Instruktionen zu generieren.&lt;br /&gt;
&lt;br /&gt;
Außerdem muss vor Benutzung der FPU-Befehle die FPU aktiviert werden, dies geschieht typischerweise im Startupcode, bevor die main() -Funktion aufgerufen wird. Hier die entsprechenden Befehle, falls sie im verwendeten Startupcode nicht onehin schon enthalten sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;/*FPU settings*/&lt;br /&gt;
 ldr     r0, =0xE000ED88           /* Enable CP10,CP11 */&lt;br /&gt;
 ldr     r1,[r0]&lt;br /&gt;
 orr     r1,r1,#(0xF &amp;lt;&amp;lt; 20)&lt;br /&gt;
 str     r1,[r0]&amp;lt;/pre&amp;gt;&lt;br /&gt;
In C/C++ unter Verwendung der CMSIS geht es so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
SCB-&amp;gt;CPACR |= ((3UL &amp;lt;&amp;lt; 10*2)|(3UL &amp;lt;&amp;lt; 11*2)); /* set CP10 and CP11 Full Access */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weiterhin sollte die GCC-Distribution auch Laufzeitbibliotheken mit FPU-Unterstützung mitbringen (CodeBench lite und Yagarto werden ohne ausgeleifert, GCC-ARM-Embedded mit).&lt;br /&gt;
&lt;br /&gt;
Am Beispiel der STM32F4 mehr dazu in diesem Thread: [http://www.mikrocontroller.net/topic/261021 Floating Pointing Unit STM32F4]&lt;br /&gt;
=== Disassemblieren mit GCC ===&lt;br /&gt;
arm-none-eabi-objdump -d -t -C pfad_zum_binary.elf&lt;br /&gt;
&lt;br /&gt;
=== Konvertieren zwischen Binary-Formaten beim GCC ===&lt;br /&gt;
arm-none-eabi-objcopy -O &#039;&#039;ausgabeformat&#039;&#039; &#039;&#039;eingabe_binary.elf&#039;&#039; &#039;&#039;ausgabe_binary&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nützlich als Ausgabeformat sind z.B. &amp;quot;ihex&amp;quot; oder &amp;quot;binary&amp;quot;.&lt;br /&gt;
=== Code-Größe optimieren ===&lt;br /&gt;
Obige Flags (insbesondere -flto -Os -ffunction-sections -fdata-sections -Wl,--gc-sections ) verwenden. [http://www.mikrocontroller.net/topic/298976#3197418 Hier] finden sich noch ein par Tips, für den 1. kann aber mittlerweile der GCC-ARM-Embedded direkt verwendet werden, da er jetzt LTO unterstützt (s.o.).&lt;/div&gt;</summary>
		<author><name>Bjoerngust</name></author>
	</entry>
</feed>