<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/index.php?action=history&amp;feed=atom&amp;title=Avr-gcc%2FOptimierungen</id>
		<title>Avr-gcc/Optimierungen - Versionsgeschichte</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/index.php?action=history&amp;feed=atom&amp;title=Avr-gcc%2FOptimierungen"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr-gcc/Optimierungen&amp;action=history"/>
		<updated>2026-04-12T03:20:07Z</updated>
		<subtitle>Versionsgeschichte dieser Seite in RN-Wissen.de</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr-gcc/Optimierungen&amp;diff=22559&amp;oldid=prev</id>
		<title>Besserwessi: /* Optimierungsgrad */</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr-gcc/Optimierungen&amp;diff=22559&amp;oldid=prev"/>
				<updated>2013-04-26T16:32:55Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Optimierungsgrad&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Version vom 26. April 2013, 16:32 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L15&quot; &gt;Zeile 15:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 15:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Optimierungsgrad==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Optimierungsgrad==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Als Optimierungsgrad erweist sich &amp;lt;tt&amp;gt;-Os&amp;lt;/tt&amp;gt; (Optimize for Size) als der beste, evtl. noch &amp;lt;tt&amp;gt;-O2&amp;lt;/tt&amp;gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;. Ohne Angabe eines Optimierungsgrades wird nicht optimiert, was gleichbedeutend mit der Option &amp;lt;tt&amp;gt;-O0&amp;lt;/tt&amp;gt; ist&lt;/del&gt;. Abzuraten ist von der maximalen Optimierung &amp;lt;tt&amp;gt;-O3&amp;lt;/tt&amp;gt;, die wegen function inlining und loop unrolling zu sehr breitem Code führt und für AVR absolut nicht angesagt ist.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Als Optimierungsgrad erweist sich &amp;lt;tt&amp;gt;-Os&amp;lt;/tt&amp;gt; (Optimize for Size) als der beste, evtl. noch &amp;lt;tt&amp;gt;-O2&amp;lt;/tt&amp;gt;. Abzuraten ist von der maximalen Optimierung &amp;lt;tt&amp;gt;-O3&amp;lt;/tt&amp;gt;, die wegen function inlining und loop unrolling zu sehr breitem Code führt und für AVR absolut nicht angesagt &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;ist.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Ohne Angabe eines Optimierungsgrades wird nicht optimiert, was gleichbedeutend mit der Option &amp;lt;tt&amp;gt;-O0&amp;lt;/tt&amp;gt; ist. Das Übersetzen ohne Optimierung ist vor allem für Debug-Zwecke sinnvoll, da so der erzeugte ASM Code leichter zu verfolgen &lt;/ins&gt;ist.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Vermeide printf, scanf, malloc==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Vermeide printf, scanf, malloc==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Besserwessi</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr-gcc/Optimierungen&amp;diff=22556&amp;oldid=prev</id>
		<title>Lutz: /* Division durch Multiplikation */</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr-gcc/Optimierungen&amp;diff=22556&amp;oldid=prev"/>
				<updated>2013-04-26T10:05:33Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Division durch Multiplikation&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Version vom 26. April 2013, 10:05 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L364&quot; &gt;Zeile 364:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 364:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Division durch Multiplikation===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Division durch Multiplikation===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Bei den AVRs (Mega...) sind Multiplikationen deulich schneller als Divisionen. Besonders bei &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Fleißkommazahlen &lt;/del&gt;lohnt es daher eine Division durch die Multiplikation mit dem Kehrwert zu ersetzen. Bei Integer Zahlen sind dem durch die Rundung Grenzen gesetzt.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Bei den AVRs (Mega...) sind Multiplikationen deulich schneller als Divisionen. Besonders bei &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Fließkommazahlen &lt;/ins&gt;lohnt es daher eine Division durch die Multiplikation mit dem Kehrwert zu ersetzen. Bei Integer Zahlen sind dem durch die Rundung Grenzen gesetzt.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Vermeiden von float und double===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Vermeiden von float und double===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Lutz</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr-gcc/Optimierungen&amp;diff=22555&amp;oldid=prev</id>
		<title>Lutz: /* Vermeiden von float und double */</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr-gcc/Optimierungen&amp;diff=22555&amp;oldid=prev"/>
				<updated>2013-04-26T10:04:55Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Vermeiden von float und double&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Version vom 26. April 2013, 10:04 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L369&quot; &gt;Zeile 369:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 369:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Vermeiden von float und double===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Vermeiden von float und double===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;GCC kennt für die AVRs zur Zeit nur einen &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Fleißkommatyp&lt;/del&gt;. Da keine Hardwareunterstützung dafür vorhanden ist, dauern &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Fleißkommarechnungen &lt;/del&gt;relativ lange. Gerade Additionen sind deutlich langsamer als bei Integer.&amp;#160; Auch die Codelänge nimmt erheblich zu, selbst wenn nur wenige &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Fleißkommazahlen &lt;/del&gt;genutzt werden.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;GCC kennt für die AVRs zur Zeit nur einen &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Fließkommatyp&lt;/ins&gt;. Da keine Hardwareunterstützung dafür vorhanden ist, dauern &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Fließkommarechnungen &lt;/ins&gt;relativ lange. Gerade Additionen sind deutlich langsamer als bei Integer.&amp;#160; Auch die Codelänge nimmt erheblich zu, selbst wenn nur wenige &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Fließkommazahlen &lt;/ins&gt;genutzt werden.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ein Alternative zu &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Fleißkommazahlen &lt;/del&gt;ist die Benutzung von Festkommazahlen, auch wenn die nicht direkt von GCC unterstützt werden. Die Werte werden einfach alle mit einem konstanten Faktor (z.B. 256,1024 oder 1000) skaliert.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ein Alternative zu &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Fließkommazahlen &lt;/ins&gt;ist die Benutzung von Festkommazahlen, auch wenn die nicht direkt von GCC unterstützt werden. Die Werte werden einfach alle mit einem konstanten Faktor (z.B. 256,1024 oder 1000) skaliert.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Es wird dann mit Integer oder Long Integer gerechnet und bei &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Multiplicationen &lt;/del&gt;/ Divisionen der zusätzliche Skalenfaktor berücksichtig.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Es wird dann mit Integer oder Long Integer gerechnet und bei &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Multiplikationen &lt;/ins&gt;/ Divisionen der zusätzliche Skalenfaktor berücksichtig.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategorie:Microcontroller]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategorie:Microcontroller]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategorie:Quellcode C]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategorie:Quellcode C]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Lutz</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr-gcc/Optimierungen&amp;diff=21470&amp;oldid=prev</id>
		<title>SprinterSB_alt: diffuse</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr-gcc/Optimierungen&amp;diff=21470&amp;oldid=prev"/>
				<updated>2012-11-27T22:30:28Z</updated>
		
		<summary type="html">&lt;p&gt;diffuse&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Version vom 27. November 2012, 22:30 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;L373&quot; &gt;Zeile 373:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 373:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ein Alternative zu Fleißkommazahlen ist die Benutzung von Festkommazahlen, auch wenn die nicht direkt von GCC unterstützt werden. Die Werte werden einfach alle mit einem konstanten Faktor (z.B. 256,1024 oder 1000) skaliert.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ein Alternative zu Fleißkommazahlen ist die Benutzung von Festkommazahlen, auch wenn die nicht direkt von GCC unterstützt werden. Die Werte werden einfach alle mit einem konstanten Faktor (z.B. 256,1024 oder 1000) skaliert.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Es wird dann mit Integer oder Long Integer gerechnet und bei Multiplicationen / Divisionen der zusätzliche Skalenfaktor berücksichtig.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Es wird dann mit Integer oder Long Integer gerechnet und bei Multiplicationen / Divisionen der zusätzliche Skalenfaktor berücksichtig.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Kategorie:Microcontroller]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Kategorie:Quellcode C]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>SprinterSB_alt</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Avr-gcc/Optimierungen&amp;diff=21468&amp;oldid=prev</id>
		<title>SprinterSB_alt: Ausgelagert aus avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Avr-gcc/Optimierungen&amp;diff=21468&amp;oldid=prev"/>
				<updated>2012-11-27T22:25:59Z</updated>
		
		<summary type="html">&lt;p&gt;Ausgelagert aus &lt;a href=&quot;/wiki/index.php?title=Avr-gcc&quot; title=&quot;Avr-gcc&quot;&gt;avr-gcc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Beim Programmieren in C möchte man sich möglichst wenig mit der Codeerzeugung selbst auseinandersetzen. Man verwendet ja gerade deshalb einen Compiler und programmiert nicht in Assembler, weil man sich nicht um Register-Belegungen o.ä. kümmern will, sondern nur um die zu lösende Aufgabe.&lt;br /&gt;
&lt;br /&gt;
GCC erzeugt zwar recht guten Code, aber er ist nicht perfekt. Gerade auf Systemen wie AVR mit nur sehr begrenzten Resourcen muss man daher dem Compiler hilfreich zur Seite stehen, wenn man noch dichteren/schnelleren Code erhalten möchte.&lt;br /&gt;
&lt;br /&gt;
:''&amp;quot;Unlike most other C compilers, GCC allows you to use -g with -O. The shortcuts taken by optimized code may occasionally produce surprising results: some variables you declared may not exist at all; flow of control may briefly move where you did not expect it; some statements may not be executed because they compute constant results or their values were already at hand; some statements may execute in different places because they were moved out of loops.''&lt;br /&gt;
&lt;br /&gt;
:''Nevertheless it proves possible to debug optimized output. This makes it reasonable to use the optimizer for programs that might have bugs.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Um das Ergebnis zu beurteilen, hilft ein Blick ins Listfile. &lt;br /&gt;
Siehe dazu auch die Abschnitte &lt;br /&gt;
&amp;quot;[[Hallo Welt für AVR (LED blinken)#Listfile erstellen|Listfile erstellen]]&amp;quot; &lt;br /&gt;
und&lt;br /&gt;
&amp;quot;[[Hallo Welt für AVR (LED blinken)#Die Größe ermitteln|Die Größe ermitteln]]&amp;quot; &lt;br /&gt;
im [[Hallo Welt für AVR (LED blinken)|Hallo Welt für AVR]].&lt;br /&gt;
&lt;br /&gt;
==Optimierungsgrad==&lt;br /&gt;
Als Optimierungsgrad erweist sich &amp;lt;tt&amp;gt;-Os&amp;lt;/tt&amp;gt; (Optimize for Size) als der beste, evtl. noch &amp;lt;tt&amp;gt;-O2&amp;lt;/tt&amp;gt;. Ohne Angabe eines Optimierungsgrades wird nicht optimiert, was gleichbedeutend mit der Option &amp;lt;tt&amp;gt;-O0&amp;lt;/tt&amp;gt; ist. Abzuraten ist von der maximalen Optimierung &amp;lt;tt&amp;gt;-O3&amp;lt;/tt&amp;gt;, die wegen function inlining und loop unrolling zu sehr breitem Code führt und für AVR absolut nicht angesagt ist.&lt;br /&gt;
&lt;br /&gt;
==Vermeide printf, scanf, malloc==&lt;br /&gt;
Funktionen von diesem Kaliber sind die absoluten Platz- und Zeitfresser. &lt;br /&gt;
&lt;br /&gt;
Alternativen findet man reichlich in der &amp;lt;tt&amp;gt;avr-libc&amp;lt;/tt&amp;gt; wie &amp;lt;tt&amp;gt;itoa&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;atoi&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Und für &amp;lt;tt&amp;gt;malloc&amp;lt;/tt&amp;gt; und Konsorten sind dynamische Arrays und das Compiler-Builtin &amp;lt;tt&amp;gt;__builtin_alloca&amp;lt;/tt&amp;gt; effizientere Alternativen, siehe auch im Abschnitt &amp;quot;[[avr-gcc#Dynamische Speicherallokierung|Dynamische Speicherallokierung]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Konstante Strings ins Flash== &lt;br /&gt;
Konstante Strings, wie sie zu Ausgabezwecken Verwendung finden, werden im Programm oft nicht verändert und brauchen nicht SRAM zu belegen (und damit auch Flash, von wo aus sie vom Startup-Code ins SRAM kopiert werden), sondern gehören ins Flash! &lt;br /&gt;
&lt;br /&gt;
Entsprechende Routinen, um auf Strings im Flash zuzugreifen, tragen die Suffix &amp;lt;tt&amp;gt;_P&amp;lt;/tt&amp;gt;, wie z.B. &amp;lt;tt&amp;gt;strcmp_P&amp;lt;/tt&amp;gt; mit dem Prototyp&lt;br /&gt;
 extern int *strcmp_P (char *, const prog_char *)&lt;br /&gt;
Die Implementierungen befinden sich in der &amp;lt;tt&amp;gt;avr-libc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Anwendung:'''&lt;br /&gt;
 #include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 const prog_char str_p[]     = &amp;quot;Ein String im Flash&amp;quot;;&lt;br /&gt;
 const char str2_p[] PROGMEM = &amp;quot;Noch ein String im Flash&amp;quot;;&lt;br /&gt;
 ...&lt;br /&gt;
   {{ccomment|String im SRAM mit String im Flash vergleichen}}&lt;br /&gt;
   if (!strcmp_P (str_sram, str_p))&lt;br /&gt;
   {&lt;br /&gt;
       {{ccomment|mach was bei Gleichheit}}&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   {{ccomment|&amp;quot;foo&amp;quot; wird im RAM angelegt. Ineffizient für konstante Strings!}}  &lt;br /&gt;
   {{ccomment|Beachte, daß damit strcmp (nicht strcmp_P) benutzt werden muss.}}  &lt;br /&gt;
   if (!strcmp (str_sram, &amp;quot;foo&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
       {{ccomment|mach was bei Gleichheit}}&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   {{ccomment|PSTR bewirkt, daß die String-Konstante &amp;quot;foo&amp;quot;}}&lt;br /&gt;
   {{ccomment|im Flash angelegt wird}}&lt;br /&gt;
   if (!strcmp_P (str_sram, PSTR (&amp;quot;foo&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
       {{ccomment|mach was bei Gleichheit}}&lt;br /&gt;
   }&lt;br /&gt;
 ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Sprungtabelle===&lt;br /&gt;
Genauso macht man auch eine Sprungtabelle, um anhand von Kommando-Strings dazugehörige Funktionen ausführen zu lassen:&lt;br /&gt;
 #include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int func1 (int arg)&lt;br /&gt;
 {&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #define TEXT_LEN 15&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Die Kommandostruktur}}&lt;br /&gt;
 typedef struct &lt;br /&gt;
 {&lt;br /&gt;
    int (*func)(int);      {{ccomment|Zeiger auf die auszuführende Funktion}}&lt;br /&gt;
    int arg;               {{ccomment|das Argument, das mitübergeben wird}}&lt;br /&gt;
    char text[1+TEXT_LEN]; {{ccomment|Text, maximal TEXT_LEN Zeichen lang}}&lt;br /&gt;
 } command_t;&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Das Array mit den Kommandos.}}&lt;br /&gt;
 {{ccomment|Die funcx sind vom Prototyp (z.B. func1 oben)}}&lt;br /&gt;
 {{ccomment|int funcx (int arg);}}&lt;br /&gt;
 const command_t commands[] PROGMEM =&lt;br /&gt;
 {&lt;br /&gt;
    { func1, 0, &amp;quot;Befehl 1&amp;quot; },&lt;br /&gt;
    { func2, 3, &amp;quot;Befehl für func2&amp;quot; }&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Sucht in commands[] nach text und führt gegebenenfalls}}&lt;br /&gt;
 {{ccomment|die dazugehörige Funktion funcx mit Argument arg aus.}}&lt;br /&gt;
 {{ccomment|Liefert den Rückgabewert von funcx}}&lt;br /&gt;
 {{ccomment|oder -1, falls text nicht gefunden wurde.}}&lt;br /&gt;
 int execute (const char *text)&lt;br /&gt;
 {&lt;br /&gt;
    {{ccomment|Schleifenvariable}}&lt;br /&gt;
    unsigned char i;&lt;br /&gt;
 &lt;br /&gt;
    {{ccomment|Wandert durch das Array mit Kommando-Strukturen}}&lt;br /&gt;
    const command_t * cmd = commands;&lt;br /&gt;
 &lt;br /&gt;
    {{ccomment|sizeof wird von gcc ausgewertet und ist wie eine Konstante,}}&lt;br /&gt;
    {{ccomment|denn beide sizeofs sind zur Compilezeit bekannt}}&lt;br /&gt;
    for (i=0; i &amp;lt; sizeof(commands) / sizeof(command_t); i++)&lt;br /&gt;
    {&lt;br /&gt;
       {{ccomment|Ist das der gesuchte String?}} &lt;br /&gt;
       if (strcmp_P (text, cmd-&amp;gt;text))&lt;br /&gt;
       {&lt;br /&gt;
         {{ccomment|Nein, dann weitersuchen}}&lt;br /&gt;
         cmd++;&lt;br /&gt;
         continue;&lt;br /&gt;
       }&lt;br /&gt;
 &lt;br /&gt;
       {{ccomment|Ja}}&lt;br /&gt;
       int (*func)(int), arg;&lt;br /&gt;
 &lt;br /&gt;
       {{ccomment|Dann Funktionszeiger und Argument besorgen,}}&lt;br /&gt;
       func = (int(*)(int)) pgm_read_word (&amp;amp; cmd-&amp;gt;func);&lt;br /&gt;
       arg  = (int)         pgm_read_word (&amp;amp; cmd-&amp;gt;arg);&lt;br /&gt;
 &lt;br /&gt;
       {{ccomment|Funktion ausführen und deren Wert zurückliefern}} &lt;br /&gt;
       return func (arg);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    {{ccomment|text ist nicht in commands}}&lt;br /&gt;
    return -1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Nachteil dabei ist, daß jeder String den maximalen Platz von &amp;lt;tt&amp;gt;TEXT_LEN+1&amp;lt;/tt&amp;gt; Zeichen belegt.&lt;br /&gt;
Falls man da noch weiter sparen will, dann kann man die Strings wieder ins Flash legen und ihre Adresse in der Struktur merken. Dadurch belegt ein String nur noch Länge+3 Zeichen (+3 wegen 1 Endezeichen und 2 Bytes für seine in der Struktur gemerkte Adresse). Die Definition der Tabelle wird aber umständlicher, weil jeder String einzeln angegeben werden muss:&lt;br /&gt;
 #include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Die Kommandostruktur}}&lt;br /&gt;
 typedef struct &lt;br /&gt;
 {&lt;br /&gt;
    ...&lt;br /&gt;
    char * text;  {{ccomment|Zeiger auf Text}}&lt;br /&gt;
 } command_t;&lt;br /&gt;
 &lt;br /&gt;
 const prog_char str_1[] = &amp;quot;Befehl 1&amp;quot;;&lt;br /&gt;
 const prog_char str_2[] = &amp;quot;Befehl für func2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 const command_t commands[] PROGMEM =&lt;br /&gt;
 {&lt;br /&gt;
    { func1, 0, str_1 },&lt;br /&gt;
    { func2, 3, str_2 }&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Sucht in commands[] nach text und führt gegebenenfalls}}&lt;br /&gt;
 {{ccomment|die dazugehörige Funktion funcx mit Argument arg aus.}}&lt;br /&gt;
 {{ccomment|Liefert den Rückgabewert von funcx}}&lt;br /&gt;
 {{ccomment|oder -1, falls text nicht gefunden wurde.}}&lt;br /&gt;
 int execute (const char *text)&lt;br /&gt;
 {&lt;br /&gt;
    {{ccomment|Schleifenvariable}}&lt;br /&gt;
    unsigned char i;&lt;br /&gt;
 &lt;br /&gt;
    {{ccomment|Wandert durch das Array mit Kommando-Strukturen}}&lt;br /&gt;
    const command_t * cmd = commands;&lt;br /&gt;
 &lt;br /&gt;
    {{ccomment|sizeof wird von gcc ausgewertet und ist wie eine Konstante,}}&lt;br /&gt;
    {{ccomment|denn beide sizeofs sind zur Compilezeit bekannt}}&lt;br /&gt;
    for (i=0; i &amp;lt; sizeof(commands) / sizeof (command_t); i++)&lt;br /&gt;
    {&lt;br /&gt;
       const prog_char * text_P;&lt;br /&gt;
 &lt;br /&gt;
       {{ccomment|Liest die Startadresse von str_x}}&lt;br /&gt;
       text_P = (const prog_char *) pgm_read_word (&amp;amp; cmd-&amp;gt;text);&lt;br /&gt;
 &lt;br /&gt;
       {{ccomment|Ist das der gesuchte String?}}        &lt;br /&gt;
       if (strcmp_P (text, text_P))&lt;br /&gt;
       {&lt;br /&gt;
          ...&lt;br /&gt;
&lt;br /&gt;
==Lokale Variablen verwenden==&lt;br /&gt;
&lt;br /&gt;
Beim Manipulieren globaler Variablen kann es günstig sein, diese in eine lokale Variable zu kopieren, dort zu verändern, und sie danach wieder zu schreiben &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
char var;&lt;br /&gt;
&lt;br /&gt;
void foo1()&lt;br /&gt;
{&lt;br /&gt;
   var++;&lt;br /&gt;
   if (var &amp;gt; 10)&lt;br /&gt;
      var = 1;&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dadurch wird einmal unnötig gespeichert (der dritte Befehl kann vermieden werden).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
foo1:&lt;br /&gt;
  lds r24,var        ; *movqi/4 [length = 2]&lt;br /&gt;
  subi r24,lo8(-(1)) ; addqi3/2 [length = 1]&lt;br /&gt;
  sts var,r24        ; *movqi/3 [length = 2]&lt;br /&gt;
  cpi r24,lo8(11)    ; cmpqi/2  [length = 1]&lt;br /&gt;
  brlt .L3           ; branch   [length = 1]&lt;br /&gt;
  ldi r24,lo8(1)     ; *movqi/2 [length = 1]&lt;br /&gt;
  sts var,r24        ; *movqi/3 [length = 2]&lt;br /&gt;
.L3:&lt;br /&gt;
  ret   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Indem man eine lokale Variable (&amp;lt;tt&amp;gt;var2&amp;lt;/tt&amp;gt;) verwendet für die Änderung von &amp;lt;tt&amp;gt;var&amp;lt;/tt&amp;gt; vermeidet man dies:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
char var;&lt;br /&gt;
&lt;br /&gt;
void foo2()&lt;br /&gt;
{&lt;br /&gt;
   char var2 = var;&lt;br /&gt;
   &lt;br /&gt;
   var2++;&lt;br /&gt;
   if (var2 &amp;gt; 10)&lt;br /&gt;
      var2 = 1;&lt;br /&gt;
      &lt;br /&gt;
   var = var2;&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dadurch wird erst am Ende gespeichert. &amp;lt;tt&amp;gt;var2&amp;lt;/tt&amp;gt; lebt in Register &amp;lt;tt&amp;gt;r24&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
foo2:&lt;br /&gt;
  lds r24, var       ; *movqi/4   [length = 2]&lt;br /&gt;
  subi r24,lo8(-(1)) ; addqi3/2   [length = 1]&lt;br /&gt;
  cpi r24,lo8(11)    ; cmpqi/2    [length = 1]&lt;br /&gt;
  brlt .L2           ; branch     [length = 1]&lt;br /&gt;
  ldi r24,lo8(1)     ; *movqi/2   [length = 1]&lt;br /&gt;
.L2:&lt;br /&gt;
  sts var, r24       ; *movqi/3   [length = 2]&lt;br /&gt;
  ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei diesem einfachen Beispiel spart man lediglich eine Instruktion. Bei komplexeren Rechnungen oder längeren Datentypen kann es aber durchaus lohnender sein, in lokale Register zu kopieren.&lt;br /&gt;
&lt;br /&gt;
==Arithmetik==&lt;br /&gt;
&lt;br /&gt;
=== Daten zerlegen/zusammensetzen ===&lt;br /&gt;
&lt;br /&gt;
In systemnahen Programmen hat man oft was Problem, auf die einzelnen Bytes oder Bitfelder einer grösseren Datenstruktur zuzugreifen. Indem man sich ein Komposit baut, das die gewünschten Strukturen überlagert, kann man effizient z.B. auf Bytes zugreifen. Ausnahme sind Bitfelder, deren Verwendung etwas breiten Code ergibt. Bitfelder &amp;quot;von Hand&amp;quot; zu manipulieren, ist da manchmal effizienter, führt jedoch zu schlecht lesbarem Code.&lt;br /&gt;
&lt;br /&gt;
Oft benötigt wird der Zugriff auf die einzelnen Bytes eines &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;, also der Zugriff auf die Bytes eines 16-Bit-Wertes:&lt;br /&gt;
&lt;br /&gt;
 typedef union&lt;br /&gt;
 {&lt;br /&gt;
    unsigned char  asByte[2];&lt;br /&gt;
    unsigned short asWord;&lt;br /&gt;
    int            asInt;&lt;br /&gt;
 } data16_t;&lt;br /&gt;
 &lt;br /&gt;
 data16_t data;&lt;br /&gt;
 ...&lt;br /&gt;
    int foo;&lt;br /&gt;
    uint8_t wert;&lt;br /&gt;
 &lt;br /&gt;
    data.asInt = foo;&lt;br /&gt;
    wert = data.asByte[1]; {{ccomment|die oberen 8 Bits von foo}}&lt;br /&gt;
&lt;br /&gt;
Ein komplexeres Beispiel, das noch mehr Datentypen überlagert:&lt;br /&gt;
 typedef ... foo_t;&lt;br /&gt;
 &lt;br /&gt;
 typedef union&lt;br /&gt;
 {&lt;br /&gt;
     unsigned char byte[4];      {{ccomment| Zugriff als Bytes (8 Bit) }}&lt;br /&gt;
     unsigned short word[2];     {{ccomment| Zugriff als Words (16 Bit) }}&lt;br /&gt;
     signed long slong;          {{ccomment| Zugriff als signed long (32 Bit) }}&lt;br /&gt;
 &lt;br /&gt;
     struct {{ccomment| Zugriff auf einzelne Bitgruppen }}&lt;br /&gt;
     {&lt;br /&gt;
         unsigned bit_0_3 : 4;   {{ccomment| 4 Bits (0..3) }}&lt;br /&gt;
         unsigned bit_4_8 : 5;   {{ccomment| 5 Bits (4..8) }}&lt;br /&gt;
         unsigned bit_9_21 : 13; {{ccomment| 13 Bits (9..21) }}&lt;br /&gt;
         unsigned bit_22_31: 10; {{ccomment| 10 Bits (22..31) }}&lt;br /&gt;
     };&lt;br /&gt;
 &lt;br /&gt;
     foo_t foo; {{ccomment| Zugriff als foo-Struktur }}&lt;br /&gt;
 } data_t;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 {&lt;br /&gt;
     data_t data;&lt;br /&gt;
 &lt;br /&gt;
     data.byte[2] = 12;          {{ccomment| setzt byte 2 auf 12 }}&lt;br /&gt;
     data.bit_4_8 = 0x1f;        {{ccomment| setzt bits 4..8 (5 Stück) alle auf 1 }}&lt;br /&gt;
 &lt;br /&gt;
     int anInt = data.foo.anInt; {{ccomment| liest ein Feld von foo (hier ein int) }}&lt;br /&gt;
     ...&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
===libgcc2 verwenden===&lt;br /&gt;
&lt;br /&gt;
In der libgcc2 sind einige Arithmetik-Routinen in Assembler implementiert. Dazu gehören ein paar Algorithmen zu Division (mit Rest) und Multiplikation. &lt;br /&gt;
&lt;br /&gt;
Von diesen Algorithmen werden durch die avr-libc jedoch nur zwei Strukturen und Funktionen veröffentlicht: &amp;lt;tt&amp;gt;div_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;ldiv_t&amp;lt;/tt&amp;gt; resp. die Funktionen &amp;lt;tt&amp;gt;div()&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;ldiv()&amp;lt;/tt&amp;gt;. Siehe dazu deine Dokumentation zur avr-libc. Damit kann man Quotient und zusätzlich den Rest bei einer Division 16/16 bzw. 32/32 berechnen lassen; den Rest bekommt man quasi kostenlos als Nebenprodukt. Das ist praktisch, wenn man z.b. eine Zahl in Dezimaldarstellung umwandeln möchte oder von/nach [[BCD]].&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den via avr-libc veröffentlichten Funktionen gibt es aber noch Routinen, die z.B. auf 8-Bit-Werten operieren oder mit &amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt; Typen und dementsprechend effizienter sind.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel: Umwandeln nach Dezimalstring'''&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, das Division mit Rest für &amp;lt;tt&amp;gt;unsigned short&amp;lt;/tt&amp;gt; verwendet, um eine 16-Bit-Zahl in Dezimaldarstellung zu wandeln:&lt;br /&gt;
&lt;br /&gt;
 {{ccomment| Struktur definieren und Funktion bekannt machen }}&lt;br /&gt;
 typedef struct&lt;br /&gt;
 {&lt;br /&gt;
     unsigned short quot;&lt;br /&gt;
     unsigned short rem;&lt;br /&gt;
 } udiv_t;&lt;br /&gt;
 &lt;br /&gt;
 extern udiv_t udiv (unsigned short, unsigned short) __asm__(&amp;quot;__udivmodhi4&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment| 5 Ziffern (0...65535) und evtl. noch eine führende 0 }}&lt;br /&gt;
 #define DIGITS 6&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment| +1 wegen String-Ende (wird im Startup auf 0 gesetzt) }}&lt;br /&gt;
 char string[DIGITS+1];&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment| Wandelt zahl in Dezimaldarstellung um. }}&lt;br /&gt;
 {{ccomment| Der return-Wert zeigt irgendwo ins string[]-Array. }}&lt;br /&gt;
 {{ccomment| string[] wird verändert. }}&lt;br /&gt;
 char* toString (unsigned short zahl)&lt;br /&gt;
 {&lt;br /&gt;
     {{ccomment| s zeigt auf das Ende von string }}&lt;br /&gt;
     {{ccomment| string wird von hinten nach vorne gefüllt }}&lt;br /&gt;
     char *s = string + DIGITS;&lt;br /&gt;
  &lt;br /&gt;
     {{ccomment| qrem enthält Quotient (quot) und Rest (rem) der Divisionen }}&lt;br /&gt;
     udiv_t qrem = {.quot = zahl}; &lt;br /&gt;
 &lt;br /&gt;
     do&lt;br /&gt;
     {&lt;br /&gt;
         {{ccomment| Division mit Rest durch 10 }}&lt;br /&gt;
         {{ccomment| quot: Ergebnis für den nächsten Durchlauf }}&lt;br /&gt;
         {{ccomment| rem: Rest ist die Ziffer im 10er-System }}&lt;br /&gt;
         qrem = udiv (qrem.quot, 10);&lt;br /&gt;
  &lt;br /&gt;
         {{ccomment| Ziffer in Zeichen wandeln und speichern }}&lt;br /&gt;
         *(--s) = '0' + qrem.rem;&lt;br /&gt;
     } &lt;br /&gt;
     while (0 != qrem.quot);&lt;br /&gt;
  &lt;br /&gt;
     {{ccomment| Falls eine führende '0' gespeichert wurde: weg damit }}&lt;br /&gt;
     {{ccomment| ausser zahl war selbst schon 0 }}&lt;br /&gt;
     if (*s == '0' &amp;amp;&amp;amp; *(s+1) != '\0')&lt;br /&gt;
         s++;&lt;br /&gt;
 &lt;br /&gt;
     return s;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Falls man eine Division und/oder Rest für 8-Bit braucht, dann geht für &amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt; analog. &lt;br /&gt;
&lt;br /&gt;
'''Beispiel: BCD-Umrechnung'''&lt;br /&gt;
&lt;br /&gt;
Wandeln einer 8-Bit-Zahl &amp;lt;tt&amp;gt;0 &amp;amp;lt;= num &amp;amp;lt; 100&amp;lt;/tt&amp;gt; nach [[BCD]]&lt;br /&gt;
&lt;br /&gt;
 typedef struct&lt;br /&gt;
 {&lt;br /&gt;
     unsigned char quot; {{ccomment| Quotient }}&lt;br /&gt;
     unsigned char rem;  {{ccomment| Rest (remainder) }}&lt;br /&gt;
 } udiv8_t;&lt;br /&gt;
 &lt;br /&gt;
 extern udiv8_t udiv8 (unsigned char, unsigned char) __asm__ (&amp;quot;__udivmodqi4&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment| Wandelt num nach BCD um, 0 &amp;lt;&amp;amp;#61; num &amp;lt;&amp;amp;#61; 99 }}&lt;br /&gt;
 {{ccomment| return-Wert ist dann 0x0 &amp;lt;&amp;amp;#61; return &amp;lt;&amp;amp;#61; 0x99 }}&lt;br /&gt;
 unsigned char to_bcd (unsigned char num)&lt;br /&gt;
 {&lt;br /&gt;
     udiv8_t qrem = udiv8 (num, 10);&lt;br /&gt;
 &lt;br /&gt;
     return (unsigned char) (qrem.quot &amp;lt;&amp;lt; 4) | qrem.rem;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Division durch Multiplikation===&lt;br /&gt;
Bei den AVRs (Mega...) sind Multiplikationen deulich schneller als Divisionen. Besonders bei Fleißkommazahlen lohnt es daher eine Division durch die Multiplikation mit dem Kehrwert zu ersetzen. Bei Integer Zahlen sind dem durch die Rundung Grenzen gesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vermeiden von float und double===&lt;br /&gt;
GCC kennt für die AVRs zur Zeit nur einen Fleißkommatyp. Da keine Hardwareunterstützung dafür vorhanden ist, dauern Fleißkommarechnungen relativ lange. Gerade Additionen sind deutlich langsamer als bei Integer.  Auch die Codelänge nimmt erheblich zu, selbst wenn nur wenige Fleißkommazahlen genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Ein Alternative zu Fleißkommazahlen ist die Benutzung von Festkommazahlen, auch wenn die nicht direkt von GCC unterstützt werden. Die Werte werden einfach alle mit einem konstanten Faktor (z.B. 256,1024 oder 1000) skaliert.&lt;br /&gt;
Es wird dann mit Integer oder Long Integer gerechnet und bei Multiplicationen / Divisionen der zusätzliche Skalenfaktor berücksichtig.&lt;/div&gt;</summary>
		<author><name>SprinterSB_alt</name></author>	</entry>

	</feed>