<?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=Martin</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=Martin"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Martin"/>
	<updated>2026-04-06T14:20:56Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:TV-out&amp;diff=5816</id>
		<title>Diskussion:TV-out</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:TV-out&amp;diff=5816"/>
		<updated>2004-06-25T22:31:58Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki as its best!!&lt;br /&gt;
&lt;br /&gt;
Herzlichen Dank allen Bekannten und Unbekannten, die hier kürzlich etwas ergänzt haben. GENAU SO soll ein Wiki funktionieren. --[[Benutzer:Martin|Martin]] 00:31, 26. Jun 2004 (CEST)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Zahlensysteme&amp;diff=2599</id>
		<title>Zahlensysteme</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Zahlensysteme&amp;diff=2599"/>
		<updated>2004-06-25T14:59:16Z</updated>

		<summary type="html">&lt;p&gt;Martin: Oktalzahlen nach hinten verschoben und Beispiel hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei der Programmierung bekommt man es hauptsächlich mit 3 verschiedenen Zahlensystemen zu tun: dezimal, hexadezimal und binär (besser: dual).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hexadezimalzahlen werden meistens (z.B. in [[C]] oder im [[AVR]]-[[Assembler]]) mit dem Prefix &amp;quot;0x&amp;quot; geschrieben, also z.B. 0x3A.&lt;br /&gt;
Binärzahlen schreibt man im AVR-Assembler mit &amp;quot;0b&amp;quot; am Anfang, z.B. 0b00110100. In [[C]]-Programmen ist die direkte Eingabe von Binärzahlen nicht möglich, es lassen sich aber [[C Makros|Makros]] zu diesem Zweck schreiben.&lt;br /&gt;
&lt;br /&gt;
[[Assembler]] mit Intel-Syntax (z.B. für 80x86 oder [[8051]]) verwenden dagegen zur Kennzeichnung keinen Präfix sondern einen nachgestellten Buchstaben, für Hexzahlen gilt also z.B. die Notation 0A5H und für Binärzahlen dementsprechend 10100101B.&lt;br /&gt;
&lt;br /&gt;
Wie man Dezimalzahlen schreibt, muss ich hoffentlich nicht erklären ;-)&lt;br /&gt;
&lt;br /&gt;
Ein paar Beispiele für die Umrechnung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=1 cellspacing=0 cellpadding=4&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;dezimal&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;hexadezimal&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;bin&amp;amp;auml;r&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000000&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000001&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x0f&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00001111&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x64&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b01100100&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;255&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0xff&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b11111111&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie die Umrechnung mathematisch funktioniert, ist auf [http://schulen.freiepresse.de/gymnasiumolbernhau/informatik/stellenwertsysteme.htm] beschrieben ...oder funktioniert am einfachsten über den Windows-Taschenrechner (Ansicht=&amp;gt;wissenschaftlich).&lt;br /&gt;
&lt;br /&gt;
Oktalzahlen sind in der Mikrocontroller-Programmierung heute seltener anzutreffen. Praktisch sind sie vor allem dann, wenn Binärzahlen aus irgend einem Grund in Gruppen von jeweils drei Bit strukturiert sind. Das gilt z.B. für die Datei-Zugriffsrechte unter [[Unix]]/[[Linux]], die sich bequem durch Angabe einer Oktalzahl einstellen lassen. (Z.B. entspricht &amp;quot;751&amp;quot; dem Bitmuster &amp;quot;111 101 001&amp;quot; oder &amp;quot;rwxr-x --x&amp;quot; in der üblichen Zugriffsrecht-Darstellung.)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=TV-out&amp;diff=2584</id>
		<title>TV-out</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=TV-out&amp;diff=2584"/>
		<updated>2004-06-25T14:32:36Z</updated>

		<summary type="html">&lt;p&gt;Martin: Tuner -&amp;gt; Modulator und Tips zum Ausbau aus VCR als Fußnote am Ende&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mikrocontroller]] an den Fernseher anschließen.&lt;br /&gt;
&lt;br /&gt;
== Anschluß ==&lt;br /&gt;
Ein Fernseher hat oft mehrere Eingänge, die wichtigsten sind der Scartanschluß und der Antenneneingang. &lt;br /&gt;
&lt;br /&gt;
=== Scart ===&lt;br /&gt;
Am [http://www.darc.de/distrikte/y/00/html/tools/scart.htm Scartanschluß] sind u.a. der FBAS-Eingang und oft auch der RGB-Eingang zu finden; bei Videorecordern ist der RGB-Eingang dagegen nur sehr selten belegt.&lt;br /&gt;
&lt;br /&gt;
=== Antenneneingang ===&lt;br /&gt;
Damit man viele Sender über ein einziges Kabel übertragen kann, werden diese auf verschiedene Frequenzen moduliert. Das will man aber nicht selbst machen. Wer diesen Eingang benutzen will oder muss, der sollte einen fertigen HF-Modulator benutzen. Im Prinzip ist das ein &amp;quot;Mini-Fernsehsender&amp;quot;, der i.d.R. in einem bestimmten Bereich auf einen Kanal eigener Wahl eingestellt werden kann (z.B. 39..42). Man findet solche Modulatoren in Katalogen in der Nähe von Kameramodulen, etwa in der Preiskategorie um 30 EUR(*1).&lt;br /&gt;
&lt;br /&gt;
== Fernsehnormen ==&lt;br /&gt;
Die wichtigsten Fernsehnormen sind PAL, NTSC und SECAM. In Deutschland wird PAL verwendet, in den USA dagegen NTSC. Wenn man auf einem PAL-Fernseher ein NTSC-Bild darstellt, dann ist das Bild etwas kleiner und schwarzweiß.&lt;br /&gt;
&lt;br /&gt;
== Bilderzeugung ==&lt;br /&gt;
Das Bildsignal wird (F)BAS genannt (englisch: CVBS) und enhält nicht nur das eigentliche Bild, sondern auch Informationen wann eine Zeile bzw. das ganze Bild endet.&lt;br /&gt;
&lt;br /&gt;
Das Fernsehbild hat 625 Zeilen, wovon etwa 570 sichtbar sind. Es werden 50 Halbbilder pro Sekunde dargestellt, so daß man 15625 Zeilen pro Sekunde erhält. Die Horizontalauflösung liegt bei 768 Pixel, wobei der unsichtbare Rand nochmals etwa 25% ausmacht. &lt;br /&gt;
&lt;br /&gt;
Eine ausführliche Darstellung der Thematik findet sich z.B. [http://www.avmz.uni-siegen.de/medinfo/download/index.htm hier], Vorlesung Medientechnik II.&lt;br /&gt;
&lt;br /&gt;
Die Bilderzeugung ist ziemlich zeitintensiv, deswegen sollte der Mikrocontroller seine anderen Aufgaben im unsichtbaren Bildbereich erledigen&lt;br /&gt;
&lt;br /&gt;
=== Schwarzweiß ===&lt;br /&gt;
Bei Schwarzweiß- bzw. Graustufenbildern gibt es keine feste Horizontalauflösung. Wen man z.B. 4 Million Pixel pro Sekunde erzeugen kann, dann ergibt das eben eine Horizontalauflösung von 4000000/15625 - 25% = 192 Pixel. Beispiele: [http://members.ozemail.com.au/%7Eintello/video_s_w.htm Serielles Terminal], [http://jkdesign.de/avrproject/Die%20MAHPONG%20Seite.htm Pong-Spiel]&lt;br /&gt;
&lt;br /&gt;
=== Farbe ===&lt;br /&gt;
Es gibt drei Arten, wie man Farbbilder darstellen kann:&lt;br /&gt;
* Über den RGB-Eingang am Scart. Das ist die einfachste Art, aber nicht bei jedem Scarteingang ist RGB auch belegt und man kann das Bild nicht mit dem Videorekorder aufzeichnen.&lt;br /&gt;
* Man benutzt fertige ICs, die RGB nach FBAS wandeln können, z.B. den AD724, allerdings sind diese ICs meist relativ teuer. Beispiel: [http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2002/carlo/index.html  Snake-Spiel]. Achtung: NTSC, nicht PAL&lt;br /&gt;
* Man macht es rein in Software, das ist allerdings &#039;&#039;sehr&#039;&#039; zeitkritisch. Will man das vernünftig machen, dann sollte die CPU über 50MIPS Leistung haben. Beispiele: [http://www.serasidis.gr/circuits/colour_bar_gen/colour_bar_gen.htm Farbbalken], [http://www.rickard.gunee.com/projects/video/sx/tetris.php Tetris]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
* 1: Wer sich das Geld sparen will, kann auch versuchen, den Modulator in einem alten Videorekorder zu lokalisieren und auszubauen. Das ist meist gar nicht so schwer, denn da es sich um ein HF-erzeugendes Teil handelt, ist es zur Abschirmung oft in einem &amp;quot;silbernen Kästchen&amp;quot; mit etwa der Größe von ein bis zwei Streicholzschachteln irgendwo in der Nähe der Buchse verbaut, an der der Videorekorder normalerweise mit dem TV-Gerät verbunden wird. (Bitte nicht verwechseln mit der Buchse, über der der Videorekorder sein Signal von der (Haus-) Antenne erhält, möglichwerweise sitzt dort auch ein abgeschirmtes Kästchen, das wäre dann aber der für den TV-&#039;&#039;Empfang&#039;&#039; zuständige &#039;&#039;Tuner&#039;&#039;.) Natürlich muss man dann noch herausfinden, woher der Modulator sein TV-Signal bekommt, welche Versorgungsspannung(en) er braucht, und wenn die Abstimmung auf einen bestimmten Kanal nicht via Poti oder einem anderen, &amp;quot;offensichtlichen&amp;quot; Einsteller erfolgt, muss man auch noch herausfinden, wie dies zu bewerkstelligen ist ... (also vielleicht doch lieber im Katalog nachsehen?)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Spannungsreferenz&amp;diff=2685</id>
		<title>Spannungsreferenz</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Spannungsreferenz&amp;diff=2685"/>
		<updated>2004-06-21T16:06:07Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schaltung oder Bauelement, das eine Spannung definierter Höhe bereitstellt.&lt;br /&gt;
&lt;br /&gt;
Sehr viele elektronische Schaltungen arbeiten nur &amp;quot;relativ&amp;quot;, das heißt zum Beispiel&lt;br /&gt;
* ein Netzteil, das eine stabilisierte Betriebsspannung für einen Mikrocontroller liefern soll, hält diese tatsächlich nur in Relation zu einem Vergleichswert konstant,&lt;br /&gt;
* oder ein [[ADC|Analog-Digital-Converter]], der einen analogen Spannungswert messen soll, ermittelt den digitalen Wert tatsächlich nur im Relation zu einer Bezugsgröße.&lt;br /&gt;
&lt;br /&gt;
Als Vergleichs- und Bezugsgrößen eignet sich in einfachen Fällen &lt;br /&gt;
* eine (oder mehrere) in Durchlassrichtung geschaltete [[Diode]](n)&lt;br /&gt;
* oder eine [[Z-Diode]].&lt;br /&gt;
Durch Herstellungstoleranzen und Temperatureinflüsse ist die Genaugkeit hier allerdings recht beschränkt.&lt;br /&gt;
&lt;br /&gt;
Für höhere Ansprüche gibt es spezielle Bauteile in Form integrierter Schaltungen. Herstellungstoleranzen werden dabei durch einen genauen Abgleich bei (bzw. nach) der Produktion noch im Hause des Herstellers ausgeglichen. Der Temperaturdrift wirken geeignete Schaltungsmaßnahmen entgegen (oder solche Bauteile heizen sich selbst auf eine bestimmte Temperatur auf, die sie dann konstant halten).&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:8048&amp;diff=14293</id>
		<title>Diskussion:8048</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:8048&amp;diff=14293"/>
		<updated>2004-06-21T16:00:16Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich finde die Informationen im Artikel etwas dürftig.   :)&lt;br /&gt;
&lt;br /&gt;
* Der Einwand ist berechtigt, wenn du weitere Informationen über den 8048 hast, immer her damit - andererseits würde es mehr Sinn machen sich um aktuelle Themen zu kümmern. --[[Benutzer:Andreas|Andreas]] 16:09, 20. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
* Ein Wiki ist das Ergebnis dessen, was seine Benutzer schreiben. Es ist richtig, dass die Seite zum 8048 lächerlich ist (wie W.W.) sagt, und es ist richtig, dass es spannendere Themen gibt als den 8048 (wie Andreas sagt). Dazu ein Vorschlag: Wer auf einer so dürftigen Seite wie der zum 8048 eine BESTIMMTE Information gesucht und nicht gefunden hat, kann doch&lt;br /&gt;
:* seine konkrete Frage einfach dort hinterlassen, oder&lt;br /&gt;
:* und wenn er später woanders die Antwort gefunden hat, die Frage durch die Antwort ersetzen.&lt;br /&gt;
(Auf gut ausgearbeiteten und logisch strukturierten Seiten finde ich dagegen die Verwendung der Diskussionseite für Fragen besser.)&lt;br /&gt;
Ein Wiki kann als Informationsquelle nur dann GEZIELT wachsen, wenn man weiß, was den Lesern fehlt. Einfach &amp;quot;auf Verdacht&amp;quot; hin jetzt etwas zum 8048 zu schreiben, halte ich auch für schlecht genutzte Zeit.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Martin|Martin]] 16:45, 20. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Oje, ich wollte doch nicht den 3. Weltkrieg auslösen!&lt;br /&gt;
&lt;br /&gt;
Vielleicht schreib ich lieber mal was zum 8051.&lt;br /&gt;
&lt;br /&gt;
Davon versteh ich wenigstens was.   :-)&lt;br /&gt;
&lt;br /&gt;
W.W.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Meinst du die Gefahr (3. Weltkrieg auslösen) bestand :-)&lt;br /&gt;
&lt;br /&gt;
OK, du hast diese Seite hier initiiert, dann obliegt es dir, sie jetzt auch wieder zu löschen, zumal der mickrige 8048-Seite ja auch schon weg ist.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Martin|Martin]] 18:00, 21. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
PS: Auf den 8051-Artikel von dir freue ich mich schon.&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Spannungsreferenz&amp;diff=2564</id>
		<title>Spannungsreferenz</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Spannungsreferenz&amp;diff=2564"/>
		<updated>2004-06-20T23:28:33Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schaltung oder Bauelement, das eine Spannung definierter Höhe bereitstellt.&lt;br /&gt;
&lt;br /&gt;
Sehr viele elektronische Schaltungen arbeiten nur &amp;quot;relativ&amp;quot;, das heißt zum Beispiel&lt;br /&gt;
* ein Netzteil, das eine stabilisierte Betriebsspannung für einen Mikrocontroller liefern soll, hält diese tatsächlich nur in Relation zu einem Vergleichswert konstant,&lt;br /&gt;
* oder ein [[ADC|Analog-Digital-Converter]], der einen analogen Spannungswert messen soll, ermittelt den digitalen Wert tatsächlich nur im Relation zu einer Bezugsgröße.&lt;br /&gt;
&lt;br /&gt;
Als Vergleichs- und Bezugsgrößen eignen sich in einfachen Fällen &lt;br /&gt;
* eine oder mehrere in Durchlassrichtung geschaltete [[Diode]]en&lt;br /&gt;
* oder [[Z-Diode]n.&lt;br /&gt;
Durch Herstellungstoleranzen und Temperatureinflüsse ist die Genaugkeit hier allerdings recht beschränkt.&lt;br /&gt;
&lt;br /&gt;
Für höhere Ansprüche gibt es spezielle Bauteile in Form integrierter Schaltungen. Herstellungstoleranzen werden dabei durch einen genauen Abgleich bei (bzw. nach) der Produktion noch im Hause des Herstellers ausgeglichen. Der Temperaturdrift wirken geeignete Schaltungsmaßnahmen entgegen (oder solche Bauteile heizen sich selbst auf eine bestimmte Temperatur auf, die sie dann konstant halten).&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Durchlass-Spannung&amp;diff=3036</id>
		<title>Durchlass-Spannung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Durchlass-Spannung&amp;diff=3036"/>
		<updated>2004-06-20T22:43:03Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diejenige Spannung ab der bei einem in Durchlassrichtung geschalteten PN-Übergang eines Halbleiter-Bauelements der Stromfluss einsetzt.&lt;br /&gt;
&lt;br /&gt;
Die Durchlass-Spannung hängt mit eng mit dem Halbleiter-Material zusammen, beim heute (noch) meist verwendeten Silizium beträgt sie beispielsweise  0,7 Volt. Die Durchlass-Spannung ist darüberhinaus von der Temperatur abhängig - über einen weiten Bereich sogar fast linear - bei höheren Temperaturen sinkt sie.&lt;br /&gt;
&lt;br /&gt;
Bestehen keine all zu hohen Ansprüche, kann man die Durchlass-Spannung einer oder mehrerer (in Serie geschalteter) Dioden als [[Spannungs-Referenz]] verwenden.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diode&amp;diff=2665</id>
		<title>Diode</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diode&amp;diff=2665"/>
		<updated>2004-06-20T22:34:41Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ursprünglich für Elektronenröhren mit zwei Elektroden verwendetes Wort(*1), später auf das Halbleiter-Bauteil mit dem selben elektrischen Verhalten übertragen.&lt;br /&gt;
&lt;br /&gt;
Eine Diode sperrt den Stromfluss in einer Richtung und erlaubt ihn in der anderen. Als diskretes Bauteil besitzen (Halbleiter-) Dioden i.d.R. einen aufgedruckten Ring. Liegt an dem Anschluss, der sich &#039;&#039;&#039;näher&#039;&#039;&#039; an diesem Ring befindet, eine negative Spannung, ist die Diode in Durchlassrichtung geschaltet, d.h. sobald die [[Durchlass-Spannung]] überschritten wird, setzt der Stromfluss ein. Bei der umgekehrten Polarität &amp;quot;sperrt&amp;quot; die Diode den Stromfluss.&lt;br /&gt;
&lt;br /&gt;
Dioden werden in elektronischen Schaltungen sehr häufig und zu ganz unterschiedlichen Zwecken eingesetzt, z.B&lt;br /&gt;
* zur Gleichrichtung,&lt;br /&gt;
* als [[Spannungs-Referenz]] (siehe auch [[Z-Diode]]),&lt;br /&gt;
* elektrisch veränderliche Kapazität (Varaktor), oder&lt;br /&gt;
* Schutz gegen falsche Polung und Überspannung.&lt;br /&gt;
Dioden mit der letzteren Funktion sind heute auch oft in ICs wie Mikrocontroller integriert und helfen, die Ein- und Ausgangs-Pins dieser teilweise sehr teuren Bauelemente vor (moderater) Fehlbehandlung zu schützen.&lt;br /&gt;
&lt;br /&gt;
Eine Sonderform von Dioden sind [[LED]]s, die elektrisch zwar auch Diodenverhalten besitzen, deren eigentlicher Zweck aber die Erzeugung von (sichtbarem oder infrarotem) Licht ist.&lt;br /&gt;
&lt;br /&gt;
== Web-Links ==&lt;br /&gt;
&lt;br /&gt;
[http://wikipedia/Diode Diode bei Wikipedia]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
* 1: &amp;quot;Di&amp;quot; wegen &#039;&#039;&#039;zwei&#039;&#039;&#039; und &amp;quot;ode&amp;quot; vermutlich wegen Elektr&#039;&#039;&#039;ode&#039;&#039;&#039;, auch wenn bei Wikipedia was anders steht (Es gibt bei den Elektroneröhren z.B. auch &#039;&#039;Tri&#039;&#039;oden mit drei oder &#039;&#039;Pent&#039;&#039;oden mit fünf Elektroden.)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=LED&amp;diff=2559</id>
		<title>LED</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=LED&amp;diff=2559"/>
		<updated>2004-06-20T21:52:08Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Light Emitting Diode&lt;br /&gt;
&lt;br /&gt;
Eine LED besteht aus einem [[Halbleiter]] PN-Übergang der durch seine Zusammensetzung Licht eines stark begrenzten Wellenbereiches emitiert, wenn er in Durchlassrichtung von Strom durchflossen wird.&lt;br /&gt;
&lt;br /&gt;
LEDs haben einen im Vergleich zu gewöhnlichen [[Diode]]n eine vergleichsweise hohe [[Durchlass-Spannung]]. Bevor diese erreicht wird, fließt kein Strom, (und die LED leuchtet natürlich auch nicht). Oberhalb der Durchlass-Spannung steigt der Strom schnell an. Da LEDs durch einen zu hohen Strom zerstört werden, muss der Strom auf begrenzt werden. (Typische Maximalwerte liegen abhängig von der LED z.B. bei 2 oder auch 20mA.)&lt;br /&gt;
&lt;br /&gt;
Im einfachsten Fall und bei relativ geringfügig variierender Betriebsspannnung kann man dazu einen [[Widerstand]] einsetzen. Bei 6V Betriebsspannung, einer Duchlass-Spannung der LED von 2,4V und einem gewünschten Strom von 10mA braucht man nach dem Ohmschen Gesetz einen Widerstand von 360 Ohm, bei 12V Betriebsspannung sind es 960 Ohm (in der Praxis jeweils der nächstgrößere, verfügbare Wert).&lt;br /&gt;
&lt;br /&gt;
Wie man aus dem Beispiel erkennt, ist bei stark variierender Betriebsspannung ein Vorwiderstand weniger geeignet - es sei denn, man nimmt sehr unterschiedliche LED-Ströme in Kauf und damit auch sehr unterschiedliche LED-Helligkeiten. (Mit einem 1KOhm Widerstand, der für 12V Betriebsspannung &amp;quot;passend&amp;quot; wäre, würden bei 6 Volt statt 10mA nur noch 3,6mA fließen.) Ausweg ist hier eine Konstantstromquelle.&lt;br /&gt;
&lt;br /&gt;
== Web-Links ==&lt;br /&gt;
[http://de.wikipedia.org/wiki/Konstantstromquelle Konstantstromquelle bei Wikipedia] (ist für das LED-Beispiel aber nicht so toll)&lt;br /&gt;
&lt;br /&gt;
[http://www.elexs.de/kap5_9.htm Konstantstromquelle bei ELEXS] (schon besser :-))&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=MMU&amp;diff=2558</id>
		<title>MMU</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=MMU&amp;diff=2558"/>
		<updated>2004-06-20T21:16:54Z</updated>

		<summary type="html">&lt;p&gt;Martin: Beispiel für einfache MMU ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;M&#039;&#039;&#039;emory &#039;&#039;&#039;M&#039;&#039;&#039;anagement &#039;&#039;&#039;U&#039;&#039;&#039;nit&lt;br /&gt;
&lt;br /&gt;
Die MMU hat prinzipiell die Aufgabe, virtuelle Adressbereiche in reale Adressen umzusetzen. Dies erlaubt Speicherbereiche untereinander zu isolieren und jedem Programm (Task) den scheinbar gleichen Adressraum zur Verfügung zu stellen, unabhängig davon wo dieser wirklich im Speicher liegt.&lt;br /&gt;
&lt;br /&gt;
Eine sehr einfache MMU kann z.B. so aussehen: Die höchstwertigen 4 Adress-Leitungen eines 16 Bit Adressraum werden an ein 16x8 Bit RAM geführt, welches zu den 16 möglichen Kombinationen dieser &#039;&#039;&#039;4 Adressbits&#039;&#039;&#039; jeweils &#039;&#039;&#039;8 Bit ausgibt&#039;&#039;&#039;. Diese 8 Bit werden mit den unverändert beibehaltenen unteren 12 Bit der urpsprünglichen Adresse zu einer 20 Bit Adresse zusammengefasst, mit welcher der tatsächliche vorhandene Speicher (von bis zu 1 MByte) adressiert wird.&lt;br /&gt;
&lt;br /&gt;
Voraussetzung ist nun lediglich, dass das 16x8-RAM schnell genug ist, so dass die Adressumsetzung (oberste 4 -&amp;gt; 8 Bit) kein Einschieben von Wartezyklen nötig macht, dann können mehrere einzelne, im Zeitscheibenverfahren ablaufende Programme völlig &amp;quot;transparent&amp;quot; jeweils ihren eigenen (physikalischen) Speicherbereich nutzen. Dazu muss nur der [[Scheduler]] beim Umschalten von einer Task zur nächsten das 16x8-RAM entsprechend umladen. Alle ablaufenden Programme sprechen scheinbar den selben (virtuellen) Adressraum von &amp;quot;0x0000 .. 0xFFFF&amp;quot; an.&lt;br /&gt;
&lt;br /&gt;
Neben diesem grundlegenden &#039;&#039;Adress-Mapping&#039;&#039; bieten reale MMUs, wie man sie heute bei Rechnern von der PC-Klasse an aufwärts Standard sind, auch Funktionen wie Speicherschutz (read-only, execute, no-execute, usw). oder können den Zugriff auf bestimmte Speichertele auf bestimmte, privilegierte Code-Abschnitte (Betriebssystem-[[Kernel]]) beschränken.&lt;br /&gt;
&lt;br /&gt;
== Web-Links ==&lt;br /&gt;
 &lt;br /&gt;
[http://de.wikipedia.org/wiki/MMU MMU bei Wikipedia].&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=L%C3%B6tkolben&amp;diff=3807</id>
		<title>Lötkolben</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=L%C3%B6tkolben&amp;diff=3807"/>
		<updated>2004-06-20T20:21:11Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Lötkolben ist das zur manuellen Erstellung von Lötverbindungen vorwiegend benutzte Werkzeug.&lt;br /&gt;
&lt;br /&gt;
Da im professionellen Bereich sowie unter erfahrenen Elektronikern das entsprechende Know-How sicher vorhanden ist, wendet sich diese Seite in erster Linie an Hobbyisten und andere Einsteiger, etwa solche, die als ehemalige &amp;quot;reine&amp;quot; Software-Entwickler nun im hardwarenahen Bereich ihre ersten Schritte mit Mikrocontroller-Aufbauten machen möchten.&lt;br /&gt;
&lt;br /&gt;
== Arten von Lötkolben ==&lt;br /&gt;
&lt;br /&gt;
Um elektronische Schaltungen aufzubauen, sollte man zunächst Wissen, welche Art von Lötkolben wozu geeignet ist.&lt;br /&gt;
&lt;br /&gt;
=== Lötnadeln (ca. 5..10 Watt) ===&lt;br /&gt;
&lt;br /&gt;
Diese &amp;quot;Miniatur-Lötkolben&amp;quot; sind nur für feinste Arbeiten sinnvoll (bei denen man oft auch eine Lupe einsetzen wird), z.B.:&lt;br /&gt;
* Anlöten extrem dünner Drähte (etwa solche aus der &amp;quot;Wire-Wrap&amp;quot;-Wickeltechnik);&lt;br /&gt;
* Korrektur- und Nachlötungen bei beengten Verhältnissen (z.B. an SMD-Bauteilen);&lt;br /&gt;
* Reparatur schmaler Leiterbahnen mit einem Haarriss (oder vorsorgliches Verzinen beim Verdacht auf einen solchen).&lt;br /&gt;
&lt;br /&gt;
Lötnadeln werden häufig mit Niederspannung versorgt (z.B. 12 Volt) und können daher mit Hilfe eines einstellbaren Netzteils auch mit etwas Unter- oder Übertemperatur betrieben werden. Generell sind sie aber eher ein Werkzeug für den &amp;quot;fortgeschrittenen&amp;quot; (Hobby-) Elektroniker und nicht so gut geeignet, um überhaupt erst einmal Übung im Löten zu bekommen.&lt;br /&gt;
&lt;br /&gt;
=== Feinlötkolben (ca. 15..20 Watt) ===&lt;br /&gt;
Diese kleinen, leichten Lötkolben sind für den Anfänger, die wenig Geld ausgeben wollen (z.B. Schüler) am ehesten zu empfehlen, vor allem dann, wenn es hauptsächlich um die Bestückung [[PCB|gedruckter Schaltungen]] oder das An- und Ablöten dünner Drähte und Litzen geht. Lediglich für das Herstellen von Verbindungen, über die später stärkere Ströme (im Bereich einiger Ampere) fließen sollen, also z.B. zum Auflöten einer Litze höheren Querschnitts auf eine größere Kupferfläche sind sie etwas schwach.&lt;br /&gt;
&lt;br /&gt;
Auch diese Art von Lötkolben gibt es für Niederspannung - man braucht dann zwar zum Betrieb ein entsprechendes Netzteil, kann dafür aber (bei einstellbarer Ausgangsspannung des Netzteil) die Leistung des Lötkolbens variieren.&lt;br /&gt;
&lt;br /&gt;
=== Elektronik-Universallötkolben (ca. 30 Watt) ===&lt;br /&gt;
Dies ist eigentlich das &amp;quot;Standardwerkzeug&amp;quot; aber für alle, die hauptsächlich Schaltungsaufbauten im Bereich Mikrocontroller erstellen, fast schon unnötig groß. Ausgestattet mit unterschiedlichen Lötspitzen (siehe unten) sind Lötkolben dieser Klasse für viele Arbeiten geeignet, wenn auch meist etwas unhandlicher als Feinlötkolben.&lt;br /&gt;
&lt;br /&gt;
Auszunehmen sind lediglich die oben unter &amp;quot;Lötnadel&amp;quot; beschriebenen Arbeiten - es sei denn man hat wirklich großes Geschick und eine sehr ruhige Hand. Am anderen Ende der Skala denkbarer Arbeiten wird man sich allenfalls für das zügige An- und Ablöten sehr dicker Drähten oder Litzen auf/von massiven Metallteilen manchmal mehr Leistungsreserve wünschen, kommt i.d.R. aber auch mit einem 30 Watt Lötkolben zum Erfolg.&lt;br /&gt;
&lt;br /&gt;
Da solche Lötkolben typischerweise an 230 Volt betrieben werden, erübrigt sich auch ein eigenes Netzteil (bzw. man kann die Spannung seines Labor-Netzteils stets für den Versuchsaufbau passend eingestellt lassen), auf der anderen Seite entfällt damit die Möglichkeit, die Leistung des Lötkolbens in einem gewissen Umfang zu variieren.&lt;br /&gt;
&lt;br /&gt;
=== Temperaturgeregelte Lötkolben (ca. 60 Watt) ===&lt;br /&gt;
&amp;quot;Mehr&amp;quot; ist nicht immer automatisch &amp;quot;besser&amp;quot;, und so ist eine höhere Leistung bei Lötkolben problematisch, weil der Lötkolben &amp;quot;im Leerlauf&amp;quot; oder bei kleineren Lötstellen zu heiß werden kann. Aus diesem Grund sollte man in der Leistungsklasse oberhalb 30 Watt besser gleich in einen temperaturgeregelten Lötkolben investieren. Zwar sind diese deutlich teurer als Lötkolben der ersten drei Kategorien, aber ein zerstörtes Bauteil oder verdorbene Platinen sind auf Dauer vielleicht teurer und auf jeden Fall ärgerlich.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Vorteil der Investition in einen solchen Lötkolben ist, dass sich damit auch schon mal kleinere Reparaturarbeiten außerhalb des Elektronikbereichs durchführen lassen (z.B. Spielzeug usw.).&lt;br /&gt;
&lt;br /&gt;
=== Große Lötkolben (über 60 Watt) ===&lt;br /&gt;
Diese sind in der Regel kein Werkzeug für den Elektroniker - es sei denn man denkt an das Verlöten von Metallgehäusen zur Abschirmung - und eher für allgemeine Reparaturen im Haushalt geeignet. (Aber wenn man durch die Beschäftigung mit der Elektronik schon mal &amp;quot;das Löten gelernt hat&amp;quot;, will man diese Fähigkeiten vielleicht auch anderweitig einsetzen ...)&lt;br /&gt;
&lt;br /&gt;
== Arten von Lötspitzen ==&lt;br /&gt;
Bei den meisten Lötkolben kann die eigentliche Lötspitze ausgwechselt werden. Dies ist zum einen erforderlich, weil sich die Spitze im Lauf der Zeit abnutzt (was aber je nach Nutzungshäufigkeit des Lötkolbens und Materialqualität der Spitze Jahre dauern kann). Zum anderen wird man insbesondere bei stärkeren Lötkolben abhängig von der Arbeit, die man durchführen möchte, unterschiedlich geformte Spitzen benötigen. &lt;br /&gt;
&lt;br /&gt;
=== Kegelförmig ===&lt;br /&gt;
Leicht kegelförmige Spitzen, die vorne in einer Halbkugel (Durchmesser meist unter 1 mm) auslaufen, eignen sich besonders für &amp;quot;beengte Verhältnisse&amp;quot;, also nahe beieinander liegende Pins, geringen Leiterbahnabstand usw. Das Problem solcher Spitzen bei anderen Arbeiten ist, dass die Kontaktfläche zu den zu verlötenden Teilen recht gering ist. Da beim Löten - wie unter &amp;quot;[[Löten (praktisch)]]&amp;quot; ausgeführt - stets die zu verlötenden Teile und nicht das Lötzinn erwärmt werden sollte, kann das Herstellen größerer Lötverbindungen mit solchen Spitzen länger als nötig dauern. Die Folge können durch Hitze zerstörte Bauteile sein (wenn die Spitze so gehalten wurde, dass vor allem das Bauteil, nicht aber die Leiterbahn erwärmt wurde) oder sich ablösende Leiterbahnen (im umgekehrten Fall).&lt;br /&gt;
&lt;br /&gt;
=== Breit und Flach ===&lt;br /&gt;
Mit diesen, etwa nach der Art eines Schraubendrehers (aka. &amp;quot;Schraubenzieher&amp;quot; - aber nicht nach DIN! :-)) geformten Lötspitzen lässt sich je nach dem, wie man sie ansetzt, ein größerer oder kleinerer Kontakt zu den zu verlötenden Teilen herstellen. Unter beengten Verhältnissen ist aber, selbst wenn man sie &amp;quot;hochkant&amp;quot; hält, die Gefahr gegeben, Lötzinn an Stellen zu verschmieren, wo es nicht hingehört und z.B. zu einem Kurzschluss führt.&lt;br /&gt;
&lt;br /&gt;
=== Zylindrisch/Angeschrägt ===&lt;br /&gt;
Es ist sicher auch eine Geschmacks- und Übungssache, aber Spitzen, die eine zylindrische Grundform haben (Durchmesser etwa 1,5..2,5 mm) und vorne im Winkel von ca. 45 Grad angeschnitten sind, bieten eine überraschend große Bandbreite von Einsatzmöglichkeiten. Insbesondere für etwas &amp;quot;faule&amp;quot; und &amp;quot;ungeduldige&amp;quot; Naturen, die nicht dauernd zwischen den verschiedenen Lötspitzen ihres Lötkolbens wechseln wollen, sind solche Spitzen günstig. Aufgrund der Asymmetrie findet man ferner - etwas Übung vorausgesetzt - mit solchen Spitzen fast immer einen Ansatzpunkt, der es erlaubt, die beiden zu verlötenden Teile gleichmäßig schnell zu erwärmen. (Achtung: Gleichmäßig beudetet hier vor allem, dass man ggf. das Teil mit der geringeren thermischen Masse, das sich also &#039;&#039;schneller&#039;&#039; erwärmen wird, auch nur mit der &#039;&#039;kleineren&#039;&#039; Fläche der Spitze in Kontakt bringen wird!)&lt;br /&gt;
&lt;br /&gt;
=== Abgewinkelt vs. Gerade ===&lt;br /&gt;
Auch hier mag Erfahrung, Übung und Geschick eine Rolle spielen, aber im Bereich der (Fein-) Elektronik werden meist gerade Spitzen bevorzugt. Insbesondere beim Löten auf gedruckten Schaltungen erlaubt die &amp;quot;bleistiftähnliche&amp;quot; Haltung eines Lötkolbens mit gerader Spitze eine präzisere Positionierung.&lt;br /&gt;
&lt;br /&gt;
=== Spezielle Spitzen ===&lt;br /&gt;
Für temperaturgeregelte Lötkolben gibt es als Sonderzubehör meist spezielle Lötspitzen zum Entlöten, z.B. solche, die sämtliche Pins eines ICs auf einmal erhitzen, oder Spitzen mit einer Bohrung im Inneren und einem aufgesetzten Gummiball, durch die man Lötzinn absaugen kann.&lt;br /&gt;
&lt;br /&gt;
== Noch etwas &amp;quot;Theorie&amp;quot; ==&lt;br /&gt;
An dieser Stelle noch einmal kurz zum Einfluss von Leistung und Temperatur auf das Lötergebnis.&lt;br /&gt;
&lt;br /&gt;
=== Einfluss der Leistung ===&lt;br /&gt;
Ein Lötkolben höherer Leistung ist vor allem dann angebracht, wenn größere Metallteile (z.B. großflächige Masse-Leiterbahnen) erwärmt werden müssen. Dass ein Lötkolben für eine bestimmte Arbeit &amp;quot;deutlich zu schwach&amp;quot; ist, merkt man daran, dass die Lötspitze nach dem ersten Aufsetzen kurz &amp;quot;anklebt&amp;quot;, weil die große kalte Fläche das an der Spitze des Lötkolbens hängende, geschmolzene Lötzinn wieder fest werden lässt.&lt;br /&gt;
&lt;br /&gt;
Bei ungeregelten Lötkolben wird hier zusätzlich die &amp;quot;thermische Masse&amp;quot; der Lötspitze ins Spiel kommen, d.h. mit einer massiven Spitze, die selbst sehr viel mehr Wärme speichert als die zu verlötenden Teile, wird sich dieser Effekt kaum einstellen, mit der dünnen Spitze einer sehr feinen Lötnadel schon eher. Bei einem Niederspannungslötkolben, den man über ein einstellbares Netzteil betreibt, kann man in diesem Fall über die Spannung die Leistung etwas erhöhen. Aber Achtung: Der Zusammenhang ist nicht linear, 10% mehr Spannung sind rund 21% mehr Leistung, 20% mehr Spannung rund 45% mehr Leistung(*1).&lt;br /&gt;
&lt;br /&gt;
=== Einfluss der Temperatur ===&lt;br /&gt;
Bekanntlich vertragen Halbleiterbauteile es nicht, wenn sie zu heiß werden. Das gilt nicht nur für die Wärme, die sie im laufenden Betrieb selbst entwickeln, sondern auch für die Erhitzung ihrer Anschlussdrähte oder -pins beim Löten.&lt;br /&gt;
&lt;br /&gt;
Ein Fehlschluss wäre es nun aber anzunehmen, dass man durch eine geringere Temperatur des Lötkolbens dieser Gefahr vorbeugen könnte. Bis die über einen Draht oder Pin zugeführte Wärme das Innere des Bauteils erreicht (wo die hohe Temperatur ihre schädlichen Auswirkungen entfaltet), vergehen einige Sekunden. Braucht man aufgrund verringerter Temperatur nun für den gesamten Lötvorgang doppelt oder dreimal so lang, wird dies die Gefahr für das Halbleiterbauelement sogar erhöhen - ob die Lötspitze dann eine Temperatur 350 Grad oder &amp;quot;nur&amp;quot; 280 Grad hat, ändert nicht viel. Merke: Weniger die geringe Temperatur als ein zügiger Lötvorgang sollte das Ziel sein! (Allerdings wird sich bei zu hoher Temperatur das Flussmittel im Lötzinn möglicherweise verflüchtigen, ohne ausreichend Wirkung entfaltet zu haben!)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
* 1: Wieviel Mehrleistung man dem Lötkolben zumuten darf, bevor er kaputt geht, ist schwer zu sagen. Der Autor dieser Zeilen verwendet seit über 30 Jahren für die meisten seiner Aufbauten einen Lötkolben von 12 Watt, der &amp;quot;offiziell&amp;quot; mit 6 Volt zu betreiben ist. Tatsächlich wird der Lötkolben aber je nach Bedarf mit 5, 6 oder 7 Volt betrieben, entsprechend einer Mehr- und Minderleistung von etwa 30%.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:8048&amp;diff=2562</id>
		<title>Diskussion:8048</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:8048&amp;diff=2562"/>
		<updated>2004-06-20T14:45:48Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich finde die Informationen im Artikel etwas dürftig.   :)&lt;br /&gt;
&lt;br /&gt;
* Der Einwand ist berechtigt, wenn du weitere Informationen über den 8048 hast, immer her damit - andererseits würde es mehr Sinn machen sich um aktuelle Themen zu kümmern. --[[Benutzer:Andreas|Andreas]] 16:09, 20. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
* Ein Wiki ist das Ergebnis dessen, was seine Benutzer schreiben. Es ist richtig, dass die Seite zum 8048 lächerlich ist (wie W.W.) sagt, und es ist richtig, dass es spannendere Themen gibt als den 8048 (wie Andreas sagt). Dazu ein Vorschlag: Wer auf einer so dürftigen Seite wie der zum 8048 eine BESTIMMTE Information gesucht und nicht gefunden hat, kann doch&lt;br /&gt;
:* seine konkrete Frage einfach dort hinterlassen, oder&lt;br /&gt;
:* und wenn er später woanders die Antwort gefunden hat, die Frage durch die Antwort ersetzen.&lt;br /&gt;
(Auf gut ausgearbeiteten und logisch strukturierten Seiten finde ich dagegen die Verwendung der Diskussionseite für Fragen besser.)&lt;br /&gt;
Ein Wiki kann als Informationsquelle nur dann GEZIELT wachsen, wenn man weiß, was den Lesern fehlt. Einfach &amp;quot;auf Verdacht&amp;quot; hin jetzt etwas zum 8048 zu schreiben, halte ich auch für schlecht genutzte Zeit.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Martin|Martin]] 16:45, 20. Jun 2004 (CEST)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=L%C3%B6ten&amp;diff=2542</id>
		<title>Löten</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=L%C3%B6ten&amp;diff=2542"/>
		<updated>2004-06-19T22:54:25Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Löten in der Elektronik ist eine praktisch-handwerkliche Tätigkeit und erfordert daher neben entsprechendem Geschick in erster Linie ... viel Übung!!&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Wichtigste Voraussetzungen für das Löten in der Elektronik sind&lt;br /&gt;
* ein [[Lötkolben]]&lt;br /&gt;
* und Lötzinn,&lt;br /&gt;
beides muss natürlich für Elektronik geeignet sein. Lötzinn für die Elektronik ist beispielsweise im Inneren mit einem Flussmitel gefüllt, welches eine leichte Oberflächenkorrosion beseitigt, die anderfalls das Anhaften des Lötzinns auf den zu verlötenden Oberflächen verhindern würde.&lt;br /&gt;
&lt;br /&gt;
== Vorsichtsmaßnahmen ==&lt;br /&gt;
Da man es beim Löten in der Elektronik mit über 300 Grad heißen Metallen (fest und flüssig) zu tun hat, ist die Notwendigkeit einiger Schutzmaßnahmen so naheliegend, dass man sie nicht weiter erklären muss (niemand wird einen Lötkolben freiwillig an der heißen Spitze anfassen), aber dennoch (und aus der Praxis):&lt;br /&gt;
* Der heiße Lötkolben wird unachtsam auf dem Tisch abgelegt und verrutscht.&lt;br /&gt;
:* =&amp;gt; Andere, Gegenstände werden &amp;quot;angekokelt&amp;quot; oder gar unbrauchbar.&lt;br /&gt;
* Wie zuvor, aber der Lötkolben rutscht sogar vom Tisch herunter.&lt;br /&gt;
:* =&amp;gt; AUA!! (Der normale &amp;quot;Greifreflex&amp;quot; mit den Oberschenkeln bei herunterfallenden Dingen - Knie zusammen - ist dann nicht so angebracht :-/)&lt;br /&gt;
* Ein unzureichend festgeklemmter Draht federt weg und es spritzt Lötzinn durch die Gegend (besonders beim Entlöten!).&lt;br /&gt;
:* =&amp;gt; Augen schützen!!! (Man hat nur zwei und mit einem allein ist schon mal das Stereo-Sehen hin!)&lt;br /&gt;
&lt;br /&gt;
== Grundlegende Vorgehensweise ==&lt;br /&gt;
Beim Löten gilt:&lt;br /&gt;
# Mit dem Lötkolben werden &#039;&#039;&#039;beide&#039;&#039;&#039; zu verlötenden Teile gleichzeitig erwärmt.&lt;br /&gt;
# Eines der Teile erwärmt das Lötzinn bis es schließlich schmilzt.&lt;br /&gt;
# Das geschmolzene Lötzinn verläuft und verbindet die beiden Teile.&lt;br /&gt;
# Der Lötkolben wird entfernt und das Lötzin erstarrt.&lt;br /&gt;
&lt;br /&gt;
Eine geringe(!) Menge Lötzinn, die  vor dem ersten Schritt auf die heiße Spitze des Lötkolbens aufgetragen wird, dient vor allem dazu, den Wärmeübergang auf die zu verlötenden Teile zu verbessern und damit die Dauer des ersten Schritts kurz zu halten.&lt;br /&gt;
&lt;br /&gt;
== Typische Fehlerquellen ==&lt;br /&gt;
Anfänger machen beim Löten eine Reihe typischer Fehler, welche die Qualität der hergestellten Verbindung beeinträchtigen. Das heißt, die elektrische Verbindung ist schlecht (&amp;quot;Wackelkontakt&amp;quot;) und die mechanische Festigkeit gering (Gefahr des Abreißens).&lt;br /&gt;
* Die zu verlötenden Teile sind nicht ausreichend sauber (&amp;quot;blank&amp;quot;):&lt;br /&gt;
:* =&amp;gt; Die korrosionsbefreiende Wirkung des Flußmittels im Lötzinn reicht nicht aus.&lt;br /&gt;
:* &#039;&#039;&#039;Abhilfe:&#039;&#039;&#039; die zu verlötenden Oberflächen säubern, z.B. mechanisch mit sehr feinem Sandpapier oder einem speziellen &amp;quot;Schmirgelschwamm&amp;quot; (ähnlich einem Radiergummi aber versetzt mit feinsten Schmirgelsand) oder chemisch mit zusätzlich aufgetragenem Flußmittel.&lt;br /&gt;
&lt;br /&gt;
* Anstatt sich an das obige Schema zu halten wird das Lötzinn für die herzustellende Verbindung vorwiegend an der heißen Lötkolbenspitze geschmolzen.&lt;br /&gt;
:* =&amp;gt; Die zu verlötenden Teile sind nicht warm genug.&lt;br /&gt;
:* =&amp;gt; Das Flußmittel im Lötzinn verdampft zu schnell.&lt;br /&gt;
:* &#039;&#039;&#039;Abhilfe:&#039;&#039;&#039; Sich an das Schema halten!&lt;br /&gt;
&lt;br /&gt;
* Nach Wegnehmen des Lötkolbens werden die zu verbindenden Teile bewegt, bevor das Lötzinn kalt und erstarrt ist.&lt;br /&gt;
:* =&amp;gt; Die erstellte Verbindung kann durchaus &amp;quot;formschlüssig&amp;quot; sein (= scheinbar hält sie fest),&lt;br /&gt;
:* =&amp;gt; aber hat elektrisch eine schlechte Qualität (Wackelkontakt oder erhöhter Widerstand, damit evtl. auch Erwärmung bei hohen Strömen und weitere Verschlechterung).&lt;br /&gt;
:* &#039;&#039;&#039;Tip:&#039;&#039;&#039; Die Oberfläche eines Lötzinntropfens spiegelt, solange er noch flüssig ist und wird etwas matter, wenn sich das Zinn verfestigt.&lt;br /&gt;
&lt;br /&gt;
* Das Lötzinn an der Spitze des Lötkolbens ist &amp;quot;zu alt&amp;quot; und &amp;quot;fließt&amp;quot; nicht mehr aureichend. .&lt;br /&gt;
:* =&amp;gt; der Zweck des Lötzinns an der Lötkolbenspitze (= Verbesserung des Wärmeübergangs) wird nicht erreicht.&lt;br /&gt;
:* &#039;&#039;&#039;Abhilfe:&#039;&#039;&#039; Altes Lötzinn des öfteren von der Spitze des Lötkolbens abstreifen (z.B. an einem angefeuchteten &amp;quot;Lötschwamm&amp;quot;) und neues Lötzinn auftragen.&lt;br /&gt;
&lt;br /&gt;
== Arten von Lötverbindungen ==&lt;br /&gt;
Für den Anfänger sind bestimmte Arten von Lötverbindungen einfacher herzustellen als andere, beim Üben empfiehlt es sich entsprechend, &amp;quot;vom Einfachen zum Schwierigen&amp;quot; zu trainieren.&lt;br /&gt;
&lt;br /&gt;
=== Einfaches Verlöten von Drähten ===&lt;br /&gt;
Recht einfach zu verlöten sind zwei Drähte, die man zuvor miteinander verdrillt hat. Bei starren Drähten empfiehlt sich in der Regel ein vorheriges &amp;quot;Verzinnen&amp;quot; (= der Draht wird mit einer Oberfläche aus Lötzinn versehen), da sich dann das beim Zusammenlöten aufgetragene Lötzinn besser verteilt. Bei dünnen Litzen kann auf das Verzinnen meist verzichtet werden, da durch die Kapillarwirkung das Lötzin quasi &amp;quot;aufgesogen&amp;quot; wird. Bei dicken Litzen (Querschnitt 1 Quadratmillimeter und mehr) ist vorheriges Verzinnen meist nicht ratsam, weil ansonsten die Verdrillung nicht mehr so gut gelingt. Da das Flussmittel im Lötzinn in dicke, verdrillte Litzenverbindungen oft nicht ausreichend eindringen kann, empfiehlt es sich hier, die Litzenende vor dem Verlöten nochmal gesondert mit Flussmittel zu behandeln.&lt;br /&gt;
&lt;br /&gt;
In Umgebungen, in denen es häufige oder gar permanente Vibrationen gibt (z.B. Auto), sollten Litzenenden allerdings &#039;&#039;&#039;immer&#039;&#039;&#039; verzinnt werden (auch beim Einlöten in Durchbohrungen gedruckter Schaltungen - siehe nächster Punkt). Die Verzinnung muss dabei ein Stück unter die Isolierung reichen (leicht zu kontrollieren durch die Biegbarkeit), andernfalls brechen Litzen oft genau an der Stelle, an der die Isolierung endet, da diese Stelle  (mechanische) die stärkste Last aufnehmen muss. &lt;br /&gt;
&lt;br /&gt;
=== Einlöten von Bauteilen Platinenbohrungen === &lt;br /&gt;
Auch dies gelingt dem Anfänger nach einiger Übung meist ganz gut (vorausgesetzt die obigen Tips und Richtlinien werden befolgt). Die Bauteile sollten allerdings nicht &amp;quot;lose&amp;quot; sondern - durch Biegen der Anschlussdrähte - mit leichter (mechanischer) Spannung in den Platinenbohrungen sitzen. Dies verhindert das &amp;quot;Wackeln&amp;quot; beim Wegnehmen des Lötkolbens.&lt;br /&gt;
&lt;br /&gt;
Was hier aber ggf. berücksichtig werden muss, ist die Wärmeempfindlichkeit.&lt;br /&gt;
* Halbleiterbauelemente (Dioden, Transistoren, ICs) vertragen keine längere Erhitzung auf 300 Grad Celsius (Lötkolbentemperator).&lt;br /&gt;
:* =&amp;gt; Der Lötvorgang muss also &amp;quot;zügig&amp;quot; erfolgen.&lt;br /&gt;
:* =&amp;gt; GGf. kann eine kleine Zange am Anschlussdraht als &amp;quot;Wärmeableiter&amp;quot; zwischen Lötstelle und Bauteil eingesetzt werden.&lt;br /&gt;
* Auch die Leiterbahnen der Platinen vertragen keine beliebig lange, beliebig häufige Erwärmung und die Leiterbahn löst sich schließlich von der Platine ab.&lt;br /&gt;
:* =&amp;gt; Wie oben (zügig löten).&lt;br /&gt;
:* =&amp;gt; Bei Bauteilen mit &amp;quot;dicken&amp;quot; (und entsprechend unempfindlichen) Drähten ggf. zunächst &#039;&#039;diese&#039;&#039; und erst kurz vorm Aufbringen des Lötzinns auch die Leiterbahn der Platine erhitzen.&lt;br /&gt;
&lt;br /&gt;
=== Auflöten von SMD-Bauteilen auf Platinen ===&lt;br /&gt;
(Wer will das machen? - Ich hab&#039; da keine Erfahrung --[[Benutzer:Martin|Martin]] 00:54, 20. Jun 2004 (CEST)) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Entlöten ==&lt;br /&gt;
Unter Entlöten versteht man das Trennen einer Lötverbindung. In der Theorie ist das einfach, weil ja &amp;quot;nur&amp;quot; das Lötzinn erwärmt werden muss und dann (z.B. bei in Platinen eingelöteten Bauteilen) der Draht aus der Bohrung gezogen werden kann. In der Praxis besteht die Schwierigkeit jedoch darin, dass typische Bauteile mindestens zwei, oft aber drei oder noch mehr verlötete Anschlüsse haben und man die Lötstellen nicht alle gleichzeitig erwärmen kann.&lt;br /&gt;
&lt;br /&gt;
Es ist auf alle Fälle vorteilhaft, wenn man zunächst an jedem einzelnen Anschluss versucht, so viel Lötzinn wie möglich zu entfernen (z.B. mit Absaugpumpe oder Entlötlitze). Dennoch werden sich insbesondere Bohrungen in gedruckten Schaltungen so nicht völlig von Lötzinn befreien lassen.&lt;br /&gt;
&lt;br /&gt;
=== Bauteile mit zwei Anschlussdrähten ===&lt;br /&gt;
Sofern sich das Bauteil &amp;quot;kippen&amp;quot; lässt, erst die eine, dann die andere Seite ablöten.&lt;br /&gt;
* Bei einem an seinen zwei Enden festgelöteten Widerstand oder Kondensator zum Ablöten der ersten Seite ggf. einen kleinen Schraubenziehen als Hebel unterschieben.&lt;br /&gt;
* Bei einem senkrecht stehend aufgelöteten (Rund-) Elko erst den &amp;quot;mittigeren&amp;quot; Draht auslöten, da sich das Teil leichter Kippen lässt, wenn es der äußere Draht ist, der noch angelötet ist.&lt;br /&gt;
&lt;br /&gt;
=== Bauteile mit drei Anschlussdrähten ===&lt;br /&gt;
Bei einem Transistor kommt man mit der &amp;quot;Kipptechnik&amp;quot; oft auch noch weiter, wenn die Lötpunkte im Dreieck angeordnet sind. Man hat dann immer eine Richtung zum Kippen, bei der sich der Draht in der momentan erwärmten Lötstelle ein Stück herausziehen lässt. Notfalls muss man sich schrittweise vorarbeiten (d.h. beim ersten Mal wird man den ersten Draht nicht vollständig aus der Bohrung herausbekommen, aber nachdem man einmal &amp;quot;reihum&amp;quot; ist, sitzt das Bauteil schon ein Stück weiter draußen).&lt;br /&gt;
&lt;br /&gt;
Bei drei Anschlußdrähten &amp;quot;in einer Reihe&amp;quot; funktioniert die Kipptechnik nicht, evtl. kann man hier versuchen, mit dem Lötkolben zwei Lötstellen gleichzeitig zu erwärmen. (Aber Vorsicht, dass nach dem Auslöten und Wiedereinlöten eines neuen Bauteils keine feine Lötzinnbrücke stehen bleibt und einen Kurzschluss verursacht!)&lt;br /&gt;
&lt;br /&gt;
=== Bauteile mit vielen Anschlussdrähten ===&lt;br /&gt;
Das Auslöten von ICs ist ohne spezielle Werkzeuge (z.B. spezieller Lötkolbenaufsatz) meist unmöglich. Wenn man nicht beides - IC und Platine - &amp;quot;retten&amp;quot; will oder muss, kann man es so versuchen:&lt;br /&gt;
* Platine retten: Anschlussdrähte abzwicken und Drahtreste aus der Platine entfernen (siehe auch unten, Freimachen von Durchbohrungen).&lt;br /&gt;
* Bauteil retten: Platine auseinanderschneiden oder -sägen und verbleibende Reste auch zwischen den Drähten mit einem Seitenschneider durchzwicken, so dass letzten Endes an jedem Draht (bzw. jedem &amp;quot;Beinchen&amp;quot; des ICs) nur noch ein minimaler Platinenrest hängt. Dann alle Reste einen nach dem anderen Ablöten(*1).&lt;br /&gt;
&lt;br /&gt;
=== Freimachen von Durchbohrungen ===&lt;br /&gt;
Allgemein gilt, dass man bei einem Bauteil, welches mit Sicherheit defekt ist, meist besser erst alle Drähtchen abzwickt und dann nur diese Reste &amp;quot;entlötet&amp;quot;. Kurze Drähtchenreste sind allerdings oft schwer aus Platinenbohrungen zu entfernen, da sie von der Kapillarwirkung der Bohrung auf das Lötzinn praktisch &amp;quot;angesogen&amp;quot; und in der Bohrung festgehalten werden.&lt;br /&gt;
&lt;br /&gt;
Ein alter Praktiker-Trick ist hier, nach Erwärmen des Lötzinns die Bohrung mit einem gut gespitzten Bleistift zu durchstoßen. (Das Lötzinn wird vom Graphit der Mine praktisch &amp;quot;abgestoßen&amp;quot;.)&lt;br /&gt;
&lt;br /&gt;
Und Zuguterletzt: Wenn beim erfolgreichen Auslöten eines Bauteils die Bohrung in der Platine gleich lötzinnfrei ist, sollte man sich nicht zu früh freuen: Bei doppelseitigen &amp;quot;durchkontaktierten&amp;quot; Platinen kann so unbemerkt auch die Durchkontaktierungshülse herausgerissen worden sein. Vor dem Einlöten von Ersatz sollte man evtl. Nachmessen (Ohmmeter) und im Schadensfall (oder zur Sicherheit auch immer) das neu eingesetzte Bauteil auf beiden Seiten der Platine anlöten(*2).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
* 1: Diese Technik ist genau so aufwändig wie sie sich anhört und lohnt sich allenfalls bei sehr teuren Bauteilen oder solchen, die irgendwo als Ersatzteil dienen müssen und allgemein schwer beschaffbar sind (z.B. weil nicht mehr hergestellt werden).&lt;br /&gt;
* 2: Bei Multi-Layer-Platinen wird auch das den Erfolg nicht garantieren, aber Reparaturen mit Lötkolbeneinsatz sind an solchen Platinen ohnehin oft ein Glücksspiel.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:L%C3%B6ten&amp;diff=14287</id>
		<title>Diskussion:Löten</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:L%C3%B6ten&amp;diff=14287"/>
		<updated>2004-06-19T14:43:18Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wir sollten uns mehr auf die praktischen Aspekte konzentrieren, also das was für einen Elektroniker relevant ist, auch wenn die Versuchung groß ist Lexikon-Artikel zu schreiben. Ist schwierig, ich weiß, und so das Patentrezept hab ich da auch nicht... --[[Benutzer:Andreas|Andreas]] 15:41, 19. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Zustimmung, ich versuche in den Seiten auch immer die für Mikrocontroller wichtigen Aspekte in den Vordergrund zu stellen, oder zumindest die für Elektronischen Schaltungen wichtigen Dinge. Eine Seite [[Löten (Anleitung)]] wollte ich demnächst noch nachschieben. Der etwas spezifischere Seitentitel gibt dann auch schon den engeren Fokus vor und verhindert, dass es abschweifend wird. Zusätzlich noch eine allgemeine Seite Löten zu haben ist ein dabei ein Vorteil, denn dann kann man auf diese Seite wohlgemeinte Ergänzungen schieben, die jemand vielleicht auf &amp;quot;Löten ((Anleitung)&amp;quot; macht. Hat man nur eine einzige Seite &amp;quot;Löten&amp;quot;, die eigentlich den Inhalt &amp;quot;Löten (Anleitung)&amp;quot; haben soll, ist diese Fokusierung und das evtl. Trennen von Aspekten schwieriger. (Ich hoffe, das war jetz nicht zu komplziert erklärt und ihr versteht, was ich meine.) --[[Benutzer:Martin|Martin]] 16:43, 19. Jun 2004 (CEST)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Zahlensysteme&amp;diff=2575</id>
		<title>Zahlensysteme</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Zahlensysteme&amp;diff=2575"/>
		<updated>2004-06-19T13:09:02Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bei der Programmierung bekommt man es hauptsächlich mit 3 verschiedenen Zahlensystemen zu tun: dezimal, hexadezimal und binär.&lt;br /&gt;
&lt;br /&gt;
Hexadezimalzahlen werden meistens (z.B. in [[C]] oder im [[AVR]]-[[Assembler]]) mit dem Prefix &amp;quot;0x&amp;quot; geschrieben, also z.B. 0x3A.&lt;br /&gt;
Binärzahlen schreibt man im AVR-Assembler mit &amp;quot;0b&amp;quot; am Anfang, z.B. 0x00110100. In [[C]]-Programmen ist die direkte Eingabe von Binärzahlen nicht möglich, es lassen sich aber [[C Makros|Makros]] zu diesem Zweck schreiben.&lt;br /&gt;
&lt;br /&gt;
Wie man Dezimalzahlen schreibt muss ich hoffentlich nicht erklären ;-)&lt;br /&gt;
&lt;br /&gt;
Ein paar Beispiele für die Umrechnung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;dezimal&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;hexadezimal&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;bin&amp;amp;auml;r&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x00&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000000&amp;lt;/td&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x01&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00000001&amp;lt;/td&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x0F&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b00001111&amp;lt;/td&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;100&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x64&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b01100100&amp;lt;/td&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;255&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0xFF&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0b11111111&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie die Umrechnung mathematisch funktioniert, ist auf http://schulen.freiepresse.de/gymnasiumolbernhau/informatik/stellenwertsysteme.htm beschrieben.&lt;br /&gt;
...oder funktioniert am einfachsten über den Windows-Taschenrechner (Ansicht=&amp;gt;wissenschaftlich).&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=GPS&amp;diff=10542</id>
		<title>GPS</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=GPS&amp;diff=10542"/>
		<updated>2004-06-19T13:00:44Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;Global Positioning System&amp;quot; - satellitengestütztes System zur weltweiten Ortsbestimmung.&lt;br /&gt;
&lt;br /&gt;
Das GPS Satellitensystem wurde vom US Verteidigungsministerium installiert, um die Steuerung von Militärfahrzeugen und Waffensystemen zu vereinfachen. Die (teilweise) offengelegte Spezifikation machte das System aber auch zivil nutzbar und - vor allem auf Drängen der amerikanischen Auto-Industrie - wurde es mittlerweile von einem absichtlich aufgeprägten Fehlerwert(*1) befreit, so dass Positionsbestimmungen auch bei moderatem Aufwand mit einer Genauigkeit im Bereich weniger Meter möglich sind (vorher lag die Ungenauigkeit bei etwa 30..100 Meter).&lt;br /&gt;
&lt;br /&gt;
Anders als die früher verbreiteten, &amp;quot;aktiven&amp;quot; Systeme(*2), bei denen zum Beispiel ein Flugzeug oder Schiff zur Standardortbestimmung mit einem Funk-&#039;&#039;&#039;Sender&#039;&#039;&#039; ausgestattet war, der dann von (mindestens zwei) stationären Empfangsstationen &amp;quot;angepeilt&amp;quot; wurde, arbeitet GPS als &amp;quot;passives&amp;quot; System: Ein GPS-Gerät ist ein Funk-&#039;&#039;&#039;Empfänger&#039;&#039;&#039;, welcher aus den Laufzeitunterschieden der von den GPS-Satelliten ausgestrahlten Positions- und Uhrzeit-Signalen seine eigene Position berechnet.&lt;br /&gt;
Ein GPS-Gerät kann daher nicht &amp;quot;angepeilt&amp;quot; werden, und so muss z.B. eine auf GPS basierende KFZ-Diebstahlsicherung stets durch einen Sender (etwa ein Handy) ergänzt werden, damit das Auto seinen Standort an eine Überwachungszentrale melden kann.&lt;br /&gt;
&lt;br /&gt;
Mit der zunehmenden Nachfrage nach GPS-Chipsets durch die Auto-Industrie ist davon auszugehen, dass der Aufpreis, zu dem ein GPS-System in eine Mikrocontroller-Applikation integriert werden kann, rapide fallen wird. GPS wird daher möglichwerweise in wenigen Jahren als &amp;quot;kleiner Zusatznutzen&amp;quot; in vielen technischen Geräten zur Verfügung stehen, ähnlich wie heute der Empfang des DCF77-Signals zur Uhrensteuerung.&lt;br /&gt;
&lt;br /&gt;
=== Web-Links ===&lt;br /&gt;
&lt;br /&gt;
Ein empfehlenswertes GPS-Tutorial befindet sich [http://www.trimble.com/gps/ hier].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
* 1: Der aufgeprägte Fehlerwert war ohnehin nicht sehr effektiv, da er sich mit etwas erhöhtem Aufwand eliminieren ließ (Differential GPS).&lt;br /&gt;
* 2: Auch die mittlerweile eingeführte &amp;quot;Handy-Ortung&amp;quot; ist ein aktives System - mit allen Vor- und Nachteilen.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Akkumulator&amp;diff=2561</id>
		<title>Akkumulator</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Akkumulator&amp;diff=2561"/>
		<updated>2004-06-19T12:10:29Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn man bei [[Mikrocontroller]]n über den Akkumulator spricht, dann meint man damit keine aufladbaren Batterien, sondern ein bestimmtes [[Register]].&lt;br /&gt;
&lt;br /&gt;
Bei manchen [[Prozessor]]en lässt sich das Eregbnis vieler Operationen nicht in beliebigen Registern ablegen, sondern nur in einem speziellen Akkumulator (zu deutsch etwa &amp;quot;Aufsammler&amp;quot;, oft nur kurz &amp;quot;Akku&amp;quot; genannt); ein Beispiel dafür ist die [[8051]]-Familie. Bei manchen Prozessoren gibt es auch mehrere Akkumulator-Register (zum Beispiel zwei beim [[6809]]).&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Editoren/IDEs&amp;diff=2531</id>
		<title>Editoren/IDEs</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Editoren/IDEs&amp;diff=2531"/>
		<updated>2004-06-19T11:44:06Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* Texteditoren für Programmierer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Texteditoren für Programmierer ==&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.ultraedit.com UltraEdit (Shareware)]&lt;br /&gt;
* [http://www.pnotepad.org/ Programmers Notepad (Freeware, in WinAVR enthalten)]&lt;br /&gt;
* [http://www.atmel.com AVR-Studio (für AVR-Assembler/C)]&lt;br /&gt;
* [http://ftp.gnu.org/gnu/emacs/windows/ Emacs]&lt;br /&gt;
* [http://www.winvi.de/ WinVi]&lt;br /&gt;
* [http://www.vim.org/ Vim]&lt;br /&gt;
&lt;br /&gt;
=== Unix/Linux ===&lt;br /&gt;
&lt;br /&gt;
* [http://ftp.gnu.org/gnu/emacs/ Emacs]&lt;br /&gt;
* [http://www.vim.org/ Vim]&lt;br /&gt;
* [http://kate.kde.org/ Kate]&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.codingmonkeys.de/subethaedit/ SubEthaEdit] (frei für nichtkommerzielle Nutzung, erlaubt das gemeinsame Bearbeiten einer Datei von mehreren Personen gleichzeitig)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Include-Files_(C)&amp;diff=3937</id>
		<title>Include-Files (C)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Include-Files_(C)&amp;diff=3937"/>
		<updated>2004-06-19T11:39:01Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* Problemlösung mit Makros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Include-Files in C/C++ enthalten typischerweise Informationen, die im Rahmen der Kompilierung verschiedener anderer Quelltexte (mehrfach) benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Wer bisher hauptsächlich kleinere (Assembler-) Programme für Mikrocontroller realisiert hat und sich nun langsam an größere Projekte heranwagt und deshalb auf C umsteigt, ist gut beraten, die Möglichkeiten sinnvoll einzusetzen, die Include-Files in C bieten. Dabei gilt es allerdings auch, einige Fallgruben zu vermeiden - mehr dazu in diesem Artikel.&lt;br /&gt;
&lt;br /&gt;
== Verwendung von Include-Files ==&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von Include-Files in [[C]] und [[C-Plusplus|C++]] führt in der Regel zu besser strukturierten und damit besser wartbaren Programmen. Indem bestimmte, zentrale Informationen nur ein einziges Mal hinterlegt werden, fällt insbesondere bei Änderungen weniger Aufwand an.&lt;br /&gt;
&lt;br /&gt;
Der übliche Suffix für Include-Files ist &amp;quot;&amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt;&amp;quot;, manchmal auch &amp;quot;&amp;lt;tt&amp;gt;.hpp&amp;lt;/tt&amp;gt;&amp;quot; (für C++), und die &#039;&#039;Verwendung&#039;&#039; eines Include-Files ist sehr einfach:&lt;br /&gt;
 #include &amp;quot;xyz.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird der Dateiname in spitze Klammern gesetzt, dann sucht der Präprozessor die Datei nicht im aktuellen Verzeichnis, sondern im Standard-Include-Pfad des Compilers:&lt;br /&gt;
 #include &amp;lt;io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei sind auch relative Verzeichnisangaben erlaubt:&lt;br /&gt;
 #include &amp;lt;avr/timer.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme bei Include-Files ==&lt;br /&gt;
In Include-Files werden mitunter Informationen aus anderen Include-Files benötigt und es ist an der Verwendungsstelle eines Include-Files oft nicht das Wissen über die möglicherweise sehr komplexen Abhängigkeiten vorhanden. Nachfolgend wird ausgehend von einer typischen Problemstellung eine Standardtechnik erläutert, die hilft, das Wissen um Abhängigkeiten an der Verwendungsstelle überflüssig zu machen:&lt;br /&gt;
&lt;br /&gt;
Angenommen, es existieren zwei Datenstrukturen für die es die Typdefinitionen &amp;lt;tt&amp;gt;s1_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; gibt, die jeweils entsprechenden Include-Files hinterlegt sind, also&lt;br /&gt;
&amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Definition der Datenstruktur s1 */&lt;br /&gt;
struct s1 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s1_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt; sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Definition der Datenstruktur s2 */&lt;br /&gt;
struct s2 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
s2_t *bar();&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine bestimmte Applikation benötigt nun beide Struktur- und Funktions-Definitionen und inkludiert entsprechend beide Dateien, es gibt also eine kompilierbare Datei (z.B. &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt;) die wie folgt aussieht:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;s1.h&amp;quot;&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
int main() {&lt;br /&gt;
    s1_t a;&lt;br /&gt;
    s2_t *b;&lt;br /&gt;
    ...&lt;br /&gt;
    foo(a);&lt;br /&gt;
    b = bar();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
So weit, so gut.&lt;br /&gt;
&lt;br /&gt;
Nun kommt es eines Tages zu einer Änderung, die darauf hinausläuft, dass die erste Struktur die zweite als Element enthält. Das heißt die Datei &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; sieht nun wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Daraufhin wird sich &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt;(!) nicht mehr kompilieren lassen, da bei der Verarbeitung von &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; (noch) nicht bekannt ist, worum es sich um bei &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; handelt. (Es könnte ja auch einfach nur ein Tippfehler sein!)&lt;br /&gt;
&lt;br /&gt;
Da es in der Praxis einen immensen Pflegeaufwand auslösen kann, wenn Änderungen in Include-Files Änderungen in vielen weiteren Dateien erfordern (dem Wesen nach soll ja eine Include-Dateien eine Information zentral für viele andere Dateien bereitstellen), muss nach einem Ausweg gesucht werden.&lt;br /&gt;
&lt;br /&gt;
Dieser könnte so aussehen, dass man &amp;quot;vorsorglich&amp;quot; die Beschreibung der verwendeten Datenstruktur in &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; inkludiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inkludiert das Hauptprogramm lediglich &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;, wäre nun alles in Ordnung, wenn aber beide Dateien inkludiert werden, beschwert sich der Compiler über die doppelte Definition der Datentypen. (Die doppelte Deklaration von Funktionen ist kein Fehler, wenn sie übereinstimmend erfolgt.)&lt;br /&gt;
&lt;br /&gt;
== Problemlösung mit Makros ==&lt;br /&gt;
Die übliche und - fast - perfekte Lösung des Problems besteht darin, den eigentlichen Inhalt eines Include-Files vor einer zweiten Verarbeitung durch eine &#039;&#039;bedingte Kompilierung&#039;&#039; zu schützen.&lt;br /&gt;
Bei der bedingten Kopilierung handelt es sich ebenfalls um ein Feature des [[C-Präprozessor]]s und es wird hier wie folgt auf die Datei &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt; angewendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
struct s2 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
s2_t *bar();&lt;br /&gt;
...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da das beschriebene Problem in größeren Programmsystemen auch in Bezug auf die andere Struktur auftreten könnte, sollte man die Datei &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; vorsorglich mit einem ähnlichen Schutz ausstatten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der nette Nebeneffekt ist, dass es damit auch keine Rolle spielt, in welcher Reihenfolge beide Dateien in &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;inkludiert werden.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung der Regeln ==&lt;br /&gt;
Kochrezeptartig kann man beim Schreiben und Verwenden von Include-Files auch einfach die folgenden Regeln anwenden:&lt;br /&gt;
* Wird die externe Schnittstelle (Datenstrukturen, Funktions-Deklarationen) eines Moduls &#039;&#039;XYZ&#039;&#039; in einem Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; beschrieben, so sollte ein bestimmter Makroname (z.B. &amp;lt;tt&amp;gt;XYZ_h&amp;lt;/tt&amp;gt;) für die Steuerung der tatsächlichen Verarbeitung des Include-Files reserviert werden(*1).&lt;br /&gt;
* Der Include-File selbst testet (und definiert anschließend) diesen Makro, um so eine doppelte Verarbeitung zu vermeiden.&lt;br /&gt;
* Wird in einer Kompilierung das Modul &#039;&#039;XYZ&#039;&#039; verwendet (= eine seiner Datenstrukturen oder Funktionen), wird auch der Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; in diese Kompilierung eingeschlossen.&lt;br /&gt;
* Verwendet das Modul &#039;&#039;XYZ&#039;&#039; &#039;&#039;&#039;intern&#039;&#039;&#039; ein weiteres Modul &#039;&#039;UVW&#039;&#039;, so wird &#039;&#039;&#039;dessen&#039;&#039;&#039; Include-File &amp;lt;tt&amp;gt;uvw.h&amp;lt;/tt&amp;gt; im Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; eingeschlossen.&lt;br /&gt;
&lt;br /&gt;
Die beschriebenen Regeln funktionieren zufriedenstellend und entlasten vor allem Programm-Code, welcher Include-Files lediglich einschließt, vom Wissen über komplexe Zusammenhänge zwischen einzelnen Modulen. Ferner spielt die Reihenfolge, in der man Include-Files verwendet, keine Rolle und man kann sie beliebig gruppieren und ordnen, so wie es am übersichtlichsten ist(*2).&lt;br /&gt;
&lt;br /&gt;
== Gegenseitige Bezugnahme ==&lt;br /&gt;
Eine Ausnahme von der allgemeinen Regel liegt vor, wenn sich zwei Datenstrukturen gegenseitig verwenden (was nur über Zeiger der Fall sein kann).&lt;br /&gt;
Alle wie auch immer gearteten Versuche, diese beiden Strukturdefinitionen und Funktionsprototypen in zwei verschiedene Include-Files aufzuteilen, also z.B. &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
s2_t *bar(s1_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
#include &amp;quot;s1.h&amp;quot;&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *yp;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
werden scheitern - mit und ohne dem beschriebenen Schutz vor doppelter Verarbeitung!&lt;br /&gt;
&lt;br /&gt;
Die pragmatische Lösung ist hier, alles in einem &#039;&#039;&#039;gemeinsamen&#039;&#039;&#039; Include-File &amp;lt;tt&amp;gt;s1_s2.h&amp;lt;/tt&amp;gt;zu hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_S2_h&lt;br /&gt;
#define S1_S2_h&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *yp;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
typedef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
s2_t *bar(s1_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das ist insofern sinnvoll, als ein Programm, welches die eine Struktur kennen muss, stets auch die andere benötigt. Die Aufteilung in zwei Include-Files würde also keinen echten Vorteil bringen.&lt;br /&gt;
&lt;br /&gt;
Eine Ausnahme kann lediglich gemacht werden, wenn auf die jeweils andere Struktur ausschließlich über Zeiger(*3) zugegriffen wird, dann sind auch zwei Include-Files möglich, nämlich &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
struct s2; /* Vorausdeklaration */&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typdef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
struct s2 *bar(s1_t);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
struct s1; /* Vorausdeklaration */&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *py;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typdef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
void bar(struct s1 *);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Anstatt den jeweils anderen Include-File einzuschließen, sind nun die oben gezeigten Vorausdeklarationen vorzumehmen. (Allerdings sind damit die Typdefinitionen &amp;lt;tt&amp;gt;s1_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; nicht verfügbar, die Bezugnahme auf die jeweils andere Struktur kann nur über &amp;lt;tt&amp;gt;struct s1&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;struct s2&amp;lt;/tt&amp;gt; erfolgen.)&lt;br /&gt;
     &lt;br /&gt;
----&lt;br /&gt;
* 1: Die genaue Beziehung zwischen dem Makro-Namen und dem Modul- (oder Struktur-) Namen ist dabei nicht so bedeutend. Die übliche Konvention, solche &amp;quot;Steuer-Makros&amp;quot; mit &amp;quot;&amp;lt;tt&amp;gt;_h&amp;lt;/tt&amp;gt;&amp;quot; oder &amp;quot;&amp;lt;tt&amp;gt;_H&amp;lt;/tt&amp;gt;&amp;quot; zu beenden, soll nur helfen, &amp;quot;zufällige&amp;quot; Kollissionen mit Makros zu vermeiden, die einen anderen Zweck haben.&lt;br /&gt;
* 2: Eine alphabetische Sortierung ist z.B. hilfreich, um bei einem Kompilierfehler schnell überprüfen zu können, ob vielleicht nur ein bestimmter Include-File vergessen wurde.&lt;br /&gt;
* 3: Bei der Verwendunng von C++ gilt das zusätzlich für die Bezugnahme über Referenzen.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Include-Files_(C)&amp;diff=2528</id>
		<title>Include-Files (C)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Include-Files_(C)&amp;diff=2528"/>
		<updated>2004-06-19T11:36:04Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* Verwendung von Include-Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Include-Files in C/C++ enthalten typischerweise Informationen, die im Rahmen der Kompilierung verschiedener anderer Quelltexte (mehrfach) benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Wer bisher hauptsächlich kleinere (Assembler-) Programme für Mikrocontroller realisiert hat und sich nun langsam an größere Projekte heranwagt und deshalb auf C umsteigt, ist gut beraten, die Möglichkeiten sinnvoll einzusetzen, die Include-Files in C bieten. Dabei gilt es allerdings auch, einige Fallgruben zu vermeiden - mehr dazu in diesem Artikel.&lt;br /&gt;
&lt;br /&gt;
== Verwendung von Include-Files ==&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von Include-Files in [[C]] und [[C-Plusplus|C++]] führt in der Regel zu besser strukturierten und damit besser wartbaren Programmen. Indem bestimmte, zentrale Informationen nur ein einziges Mal hinterlegt werden, fällt insbesondere bei Änderungen weniger Aufwand an.&lt;br /&gt;
&lt;br /&gt;
Der übliche Suffix für Include-Files ist &amp;quot;&amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt;&amp;quot;, manchmal auch &amp;quot;&amp;lt;tt&amp;gt;.hpp&amp;lt;/tt&amp;gt;&amp;quot; (für C++), und die &#039;&#039;Verwendung&#039;&#039; eines Include-Files ist sehr einfach:&lt;br /&gt;
 #include &amp;quot;xyz.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wird der Dateiname in spitze Klammern gesetzt, dann sucht der Präprozessor die Datei nicht im aktuellen Verzeichnis, sondern im Standard-Include-Pfad des Compilers:&lt;br /&gt;
 #include &amp;lt;io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei sind auch relative Verzeichnisangaben erlaubt:&lt;br /&gt;
 #include &amp;lt;avr/timer.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme bei Include-Files ==&lt;br /&gt;
In Include-Files werden mitunter Informationen aus anderen Include-Files benötigt und es ist an der Verwendungsstelle eines Include-Files oft nicht das Wissen über die möglicherweise sehr komplexen Abhängigkeiten vorhanden. Nachfolgend wird ausgehend von einer typischen Problemstellung eine Standardtechnik erläutert, die hilft, das Wissen um Abhängigkeiten an der Verwendungsstelle überflüssig zu machen:&lt;br /&gt;
&lt;br /&gt;
Angenommen, es existieren zwei Datenstrukturen für die es die Typdefinitionen &amp;lt;tt&amp;gt;s1_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; gibt, die jeweils entsprechenden Include-Files hinterlegt sind, also&lt;br /&gt;
&amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Definition der Datenstruktur s1 */&lt;br /&gt;
struct s1 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s1_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt; sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Definition der Datenstruktur s2 */&lt;br /&gt;
struct s2 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
s2_t *bar();&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine bestimmte Applikation benötigt nun beide Struktur- und Funktions-Definitionen und inkludiert entsprechend beide Dateien, es gibt also eine kompilierbare Datei (z.B. &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt;) die wie folgt aussieht:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;s1.h&amp;quot;&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
int main() {&lt;br /&gt;
    s1_t a;&lt;br /&gt;
    s2_t *b;&lt;br /&gt;
    ...&lt;br /&gt;
    foo(a);&lt;br /&gt;
    b = bar();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
So weit, so gut.&lt;br /&gt;
&lt;br /&gt;
Nun kommt es eines Tages zu einer Änderung, die darauf hinausläuft, dass die erste Struktur die zweite als Element enthält. Das heißt die Datei &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; sieht nun wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Daraufhin wird sich &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt;(!) nicht mehr kompilieren lassen, da bei der Verarbeitung von &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; (noch) nicht bekannt ist, worum es sich um bei &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; handelt. (Es könnte ja auch einfach nur ein Tippfehler sein!)&lt;br /&gt;
&lt;br /&gt;
Da es in der Praxis einen immensen Pflegeaufwand auslösen kann, wenn Änderungen in Include-Files Änderungen in vielen weiteren Dateien erfordern (dem Wesen nach soll ja eine Include-Dateien eine Information zentral für viele andere Dateien bereitstellen), muss nach einem Ausweg gesucht werden.&lt;br /&gt;
&lt;br /&gt;
Dieser könnte so aussehen, dass man &amp;quot;vorsorglich&amp;quot; die Beschreibung der verwendeten Datenstruktur in &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; inkludiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inkludiert das Hauptprogramm lediglich &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;, wäre nun alles in Ordnung, wenn aber beide Dateien inkludiert werden, beschwert sich der Compiler über die doppelte Definition der Datentypen. (Die doppelte Deklaration von Funktionen ist kein Fehler, wenn sie übereinstimmend erfolgt.)&lt;br /&gt;
&lt;br /&gt;
== Problemlösung mit Makros ==&lt;br /&gt;
Die übliche und - fast - perfekte Lösung des Problems besteht darin, den eigentlichen Inhalt eines Include-Files vor einer zweiten Verarbeitung durch eine &#039;&#039;bedingte Kompilierung&#039;&#039; zu schützen.&lt;br /&gt;
Bei der bedingten Kopilierung handelt es sich ebenfalls um ein Feature des [[C-Präprozessors]] und es wird hier wie folgt auf die Datei &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt; angewendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
struct s2 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
s2_t *bar();&lt;br /&gt;
...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da das beschriebene Problem in größeren Programmsystemen auch in Bezug auf die andere Struktur auftreten könnte, sollte man die Datei &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; vorsorglich mit einem ähnlichen Schutz ausstatten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der nette Nebeneffekt ist, dass es damit auch keine Rolle spielt, in welcher Reihenfolge beide Dateien in &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;inkludiert werden.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung der Regeln ==&lt;br /&gt;
Kochrezeptartig kann man beim Schreiben und Verwenden von Include-Files auch einfach die folgenden Regeln anwenden:&lt;br /&gt;
* Wird die externe Schnittstelle (Datenstrukturen, Funktions-Deklarationen) eines Moduls &#039;&#039;XYZ&#039;&#039; in einem Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; beschrieben, so sollte ein bestimmter Makroname (z.B. &amp;lt;tt&amp;gt;XYZ_h&amp;lt;/tt&amp;gt;) für die Steuerung der tatsächlichen Verarbeitung des Include-Files reserviert werden(*1).&lt;br /&gt;
* Der Include-File selbst testet (und definiert anschließend) diesen Makro, um so eine doppelte Verarbeitung zu vermeiden.&lt;br /&gt;
* Wird in einer Kompilierung das Modul &#039;&#039;XYZ&#039;&#039; verwendet (= eine seiner Datenstrukturen oder Funktionen), wird auch der Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; in diese Kompilierung eingeschlossen.&lt;br /&gt;
* Verwendet das Modul &#039;&#039;XYZ&#039;&#039; &#039;&#039;&#039;intern&#039;&#039;&#039; ein weiteres Modul &#039;&#039;UVW&#039;&#039;, so wird &#039;&#039;&#039;dessen&#039;&#039;&#039; Include-File &amp;lt;tt&amp;gt;uvw.h&amp;lt;/tt&amp;gt; im Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; eingeschlossen.&lt;br /&gt;
&lt;br /&gt;
Die beschriebenen Regeln funktionieren zufriedenstellend und entlasten vor allem Programm-Code, welcher Include-Files lediglich einschließt, vom Wissen über komplexe Zusammenhänge zwischen einzelnen Modulen. Ferner spielt die Reihenfolge, in der man Include-Files verwendet, keine Rolle und man kann sie beliebig gruppieren und ordnen, so wie es am übersichtlichsten ist(*2).&lt;br /&gt;
&lt;br /&gt;
== Gegenseitige Bezugnahme ==&lt;br /&gt;
Eine Ausnahme von der allgemeinen Regel liegt vor, wenn sich zwei Datenstrukturen gegenseitig verwenden (was nur über Zeiger der Fall sein kann).&lt;br /&gt;
Alle wie auch immer gearteten Versuche, diese beiden Strukturdefinitionen und Funktionsprototypen in zwei verschiedene Include-Files aufzuteilen, also z.B. &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
s2_t *bar(s1_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
#include &amp;quot;s1.h&amp;quot;&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *yp;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
werden scheitern - mit und ohne dem beschriebenen Schutz vor doppelter Verarbeitung!&lt;br /&gt;
&lt;br /&gt;
Die pragmatische Lösung ist hier, alles in einem &#039;&#039;&#039;gemeinsamen&#039;&#039;&#039; Include-File &amp;lt;tt&amp;gt;s1_s2.h&amp;lt;/tt&amp;gt;zu hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_S2_h&lt;br /&gt;
#define S1_S2_h&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *yp;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
typedef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
s2_t *bar(s1_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das ist insofern sinnvoll, als ein Programm, welches die eine Struktur kennen muss, stets auch die andere benötigt. Die Aufteilung in zwei Include-Files würde also keinen echten Vorteil bringen.&lt;br /&gt;
&lt;br /&gt;
Eine Ausnahme kann lediglich gemacht werden, wenn auf die jeweils andere Struktur ausschließlich über Zeiger(*3) zugegriffen wird, dann sind auch zwei Include-Files möglich, nämlich &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
struct s2; /* Vorausdeklaration */&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typdef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
struct s2 *bar(s1_t);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
struct s1; /* Vorausdeklaration */&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *py;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typdef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
void bar(struct s1 *);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Anstatt den jeweils anderen Include-File einzuschließen, sind nun die oben gezeigten Vorausdeklarationen vorzumehmen. (Allerdings sind damit die Typdefinitionen &amp;lt;tt&amp;gt;s1_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; nicht verfügbar, die Bezugnahme auf die jeweils andere Struktur kann nur über &amp;lt;tt&amp;gt;struct s1&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;struct s2&amp;lt;/tt&amp;gt; erfolgen.)&lt;br /&gt;
     &lt;br /&gt;
----&lt;br /&gt;
* 1: Die genaue Beziehung zwischen dem Makro-Namen und dem Modul- (oder Struktur-) Namen ist dabei nicht so bedeutend. Die übliche Konvention, solche &amp;quot;Steuer-Makros&amp;quot; mit &amp;quot;&amp;lt;tt&amp;gt;_h&amp;lt;/tt&amp;gt;&amp;quot; oder &amp;quot;&amp;lt;tt&amp;gt;_H&amp;lt;/tt&amp;gt;&amp;quot; zu beenden, soll nur helfen, &amp;quot;zufällige&amp;quot; Kollissionen mit Makros zu vermeiden, die einen anderen Zweck haben.&lt;br /&gt;
* 2: Eine alphabetische Sortierung ist z.B. hilfreich, um bei einem Kompilierfehler schnell überprüfen zu können, ob vielleicht nur ein bestimmter Include-File vergessen wurde.&lt;br /&gt;
* 3: Bei der Verwendunng von C++ gilt das zusätzlich für die Bezugnahme über Referenzen.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Linux&amp;diff=2982</id>
		<title>Linux</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Linux&amp;diff=2982"/>
		<updated>2004-06-18T22:26:38Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Linux ist ein von Linus Torvalds ursprünglich für Intels [[x86|386]] entwickelter [[Unix]]-artiger Betriebssystem[[Kernel|kernel]].&lt;br /&gt;
&lt;br /&gt;
Der Name Linux wird zwar zumeist als Synonym für das komplette Betriebssystem verwendet, das jedoch in erheblichem Umfang auf den Programmen der [http://www.gnu.org Free Software Foundation] (FSF) beruht, die von Richard Stallman ins Leben gerufen wurde. Stallman dachte ursprünglich, dass die FSF selbst einen Betriebssystemkern entwickeln wird (&amp;quot;The Hurd&amp;quot;) und ist mit dem Erfolg von Linux vielleicht bis heute nicht ganz glücklich. Linus Torvalds betont andererseits stets, dass sein eigener Beitrag zu Linux - bzw. dem, was zumeist darunter verstanden wird - eher gering war.&lt;br /&gt;
&lt;br /&gt;
Da Linux (wie auch [[Unix]]) zum überwiegenden Teil in der Programmiersprache [[C]] geschrieben ist, ist es weitgehend unabhängig von einer bestimmten Hardware. Einzige Voraussetzung ist, dass ein C-Compiler für das Zielsystem existiert und so läuft Linux heute auf vielen Hardware-Plattformen, vom [[x86]] über [[Arm]],[[68000]], Sparc, Mips und damit auf Geräten aller Größen von [[Embedded]] Devices über PCs, Workstations und [[Mini-Computer]] bis hin zu Multiprozessor Mainframes und [[Cluster]]n (was Windows - trotz entsprechender Ankündigungen von Microsoft - nie geschafft hat).&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsgeschichte: ==&lt;br /&gt;
&lt;br /&gt;
1991 begann die Entwicklung von Linux, mit dem Wunsch Linus Torvalds auf seinem PC ein [[Unix]]-artiges Betriebssystem zur Verfügung zu haben. Zum damaligen Zeitpunkt existierten nur wenige komerzielle Unix-Version für PCs - unter den bekannteren die von SCO (ursprünglich als XENIX von Microsoft aus dem Original-Unix-Quellcodes von AT&amp;amp;T portiert und dann an SCO weiterverkauft), daneben Interactive Unix und einige SVR4-Portierungen wie etwa Generics. All diese Systeme wurden allerdings nicht mit vollem Source-Code geliefert. Mit Source-Code (in C) verfügbar war damals lediglich Minix, ein an die [[POSIX-Standards]] angelehntes Unix-&amp;quot;Look-Alike&amp;quot;, das als Lehrbetriebssystem von Andrew Tanenbaum entwickelt worden war.&lt;br /&gt;
&lt;br /&gt;
Zunächst nutzte Linus Torvalds Minix, entwickelte jedoch einen eigenen Low-Level Terminalemulator für den Fernzugriff auf die Rechner der Universität, der ohne Betriebssystem auskam. Durch einen Unfall überschrieb Linus aus Versehen mit seinem Terminalemulator die Minix-[[Partition]] auf seiner Festplatte. Sein Terminalemulator war schon so weit vorangeschritten, dass Linus in ihm ein Betriebssystem in Arbeit erkannte.&lt;br /&gt;
&lt;br /&gt;
Auf Basis der POSIX Standards entwickelte Linus - unter Nutzung des C-Compilers der FSF ([[GCC]]) - alle wichtigen Bestandteile eines echten 32-Bit Betriebssystems &amp;quot;[[from scratch]]&amp;quot; und veröffentlichte dessen Quellcodes unter der [[GPL]], der Lizenz der FSF. Diese &amp;quot;Lizenz&amp;quot; wird mitunter auch als [[Copyleft]] bezeichnet, da sie das Recht, Kopien zu machen, nicht etwa einschränkt sondern im Gegenteil sogar verbietet, die unter Nutzung von FSF-Komponenten erstellten Programme mit einem &amp;quot;klassischen&amp;quot; Copyright zu versehen.&lt;br /&gt;
&lt;br /&gt;
Schon sehr bald existierte eine große Gruppe von Entwicklern, die sich für dieses alternative System begeisterte und half bei der Weiterentwicklung.&lt;br /&gt;
&lt;br /&gt;
Heute läuft ein großer Teil der Internet Infrastruktur unter Linux und anderen &amp;quot;Open-Source&amp;quot; Betriebssystemen (wie etwa BSD-Unix).&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Java&amp;diff=14279</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Java&amp;diff=14279"/>
		<updated>2004-06-18T21:50:10Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine [[HLL|höhere Programmiersprache]], die Anfang der 1990-er entstand und ihre erste Blüte im Internet-Boom Mitte und Ende der 1990-er erlebte.&lt;br /&gt;
&lt;br /&gt;
Java enthält viele Features, die für die Programmierung in einer vernetzten Umgebung interessant und wichtig sind. Bei der Programmierung von Mikrocontrollern wird Java bisher kaum eingesetzt(*1), obwohl der Vorläufer von Java, OAK (= Object Application Kernel) ursprünglich auf diesen Bereich zielte.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
* 1: Einzig nennenswerte Ausnahme bilden Mobiltelefone, die mittlerweile oft eine Ausführungsumgebung für Java ([[JVM]] = Java Virtual Machine) anbieten. Allerdings wird diese typischerweise nicht für die eigentliche Funktionalität des Telefons eingesetzt sondern für &amp;quot;Add-Ons&amp;quot; wie etwa Spiele oder (rudimentäre) Office-Anwendungen (z.B. Terminkalender).&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller.net:Beobachtete_Fehler&amp;diff=13921</id>
		<title>Mikrocontroller.net:Beobachtete Fehler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller.net:Beobachtete_Fehler&amp;diff=13921"/>
		<updated>2004-06-18T21:26:18Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[de:Wikipedia:Präemptives Multitasking]] sollte zu [http://de.wikipedia.org/wiki/Pr%E4emptives_Multitasking Wikipedia] Linken &amp;lt;- Inter-Wiki-Links gehen nicht ?&lt;br /&gt;
Die Wikipedias haben einen Mechanismus um auf andere Wikis zu verlinken, eventuell kann der Sysop ja diesen für links auf de.wikipedia konfigurieren... [[Benutzer:Suschman|Suschman]]&lt;br /&gt;
&lt;br /&gt;
=== Startseite ===&lt;br /&gt;
&lt;br /&gt;
Inhaltliches Problem:&lt;br /&gt;
Die Startseite ist nicht gut genug: Schaut man in der Statistik unter &amp;quot;Beliebte Seiten&amp;quot; nach, dann sieht man, daß die Startseite über 11.000 mal aufgerufen wurde, aber die beliebteste Fachseite nur 3000 mal. Selbst die Testseite hat stolze 1200 Aufrufe zu verzeichnen. Mir scheint, ein Großteil der Surfer findet von der Startseite nicht zum eigentlichen Wiki. Das könnte daran liegen, daß auf der Startseite zu sehr auf das das Wiki selbst eingegangen wird und zu wenig auf die Inhalte. Die Startseite der Wikipedia ist ja auch völlig anders aufgebaut. Ich könnte das natürlich einfach ändern, aber ich hätte gerne andere Meinungen zu dem Thema. Was denkt Ihr? &lt;br /&gt;
-- Markus&lt;br /&gt;
&lt;br /&gt;
* Ganz meine Meinung! Die Startseite ist zu unübersichtlich, man findet nicht wirklich den &amp;quot;Eingang&amp;quot;. [[Benutzer:OldBug|Patrick]] 14:28, 7. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
* Zustimmung! Der Schreibschutz ist jetzt aufgehoben, wenn du die Startseite aendern moechtest, mach&#039;s einfach. ([[Benutzer:Andreas|Andreas]] 14:50, 8. Jun 2004 (CEST))&lt;br /&gt;
&lt;br /&gt;
* Klasse neue Startseite, Markus! Was ich mir noch vorstellen könnte ist, dass einige nicht checken das alle blauen Wörter Links sind und ein Artikel dahinter steckt. Mir ist dazu aber bisher noch keine idiotensichere Formulierung eingefallen. - [[Benutzer:Ozel|Ozel]] 09:50, 9. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
* Ich finde die neue Startseite auch schöner als die alte. Aber: Es ist eine gewisse Konvention im Internet, dass Links UNTERSTRICHEN angezeigt werden. Ich weiß, ich weiß, das kann man alles durch Stylesheets, Preferences usw. konfigurieren, aber der DEFAULT ist halt, wenn ich auf eine x-beliebige Seite gehe, dass ich Unterstrichenes anklicken kann. Insofern finde ich &amp;quot;blaue&amp;quot; Links nicht so einleuchtend.  Na gut, immer noch besser als MMN (Mystery Meat Navigation) und nur meine 2 Cent zum &amp;quot;Mal-drüber-Nachdenken&amp;quot; --[[Benutzer:Martin|Martin]] 01:48, 17. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
:* Stimmt! Links zu unterstreichen wäre eine einfache Lösung. Gerade wegen CSS kann Andreas das ja ganz leicht abändern. --[[Benutzer:Ozel|Ozel]] 00:29, 18. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
:* Links die nur beim darüberfahren mit dem Mauszeiger unterstrichen werden sind weit verbreitet, und durch die einheitliche Farbgebung sehe ich keine Verwirrungsgefahr. -- [[Benutzer:Andreas|Andreas]] 08:01, 18. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
::* Also ich will da nichts mit religiösem Eifer verfechten, obwohl ich &amp;quot;blau&amp;quot; für weniger deutlich als &amp;quot;unterstrichen&amp;quot; halte. (Vielleicht liegt das auch daran, dass ich eine recht kleine Schrift eingestellt habe und insofern der Farbunterschied weniger deutlich ist, da die Buchstaben weniger Pixel ansteuern.) Aber was Andreas schreibt, ist für mich OK, und die Links &amp;quot;antworten&amp;quot; beim Drüberfahren ja auch und geben sich dann deutlich als solche zu erkennen (also nicht so ganz extreme MMN, wo sich nur der Cursor ändert). Das dezente blau für die Links lenkt beim Lesen sicher auch weniger ab als viele Unterstreichungen, ich sehe also durchaus auch den Vorteil. Insofern ist das für mich in Ordnung wie es jetzt ist. (Die salomonische Lösung wäre eine Option in den Benutzereinstellungen, wie Links präsentiert werden sollen, vielleicht kommt das ja mal.) --[[Benutzer:Martin|Martin]] 12:13, 18. Jun 2004 (CEST)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller.net:Beobachtete_Fehler&amp;diff=2490</id>
		<title>Mikrocontroller.net:Beobachtete Fehler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller.net:Beobachtete_Fehler&amp;diff=2490"/>
		<updated>2004-06-18T10:13:17Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[de:Wikipedia:Präemptives Multitasking]] sollte zu [http://de.wikipedia.org/wiki/Pr%E4emptives_Multitasking Wikipedia] Linken &amp;lt;- Inter-Wiki-Links gehen nicht ?&lt;br /&gt;
Die Wikipedias haben einen Mechanismus um auf andere Wikis zu verlinken, eventuell kann der Sysop ja diesen für links auf de.wikipedia konfigurieren... [[Benutzer:Suschman|Suschman]]&lt;br /&gt;
&lt;br /&gt;
=== Startseite ===&lt;br /&gt;
&lt;br /&gt;
Inhaltliches Problem:&lt;br /&gt;
Die Startseite ist nicht gut genug: Schaut man in der Statistik unter &amp;quot;Beliebte Seiten&amp;quot; nach, dann sieht man, daß die Startseite über 11.000 mal aufgerufen wurde, aber die beliebteste Fachseite nur 3000 mal. Selbst die Testseite hat stolze 1200 Aufrufe zu verzeichnen. Mir scheint, ein Großteil der Surfer findet von der Startseite nicht zum eigentlichen Wiki. Das könnte daran liegen, daß auf der Startseite zu sehr auf das das Wiki selbst eingegangen wird und zu wenig auf die Inhalte. Die Startseite der Wikipedia ist ja auch völlig anders aufgebaut. Ich könnte das natürlich einfach ändern, aber ich hätte gerne andere Meinungen zu dem Thema. Was denkt Ihr? &lt;br /&gt;
-- Markus&lt;br /&gt;
&lt;br /&gt;
* Ganz meine Meinung! Die Startseite ist zu unübersichtlich, man findet nicht wirklich den &amp;quot;Eingang&amp;quot;. [[Benutzer:OldBug|Patrick]] 14:28, 7. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
* Zustimmung! Der Schreibschutz ist jetzt aufgehoben, wenn du die Startseite aendern moechtest, mach&#039;s einfach. ([[Benutzer:Andreas|Andreas]] 14:50, 8. Jun 2004 (CEST))&lt;br /&gt;
&lt;br /&gt;
* Klasse neue Startseite, Markus! Was ich mir noch vorstellen könnte ist, dass einige nicht checken das alle blauen Wörter Links sind und ein Artikel dahinter steckt. Mir ist dazu aber bisher noch keine idiotensichere Formulierung eingefallen. - [[Benutzer:Ozel|Ozel]] 09:50, 9. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
* Ich finde die neue Startseite auch schöner als die alte. Aber: Es ist eine gewisse Konvention im Internet, dass Links UNTERSTRICHEN angezeigt werden. Ich weiß, ich weiß, das kann man alles durch Stylesheets, Preferences usw. konfigurieren, aber der DEFAULT ist halt, wenn ich auf eine x-beliebige Seite gehe, dass ich Unterstrichenes anklicken kann. Insofern finde ich &amp;quot;blaue&amp;quot; Links nicht so einleuchtend.  Na gut, immer noch besser als MMN (Mystery Meat Navigation) und nur meine 2 Cent zum &amp;quot;Mal-drüber-Nachdenken&amp;quot; --[[Benutzer:Martin|Martin]] 01:48, 17. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
:* Stimmt! Links zu unterstreichen wäre eine einfache Lösung. Gerade wegen CSS kann Andreas das ja ganz leicht abändern. --[[Benutzer:Ozel|Ozel]] 00:29, 18. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
:* Links die nur beim darüberfahren mit dem Mauszeiger unterstrichen werden sind weit verbreitet, und durch die einheitliche Farbgebung sehe ich keine Verwirrungsgefahr. -- [[Benutzer:Andreas|Andreas]] 08:01, 18. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
::* Also ich will da nichts mit religiösem Eifer verfechten, obwohl ich &amp;quot;blau&amp;quot; für weniger deutlich als &amp;quot;unterstrichen&amp;quot; halte. (Vielleicht liegt das auch daran, dass ich eine recht kleine Schrift eingestellt habe und insofern der Farbunterschied weniger deutlich ist, da die Buchstaben weniger Pixel ansteuern.) Aber was Andreas schreibt, ist für mich OK, und die Links &amp;quot;antworten&amp;quot; beim Drüberfahren ja auch und geben sich dann deutlich als solche zu erkennen (also nicht so ganz extreme MMN, wo sich nur der Cursor ändert). Das dezente blau für die Links lenkt beim Lesen sicher auch weniger ab als viele Unterstreichungen, ich sehe also durchaus auch den Vorteil. Insofern ist das für mich in Ordnung wie es jetzt ist. (Die salomonische Lösung wäre eine Option in den Benutzereinstellungen, wie Links präsentiert werden sollen, vielleicht kommt das ja mal.) --[[Benutzer:Martin|Martin]] 12:13, 18. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
=== Bearbeitungshilfe ===&lt;br /&gt;
Wenn man sich eine Seite zum Editieren holt und auf &amp;quot;Bearbeitungshilfe&amp;quot; klickt, kommt man zur Seite [[Uc-wiki:Editierhilfe]], die aber keinen Text enthält =&amp;gt; also keine große &amp;quot;Hilfe&amp;quot; :-( ... --[[Benutzer:Martin|Martin]] 01:48, 17. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
Die Seite wurde mit der Editierhilfe wurde laut &amp;quot;Letzte Änderungen&amp;quot; zwar angefasst, aber ich bekomme weiterhin eine leere Seite. Liegt das möglicherweise an meinen Browser-Einstellungen? (Ist aber ziemlich Vanilla-Netscape-Standard.) --[[Benutzer:Martin|Martin]] 12:13, 18. Jun 2004 (CEST)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Assembler&amp;diff=2489</id>
		<title>Diskussion:Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Assembler&amp;diff=2489"/>
		<updated>2004-06-18T09:52:06Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;Assembler&amp;quot; bedeutet meiner Meinung nach nicht zwingend, dass die Maschinenbefehle tatsächlich &amp;quot;direkt von der Hardware&amp;quot; ausgeführt werden. So ist z.B. für Java eine &amp;quot;Virtuelle Maschine&amp;quot; (JVM) mit kompletter &amp;quot;Hardware&amp;quot;-Architektur, Hex-Codes für die Maschinenbefehle usw. definiert, so dass man die JVM auch auf &amp;quot;Assembler&amp;quot;-Niveau programmieren kann (mit &amp;quot;jasm&amp;quot;). Die übliche Implementierung der JVM erfolgt allerdings durch ein Programm, das die Hex-Codes der JVM-Befehle lediglich interpretiert.&lt;br /&gt;
&lt;br /&gt;
Ähnlich war es von gut 25 Jahren mit der &amp;quot;Pascal Micro Engine&amp;quot;. Eine damals verbreitete Pascal-Variante - UCSD-Pascal - übersetzte &amp;quot;nur&amp;quot; in einen Byte-Code, der dann von einem anderen Programm &amp;quot;interpretiert&amp;quot; wurde&amp;quot;. Anfang der 1980-er gab es aber auch eine Hardware-Implementierung der Pascal Micro Engine (vertrieben von Kontron, wenn ich mich richtig erinnere).&lt;br /&gt;
&lt;br /&gt;
OK, für dieses Wiki ist das vielleicht ein wenig zu spitzfindig, und da ich die Kriterien, wann man von &amp;quot;Assembler&amp;quot; spechen kann oder sollte auch nicht besser auf den Punkt bringen kann, lasse ich das einfach mal als &amp;quot;Diskussion&amp;quot; hier stehen. (Böse Zungen behaupten ja auch, C sei nicht wirklich eine &amp;quot;höhere Programmiersprache&amp;quot; sondern nur ein halbwegs hardware-unabhängiger Assembler :-))&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Martin|Martin]] 22:29, 17. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Also, wenn man die Begriffe Assembler/Interpreter/Compiler&lt;br /&gt;
nicht sauber unterscheiden kann, desgleichen die Begriffe&lt;br /&gt;
Quellcode/Zwischencode/Maschinencode, sollte man lieber&lt;br /&gt;
keine Vorträge darüber halten.    :-))))))&lt;br /&gt;
&lt;br /&gt;
W.W. Heinz&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Martin hat schon recht damit! Assembler ist meiner Lehrunterlage nach &amp;quot;nur&amp;quot; der Übersetzer von Mnemonics in Opcodes... Das, was der Prozessor später aus seinem Programm-Speicher interpretiert, sind nur noch die Opcodes und deren Parameter. Mit &amp;quot;Prozessor&amp;quot; ist dabei aber nicht zwangsweise nur der in Hardware existierende Prozessor gemeint.&lt;br /&gt;
&lt;br /&gt;
[[Benutzer:OldBug|Patrick]] 09:25, 18. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Hallo Patrick,&lt;br /&gt;
&lt;br /&gt;
danke für die Klarstellung.&lt;br /&gt;
&lt;br /&gt;
Hallo W.W. Heinz,&lt;br /&gt;
&lt;br /&gt;
du bist herzlich eingeladen, mal eine Seite hier in diesem Wiki zu initiieren, die sich mit den Unterschieden und der Abgrenzung dazwischen beschäftigt. Problematisch finde ich nicht das Auseinanderhalten der THEORETISCHEN Begriffe, sondern KRITERIEN dafür setzen, wann man bezogen auf REAL Vorhandenes von dem einen und dem anderen sprechen kann oder sollte.&lt;br /&gt;
&lt;br /&gt;
Heute sind etwa bei Compiler/Interpreter die Grenzen ja fließend. Es gab früher primitive Interpreter, die jedesmal wieder den Quelltext Zeile für Zeile parsen. Typische Technik ist heute jedoch, intern einen Zwischencode zu erzeugen, der dann von einem &amp;quot;Prozessor in Software&amp;quot; (siehe Patricks Anmerkung) ausgeführt wird. Da dieser Zwischencode-Prozessor aber mit dem Interpreter gebündelt ist, spürt der normale &amp;quot;User&amp;quot; davon nichts.&lt;br /&gt;
&lt;br /&gt;
Bei Java ist der &amp;quot;Compiler&amp;quot; und der &amp;quot;Zwischencode-Prozessor&amp;quot; (die JVM) ganz offiziell getrennt. Bei anderen Interpreter-Sprachen gibt es mitunter Tricks, dem Interpreter den Zwischen-Code zu &amp;quot;entlocken&amp;quot; und später zur Ausführung wieder &amp;quot;unterzuschieben&amp;quot;, z.B. bei Unix &#039;sendmail&#039; (eigentlich ein komplexer Makroprozessor, der &amp;quot;nebenbei&amp;quot; auch als MTA fungieren kann). Dann könnte auch noch der (Software-) Prozessor, der Zwischencode ausführt, eine &amp;quot;Just In Time&amp;quot;-Compilierung machen. Einige JVMs tun das, d.h. wenn sie die selbe Sequenz von Zwischencode oft genug gesehen haben, erzeugen sie dafür Maschinenbefehle, bei der Ausführung eines Java-Programms kann man es - abhängig von der JVM - mit einem Mix aus Zwischencode und (nativem) Maschinencode zu tun haben.&lt;br /&gt;
&lt;br /&gt;
Unstrittig ist, dass bei einem &amp;quot;reinen&amp;quot; Assembler eine Nähe der Eingabesprache zu einer (echten oder Pseudo-) Hardware-Architektur besteht, dass also die eigentliche Umwandlung des Quelltextes mehr oder weniger nur eine &amp;quot;1:1&amp;quot;-Abbildung zwischen den Mnemos und den verarbeiteten Op-Codes ist. Aber wo ordnet man Makro-Assembler ein? Leistungsfähige Makrosprachen sind - von den Möglichkeiten, die Sie bieten - höheren Programmiersprachen ähnlich. Aus meiner Großrechner-Zeit erinnere ich mich an ein Makropaket mit dessen Hilfe man nicht nur mathematische Ausdrücke auf einfache Art und Weise in &amp;quot;Assembler&amp;quot;-Programmen verwenden konnte, es gab sogar komplexe Matrizen-Operationen auf einem Level, der deutlich über dem liegt, was beispielsweise C standardmäßig bietet, eher vregleichbar mit generischer Programmierung, so wie sie etwa die Templates von C++ ermöglichen (aber wie gesagt mit Assembler-Makros!).&lt;br /&gt;
&lt;br /&gt;
Schließlich gibt es auch noch &amp;quot;mikroprogrammierbare Prozessoren&amp;quot; in die man für unterschiedliche Zwecke optimierte Mikroprogramme laden kann. Für solche ist dann der Output eines typischen Assemblers nur ein Zwischencode, weil die &amp;quot;real&amp;quot; ausgeführten Befehle ja noch primitiver sind. Und manche CISC-Architekturen sind eigentlich auch mikroprogrammierbare Prozessoren, lediglich mit einem &amp;quot;fest verdrahteten&amp;quot; Mikroprogramm (Western Digitals &amp;quot;Pascal Micro Engine&amp;quot; gehört meines Wissens in diese Kategorie).&lt;br /&gt;
&lt;br /&gt;
Meine Bemerkung, dass ich das auch nicht besser zu formulieren weiß, bezog sich vor allem auf solche Abgrenzungsprobleme vor dem konkreten Hintergrund, dass man für den (vermutlich typischen) Leserkreis dieses Wikis aber auch gar nicht diese Detailtiefe braucht.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Martin|Martin]] 11:52, 18. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Assembler&amp;diff=2482</id>
		<title>Diskussion:Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Assembler&amp;diff=2482"/>
		<updated>2004-06-17T20:29:23Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;Assembler&amp;quot; bedeutet meiner Meinung nach nicht zwingend, dass die Maschinenbefehle tatsächlich &amp;quot;direkt von der Hardware&amp;quot; ausgeführt werden. So ist z.B. für Java eine &amp;quot;Virtuelle Maschine&amp;quot; (JVM) mit kompletter &amp;quot;Hardware&amp;quot;-Architektur, Hex-Codes für die Maschinenbefehle usw. definiert, so dass man die JVM auch auf &amp;quot;Assembler&amp;quot;-Niveau programmieren kann (mit &amp;quot;jasm&amp;quot;). Die übliche Implementierung der JVM erfolgt allerdings durch ein Programm, das die Hex-Codes der JVM-Befehle lediglich interpretiert.&lt;br /&gt;
&lt;br /&gt;
Ähnlich war es von gut 25 Jahren mit der &amp;quot;Pascal Micro Engine&amp;quot;. Eine damals verbreitete Pascal-Variante - UCSD-Pascal - übersetzte &amp;quot;nur&amp;quot; in einen Byte-Code, der dann von einem anderen Programm &amp;quot;interpretiert&amp;quot; wurde&amp;quot;. Anfang der 1980-er gab es aber auch eine Hardware-Implementierung der Pascal Micro Engine (vertrieben von Kontron, wenn ich mich richtig erinnere).&lt;br /&gt;
&lt;br /&gt;
OK, für dieses Wiki ist das vielleicht ein wenig zu spitzfindig, und da ich die Kriterien, wann man von &amp;quot;Assembler&amp;quot; spechen kann oder sollte auch nicht besser auf den Punkt bringen kann, lasse ich das einfach mal als &amp;quot;Diskussion&amp;quot; hier stehen. (Böse Zungen behaupten ja auch, C sei nicht wirklich eine &amp;quot;höhere Programmiersprache&amp;quot; sondern nur ein halbwegs hardware-unabhängiger Assembler :-))&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Martin|Martin]] 22:29, 17. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Include-Files_(C)&amp;diff=2499</id>
		<title>Include-Files (C)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Include-Files_(C)&amp;diff=2499"/>
		<updated>2004-06-17T16:10:33Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Include-Files in C/C++ enthalten typischerweise Informationen, die im Rahmen der Kompilierung verschiedener anderer Quelltexte (mehrfach) benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Wer bisher hauptsächlich kleinere (Assembler-) Programme für Mikrocontroller realisiert hat und sich nun langsam an größere Projekte heranwagt und deshalb auf C umsteigt, ist gut beraten, die Möglichkeiten sinnvoll einzusetzen, die Include-Files in C bieten. Dabei gilt es allerdings auch, einige Fallgruben zu vermeiden - mehr dazu in diesem Artikel.&lt;br /&gt;
&lt;br /&gt;
== Verwendung von Include-Files ==&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von Include-Files in [[C]] und [[C-Plusplus|C++]] führt in der Regel zu besser strukturierten und damit besser wartbaren Programmen. Indem bestimmte, zentrale Informationen nur ein einziges Mal hinterlegt werden, fällt insbesondere bei Änderungen weniger Aufwand an.&lt;br /&gt;
&lt;br /&gt;
Der übliche Suffix für Include-Files ist &amp;quot;&amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt;&amp;quot;, manchmal auch &amp;quot;&amp;lt;tt&amp;gt;.hpp&amp;lt;/tt&amp;gt;&amp;quot; (für C++), und die &#039;&#039;Verwendung&#039;&#039; eines Include-Files ist sehr einfach:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;xyz.h&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme bei Include-Files ==&lt;br /&gt;
In Include-Files werden mitunter Informationen aus anderen Include-Files benötigt und es ist an der Verwendungsstelle eines Include-Files oft nicht das Wissen über die möglicherweise sehr komplexen Abhängigkeiten vorhanden. Nachfolgend wird ausgehend von einer typischen Problemstellung eine Standardtechnik erläutert, die hilft, das Wissen um Abhängigkeiten an der Verwendungsstelle überflüssig zu machen:&lt;br /&gt;
&lt;br /&gt;
Angenommen, es existieren zwei Datenstrukturen für die es die Typdefinitionen &amp;lt;tt&amp;gt;s1_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; gibt, die jeweils entsprechenden Include-Files hinterlegt sind, also&lt;br /&gt;
&amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Definition der Datenstruktur s1 */&lt;br /&gt;
struct s1 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s1_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Datei &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt; sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* Definition der Datenstruktur s2 */&lt;br /&gt;
struct s2 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
s2_t *bar();&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine bestimmte Applikation benötigt nun beide Struktur- und Funktions-Definitionen und inkludiert entsprechend beide Dateien, es gibt also eine kompilierbare Datei (z.B. &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt;) die wie folgt aussieht:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;s1.h&amp;quot;&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
int main() {&lt;br /&gt;
    s1_t a;&lt;br /&gt;
    s2_t *b;&lt;br /&gt;
    ...&lt;br /&gt;
    foo(a);&lt;br /&gt;
    b = bar();&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
So weit, so gut.&lt;br /&gt;
&lt;br /&gt;
Nun kommt es eines Tages zu einer Änderung, die darauf hinausläuft, dass die erste Struktur die zweite als Element enthält. Das heißt die Datei &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; sieht nun wie folgt aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Daraufhin wird sich &amp;lt;tt&amp;gt;main.c&amp;lt;/tt&amp;gt;(!) nicht mehr kompilieren lassen, da bei der Verarbeitung von &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; (noch) nicht bekannt ist, worum es sich um bei &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; handelt. (Es könnte ja auch einfach nur ein Tippfehler sein!)&lt;br /&gt;
&lt;br /&gt;
Da es in der Praxis einen immensen Pflegeaufwand auslösen kann, wenn Änderungen in Include-Files Änderungen in vielen weiteren Dateien erfordern (dem Wesen nach soll ja eine Include-Dateien eine Information zentral für viele andere Dateien bereitstellen), muss nach einem Ausweg gesucht werden.&lt;br /&gt;
&lt;br /&gt;
Dieser könnte so aussehen, dass man &amp;quot;vorsorglich&amp;quot; die Beschreibung der verwendeten Datenstruktur in &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; inkludiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inkludiert das Hauptprogramm lediglich &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;, wäre nun alles in Ordnung, wenn aber beide Dateien inkludiert werden, beschwert sich der Compiler über die doppelte Definition der Datentypen. (Die doppelte Deklaration von Funktionen ist kein Fehler, wenn sie übereinstimmend erfolgt.)&lt;br /&gt;
&lt;br /&gt;
== Problemlösung mit Makros ==&lt;br /&gt;
Die übliche und - fast - perfekte Lösung des Problems besteht darin, den eigentlichen Inhalt eines Include-Files vor einer zweiten Verarbeitung durch eine &#039;&#039;bedingte Kompilierung&#039;&#039; zu schützen.&lt;br /&gt;
Bei der bedingten Kopilierung handelt es sich ebenfalls um ein Feature des [[C-Präprozessors]] und es wird hier wie folgt auf die Datei &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt; angewendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
struct s2 {&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
s2_t *bar();&lt;br /&gt;
...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da das beschriebene Problem in größeren Programmsystemen auch in Bezug auf die andere Struktur auftreten könnte, sollte man die Datei &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt; vorsorglich mit einem ähnlichen Schutz ausstatten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    s2_t x;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
/* Funktions-Deklarationen */&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Der nette Nebeneffekt ist, dass es damit auch keine Rolle spielt, in welcher Reihenfolge beide Dateien in &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;inkludiert werden.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung der Regeln ==&lt;br /&gt;
Kochrezeptartig kann man beim Schreiben und Verwenden von Include-Files auch einfach die folgenden Regeln anwenden:&lt;br /&gt;
* Wird die externe Schnittstelle (Datenstrukturen, Funktions-Deklarationen) eines Moduls &#039;&#039;XYZ&#039;&#039; in einem Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; beschrieben, so sollte ein bestimmter Makroname (z.B. &amp;lt;tt&amp;gt;XYZ_h&amp;lt;/tt&amp;gt;) für die Steuerung der tatsächlichen Verarbeitung des Include-Files reserviert werden(*1).&lt;br /&gt;
* Der Include-File selbst testet (und definiert anschließend) diesen Makro, um so eine doppelte Verarbeitung zu vermeiden.&lt;br /&gt;
* Wird in einer Kompilierung das Modul &#039;&#039;XYZ&#039;&#039; verwendet (= eine seiner Datenstrukturen oder Funktionen), wird auch der Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; in diese Kompilierung eingeschlossen.&lt;br /&gt;
* Verwendet das Modul &#039;&#039;XYZ&#039;&#039; &#039;&#039;&#039;intern&#039;&#039;&#039; ein weiteres Modul &#039;&#039;UVW&#039;&#039;, so wird &#039;&#039;&#039;dessen&#039;&#039;&#039; Include-File &amp;lt;tt&amp;gt;uvw.h&amp;lt;/tt&amp;gt; im Include-File &amp;lt;tt&amp;gt;xyz.h&amp;lt;/tt&amp;gt; eingeschlossen.&lt;br /&gt;
&lt;br /&gt;
Die beschriebenen Regeln funktionieren zufriedenstellend und entlasten vor allem Programm-Code, welcher Include-Files lediglich einschließt, vom Wissen über komplexe Zusammenhänge zwischen einzelnen Modulen. Ferner spielt die Reihenfolge, in der man Include-Files verwendet, keine Rolle und man kann sie beliebig gruppieren und ordnen, so wie es am übersichtlichsten ist(*2).&lt;br /&gt;
&lt;br /&gt;
== Gegenseitige Bezugnahme ==&lt;br /&gt;
Eine Ausnahme von der allgemeinen Regel liegt vor, wenn sich zwei Datenstrukturen gegenseitig verwenden (was nur über Zeiger der Fall sein kann).&lt;br /&gt;
Alle wie auch immer gearteten Versuche, diese beiden Strukturdefinitionen und Funktionsprototypen in zwei verschiedene Include-Files aufzuteilen, also z.B. &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
#include &amp;quot;s2.h&amp;quot;&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
s2_t *bar(s1_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
#include &amp;quot;s1.h&amp;quot;&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *yp;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
werden scheitern - mit und ohne dem beschriebenen Schutz vor doppelter Verarbeitung!&lt;br /&gt;
&lt;br /&gt;
Die pragmatische Lösung ist hier, alles in einem &#039;&#039;&#039;gemeinsamen&#039;&#039;&#039; Include-File &amp;lt;tt&amp;gt;s1_s2.h&amp;lt;/tt&amp;gt;zu hinterlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_S2_h&lt;br /&gt;
#define S1_S2_h&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
typedef struct s1 s1_t;&lt;br /&gt;
&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *yp;&lt;br /&gt;
    ....&lt;br /&gt;
};&lt;br /&gt;
typedef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
void foo(s2_t);&lt;br /&gt;
s2_t *bar(s1_t);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das ist insofern sinnvoll, als ein Programm, welches die eine Struktur kennen muss, stets auch die andere benötigt. Die Aufteilung in zwei Include-Files würde also keinen echten Vorteil bringen.&lt;br /&gt;
&lt;br /&gt;
Eine Ausnahme kann lediglich gemacht werden, wenn auf die jeweils andere Struktur ausschließlich über Zeiger(*3) zugegriffen wird, dann sind auch zwei Include-Files möglich, nämlich &amp;lt;tt&amp;gt;s1.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S1_h&lt;br /&gt;
#define S1_h&lt;br /&gt;
struct s2; /* Vorausdeklaration */&lt;br /&gt;
struct s1 {&lt;br /&gt;
    struct s2 *px;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typdef struct s1 s1_t;&lt;br /&gt;
...&lt;br /&gt;
struct s2 *bar(s1_t);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
und &amp;lt;tt&amp;gt;s2.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef S2_h&lt;br /&gt;
#define S2_h&lt;br /&gt;
struct s1; /* Vorausdeklaration */&lt;br /&gt;
struct s2 {&lt;br /&gt;
    struct s1 *py;&lt;br /&gt;
    ...&lt;br /&gt;
};&lt;br /&gt;
typdef struct s2 s2_t;&lt;br /&gt;
...&lt;br /&gt;
void bar(struct s1 *);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Anstatt den jeweils anderen Include-File einzuschließen, sind nun die oben gezeigten Vorausdeklarationen vorzumehmen. (Allerdings sind damit die Typdefinitionen &amp;lt;tt&amp;gt;s1_t&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;s2_t&amp;lt;/tt&amp;gt; nicht verfügbar, die Bezugnahme auf die jeweils andere Struktur kann nur über &amp;lt;tt&amp;gt;struct s1&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;struct s2&amp;lt;/tt&amp;gt; erfolgen.)&lt;br /&gt;
     &lt;br /&gt;
----&lt;br /&gt;
* 1: Die genaue Beziehung zwischen dem Makro-Namen und dem Modul- (oder Struktur-) Namen ist dabei nicht so bedeutend. Die übliche Konvention, solche &amp;quot;Steuer-Makros&amp;quot; mit &amp;quot;&amp;lt;tt&amp;gt;_h&amp;lt;/tt&amp;gt;&amp;quot; oder &amp;quot;&amp;lt;tt&amp;gt;_H&amp;lt;/tt&amp;gt;&amp;quot; zu beenden, soll nur helfen, &amp;quot;zufällige&amp;quot; Kollissionen mit Makros zu vermeiden, die einen anderen Zweck haben.&lt;br /&gt;
* 2: Eine alphabetische Sortierung ist z.B. hilfreich, um bei einem Kompilierfehler schnell überprüfen zu können, ob vielleicht nur ein bestimmter Include-File vergessen wurde.&lt;br /&gt;
* 3: Bei der Verwendunng von C++ gilt das zusätzlich für die Bezugnahme über Referenzen.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Include-Files&amp;diff=14275</id>
		<title>Include-Files</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Include-Files&amp;diff=14275"/>
		<updated>2004-06-17T13:57:13Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Allgemein Dateien, die im Rahmen der Verarbeitung einer anderen Datei &#039;&#039;eingeschlossen&#039;&#039; (inkludiert) werden.&lt;br /&gt;
&lt;br /&gt;
Bei der Programmierung werden Include-Files häufig eingesetzt, um das wiederholte Hinterlegen ein und derselben Information in mehreren Dateien zu vermeiden (z.B. die Beschreibung häufig verwendeter Datenstrukturen).&lt;br /&gt;
&lt;br /&gt;
Für die bei der Programmierung von Mikrocontrollern oft verwendeten, [[HLL|höheren Programmiersprachen]] [[C]] und [[C-Plusplus|C++]] bietet der [[C-Präprozessor]] entsprechende Möglichkeiten.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Templates_(C%2B%2B)&amp;diff=11880</id>
		<title>Templates (C++)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Templates_(C%2B%2B)&amp;diff=11880"/>
		<updated>2004-06-17T13:49:23Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Templates in C++ - mitunter &#039;&#039;Schablonen&#039;&#039; genannt - erlauben die &amp;quot;generische Programmierung&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Bei der Programmierung von Mikrocontrollern in C++ sind Templates deshalb interessant, weil sie zum Zeitpunkt der Kompilierung greifen und damit zu weniger Overhead führen (können) als sehr &amp;quot;universelle&amp;quot; Bibliotheksfuntionen, deren Leistungsumfang von einer konkreten Applikation nur teilweise benutzt wird. Da Templates nur einmalig hinterlegt sind, vermeiden sie die Nachteile der [[Copy&amp;amp;Paste-Programmierung]].&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie parametrisierte [[Makro]]s kann man Templates als Quelltexte verstehen, die &#039;&#039;&#039;einmal&#039;&#039;&#039; geschrieben und &#039;&#039;&#039;häufig&#039;&#039;&#039; eingesetzt werden - jeweils mit mehr oder weniger großen Variationen. Insbesondere lassen sich mit Templates&lt;br /&gt;
* Datentypen(*1) und&lt;br /&gt;
* Compilezeit-Konstanten&lt;br /&gt;
parametrisieren, das heißt bis zu einer konkreten Verwendung einer Template (= Instanziierung) offen halten.&lt;br /&gt;
&lt;br /&gt;
Als Beispiel hier eine Template(-Funktion) zum Vertauschen von zwei Ganzzahlen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
void swap(T* xp, T* yp) {&lt;br /&gt;
     T tmp; tmp = *xp; *xp = *yp; *yp = tmp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die erste Zeile erklärt dabei dem C++-Compiler, dass das nachfolgend verwendete Symbol &#039;&#039;T&#039;&#039; einen beliebigen Typnamen repräsentiert. (Ohne diese Zeile würde man eine Fehlermeldung wegen eines undefinierten Namens erhalten.)&lt;br /&gt;
&lt;br /&gt;
Bei der späteren, tatsächlichen Verwendung dieser Funktion kann man einen konkreten Typ angeben&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int a, b;&lt;br /&gt;
double c, d;&lt;br /&gt;
struct s e, f;&lt;br /&gt;
...&lt;br /&gt;
swap&amp;lt;int&amp;gt;(&amp;amp;a, &amp;amp;b);&lt;br /&gt;
swap&amp;lt;double&amp;gt;(&amp;amp;c, &amp;amp;d);&lt;br /&gt;
swap&amp;lt;struct s&amp;gt;(&amp;amp;e, &amp;amp;f);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oder - noch einfacher - lässt den Compiler aus dem Typ des verwendeten Template-Arguments auf den Typ von &#039;&#039;T&#039;&#039; schließen(*2):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
swap(&amp;amp;a, &amp;amp;b);&lt;br /&gt;
swap(&amp;amp;c, &amp;amp;d);&lt;br /&gt;
swap(&amp;amp;e, &amp;amp;f);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beim Programmieren mit Templates sollte allerdings auf die Minimierung von Abschnitten geachtet werden, für die der erzeugte Code &#039;&#039;&#039;nicht&#039;&#039;&#039; mit den Template-Parametern variiert, zumindest dann, wenn eine Template typischerweise in ein und demselben Quelltext mehrfach mit unterschiedlichen Parametern verwendet wird. &lt;br /&gt;
Für das obige Beispiel ist das insofern der Fall, als Zuweisungen in der Template-Funktion Machinencode erzeugen werden, der für die unterschiedlichen Datentypen jeweils verschieden ausfällt. (Z.B. ein &#039;&#039;MOV&#039;&#039;-Befehl für 2 oder 4 Byte bei für die Verwendung mit &#039;&#039;int&#039;&#039;, 8 &lt;br /&gt;
Byte für &#039;&#039;double&#039;&#039; und vielleicht einen &#039;&#039;memmove&#039;&#039;-Aufruf für die Strukturzuweisung.)&lt;br /&gt;
&lt;br /&gt;
Andererseits könnte der Aufruf von &#039;&#039;swap&#039;&#039; mit den Datentypen &#039;&#039;long&#039;&#039; und &#039;&#039;float&#039;&#039; dazu führen, dass aufgrund der Template zwei Funktionen instanziiert werden, die vom Maschinencode her identisch sind (wenn &#039;&#039;float&#039;&#039; und &#039;&#039;long&#039;&#039; beide 4 Byte haben). Das selbe gilt bei der Verwendung von &#039;&#039;swap&#039;&#039; mit verschiedenen Struktur-Typen der selben Größe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Um den berühmt-berüchtigten &amp;quot;Code-Bloat&amp;quot; durch Templates zu vermeiden, ist also eine gute Kenntnis der Hintergründe des Template-Mechanismus unabdingbar!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
*1: Früher hatten Templates in C++ daher den Namen &#039;&#039;Parametrized Types&#039;&#039;.&lt;br /&gt;
*2: Voraussetzung dafür ist, dass die Template eine Funktion und keine Klasse beschreibt und dass der parametrisierte Typ &#039;&#039;T&#039;&#039; aus den aktuellen Parametern erkannt werden kann. (Hier: erwartet wird ein &#039;&#039;Zeiger auf T&#039;&#039;, übergeben werden mit &#039;&#039;&amp;amp;a&#039;&#039; und &#039;&#039;&amp;amp;b&#039;&#039; konkret &#039;&#039;Zeiger auf int&#039;&#039;, also muss es sich bei dem Typ &#039;&#039;T&#039;&#039; in &#039;&#039;&#039;diesem&#039;&#039;&#039; Aufruf um &#039;&#039;int&#039;&#039; handeln.)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=C_vs_C%2B%2B&amp;diff=2922</id>
		<title>C vs C++</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=C_vs_C%2B%2B&amp;diff=2922"/>
		<updated>2004-06-17T13:30:22Z</updated>

		<summary type="html">&lt;p&gt;Martin: Link zum ausführlicheren C++-Template-Artikel eingefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Speziell bei der Verwendung höherer Programmiersprachen ([[HLL]]s) im Bereich der Programmierung von Mikrocontrollern taucht häufig die Frage auf, ob eine Sprache wie [[C-Plusplus|C++]] für &amp;quot;kleinere&amp;quot; Mikroprozessoren nicht einen zu großen Overhead darstelle und ob man nicht besser bei [[C]] (oder gar [[Assembler]]) bleiben solle.&lt;br /&gt;
&lt;br /&gt;
== Beziehung zwischen C und C++ ==&lt;br /&gt;
Ursprünglich entstand C++ als Erweiterung zu C (mit minimalen Ausnahmen - Leitlinie: &amp;quot;As close to C as possible, but no closer&amp;quot;). Damit ist C als Teilmenge in C++ enthalten und jedes C-Programm ist zugleich ein C++-Programm, denn es kann auch mit einem C++-Compiler übersetzt werden (nicht aber umgekehrt!!). Da ein weiterer Grundsatz bei der C++-Entwicklung lautete &amp;quot;You only pay for what you use&amp;quot;, entsteht in einem Programm, das ausschließlich C-Features benutzt aber mit einem C++-Compiler übersetzt wird, kein prinzipiell bedingter Overhead.&lt;br /&gt;
&lt;br /&gt;
So weit die Theorie.&lt;br /&gt;
&lt;br /&gt;
== C++ Performance Fußangeln ==&lt;br /&gt;
Allerdings waren die Zielsysteme bei der Weiterentwicklung von C++ in den letzten 20 Jahren in der Regel PCs und leistungsfähige Workstations, was in der Praxis zwei wichtige Konsequenzen hatte:&lt;br /&gt;
* Die Sprachsyntax von C++ verschleiert mehr als die von C, womit man sich in einem Programm möglicherweise einen hohen, in der Programmierung von Mikrocontrollern unerwünschten Overhead ohne konkreten Nutzen einhandelt.&lt;br /&gt;
* Die tatsächlichen Implementierungen von C++ bemühen sich weniger als die von C, ausführbare Programme (Executables) in der sparsamsten, möglichen Form zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
=== Fußangel-Beispiel 1 ===&lt;br /&gt;
Mitunter werden beim Einsatz von C++ Programmierrichtlininen angewendet, die im Bereich der Mikrocontrollern-Programmierung unsinnig sind oder zumindest nach anderen Kriterien bewertet werden müssen als im PC- und Workstation-Umfeld.&lt;br /&gt;
So führen etwa &amp;quot;vorsorglich angelegte&amp;quot;, aber leere Konstruktoren und Destruktoren in der Regel zu vielen Unterprogramm-Sprungbefehlen, an deren Ziel sofort wieder ein Rücksprung steht.&lt;br /&gt;
&lt;br /&gt;
Oder es werden - dem Beispiel von Java oder bestimmten Entwurfsmustern folgend - Objekte in jedem Fall dynamisch angelegt, was das Einbinden komplexer Unterstützungsroutinen für die Speicherverwaltung auslöst und in keinem Fall zu Ergebnissen führt, deren Performance vergleichbar zu einfachen Variablen auf dem Stack oder an festen Adressen ist.&lt;br /&gt;
&lt;br /&gt;
=== Fußangel-Beispiel 2 ===&lt;br /&gt;
Manchmal wird ein einfaches &amp;quot;hello, world&amp;quot;-Programm in C und eines in C++ auf einem PC kompiliert und die Größe des erzeugten Executables als Kriterium für den Resourcen-Bedarf der jeweiligen Programmiersprache herangezogen. Dieser Vergleich kann sehr in die Irre führen, da die typischen Ausgabe-Anweisungen der Sprachen C und C++ von Bibliotheksfunkionen abgewickelt werden, die aber mit Sicherheit bei der Kompilierung für einen Mikrocontroller ganz anders aussehen (wenn sie dort überhaupt vorhanden sind).&lt;br /&gt;
&lt;br /&gt;
Bei der Strukturierung von unterstützenden Bibliotheksfunktionen wird im PC- und Workstationbereich kaum darauf geachtet, ob einem Minimal-Programm möglicherweise unnötiger Overhead mit hinzugebunden wird. So könnte beispielsweise - obwohl nur eine einfache Zeichenkette ausgegeben wird - durch eine Ausgabeanweisung die Unterstützung für die Ausgabe aller Datentypen inklusive Gleitpunktzahlen angesprochen werden, dies könnte wiederum das Hinzubinden der mathematischen Bibliothek auslösen und - bei Kompilierung für einen Prozessor ohne Hardware-Support für Gleitpunkt-Operationen - einer weiteren Bibliothek zu deren Emulation. Das alles, wie gesagt, obwohl überhaupt keine Gleitpunktzahl in der konkreten Ausgabe vorkommt.&lt;br /&gt;
&lt;br /&gt;
== Vererbung und Aggregation ==&lt;br /&gt;
Beide Mechanismen sind aus Sicht der Umsetzung als geschachtelte Strukturen zu verstehen. Eventuelle kleinere Performance-Einbußen könnten durch die fehlende Möglichkeit der Register-Optimierung entstehen, die ein Compiler bei mehreren, nicht zu einer Struktur zusammengefassten Variablen prinzipiell hat. Allerdings sind die Vor- und Nachteile hier in C und C++ die selben, und insofern ist das Thema für einen Vergleich &amp;quot;C vs C++&amp;quot; nicht relevant.&lt;br /&gt;
&lt;br /&gt;
In größeren Programmen überwiegt in aller Regel der Vorteil der besseren Strukturierung durch die Zusammenfassung von Einzelvariablen, insbesondere wenn auch die in C++ vorhandenen Mechanismen zum Zugriffsschutz eingesetzt werden. In kleinen Programmabschnitten mit extrem kritischer Performance kann ggf. eine &amp;quot;Hand-Optimierung&amp;quot; und Auflösung von Strukturen in Einzelvariablen erfolgen (oder gleich eine Re-Implementierung in Assembler).&lt;br /&gt;
&lt;br /&gt;
== Virtuelle Methoden ==&lt;br /&gt;
Virtuelle Methoden sind im Grunde genommen Funktionszeiger und insofern überall dort sinnvoll, wo man in einem C-Programm zur Lösung des Problems einen Funktionszeiger eingesetzt hätte (oder in Assembler eine Einsprung-Adresse in Maschinencode hinterlegt oder übergeben hätte).&lt;br /&gt;
Werden Methoden in C++ unnötigerweise &amp;quot;virtual&amp;quot; deklariert (mit anderen Worten: steht die Einsprungadresse immer fest und hätte insofern auch der Compiler oder Linker sie bestimmen können), so ist der Overhead natürlich unnötig - aber auch leicht vermeidbar, indem man solche Methoden eben NICHT als &amp;quot;virtual&amp;quot; deklariert.&lt;br /&gt;
&lt;br /&gt;
Dort, wo sinnvoll, also wo virtuelle Methoden tatsächlich ein PROBLEM lösen helfen, sind sie in der Regel eleganter und programmiertechnisch einfacher zu handhaben als explizite Funktionszeiger.&lt;br /&gt;
&lt;br /&gt;
== Interfaces (Abstrakte Basisklassen) ==&lt;br /&gt;
Abstrakte Basisklassen sind im Grunde genommen Bündel von Funktionszeiger und ebenso wie virtuelle Methoden genau dort sinnvoll, wo sie ein Problem lösen helfen. Hierzu ein Beispiel: Ein Embedded-System hat eine Verbindung zu einem Host-Rechner zwecks Datenaustausch. Es besteht entweder ein LAN-Zugang oder an der seriellen Schnittstelle hängt ein Modem. Möglicherweise kommt es im laufenden Betrieb auch zu einer Umkonfiguration oder die Hostverbindung fällt komplett aus, dann sollen die Daten in einem lokalen, nicht-flüchtigen Speicher abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Damit die Applikation nicht alle Eventualitäten an zahlreichen Stellen des Programms verteilt berücksichtigen muss, abstrahiert man den Datenaustausch z.B.&lt;br /&gt;
* Verbindung intiieren&lt;br /&gt;
* Daten übergeben&lt;br /&gt;
* Übernahme bestätigen&lt;br /&gt;
* Verbindung abbauen&lt;br /&gt;
in einem Interface. Jede der genannten Operationen entspricht dabei einem Zeiger auf ein entsprechendes Unterprogramms (also dessen Einsprungadresse). Tatsächlich implementiert werden diese Unterprogramm mehrfach (einmal für LAN, einmal für Modem, einmal für lokalen Speicher) und der eigentlichen Applikation wird - mehr oder weniger transparent - einfach das passende Funktionszeigerbündel übergeben, jenachdem, welche Art von Host-Verbindung derzeit möglich ist.&lt;br /&gt;
&lt;br /&gt;
Auch hier ist es wieder so, dass ein Interface - realisiert durch eine abstrakte Basisklasse - im Vergleich zu expliziten Funktionszeigern eleganter und programmiertechnisch einfacher ausfällt (sofern man einmal das Prinzip verstanden hat). Eben so gilt, dass abstrakte Basisklassen zu unnötigem Overhead führen, falls man sie &amp;quot;nur mal so&amp;quot; einsetzt, also ohne dass sie, wie oben dagestellt, ein konkretes Problem lösen.&lt;br /&gt;
&lt;br /&gt;
== Execptions (Ausnahmebehandlung) ==&lt;br /&gt;
Mit Exceptions lässt sich ein &amp;quot;alternativer Kontrollfluss&amp;quot; in einem Programm definieren, vorzugsweise zur Handhabung von Fehlersituationen oder anderer &amp;quot;außergewöhnlicher Ereignisse&amp;quot;. Mit der Einführung von Exceptions musste in C++ aber auch die Leitlinie &amp;quot;You only pay for what you use&amp;quot; verletzt werden. Das heißt es entsteht stets etwas Overhead, wenn der C++-Compiler Exceptions unterstützt, auch für Programme, die Execptions überhaupt nicht benutzen. Aus diesem Grund lassen sich Execptions über Kommandozeilen-Argumente des Compilers oder in den Projekt-Optionen einer Tool-Chain häufig deaktivieren.&lt;br /&gt;
&lt;br /&gt;
== Laufzeit-Typinformation ==&lt;br /&gt;
Laufzeit-Typinformation (auch Runtime Type Information oder RTTI genannt), verursacht unter Umständen ebenfalls einen geringen Overhead in C++, auch wenn ein Programm RTTI nicht benutzt. Insofern gilt wie für Execptions, dass man ggf. nach einer Möglichkeit suchen sollte, RTTI ganz abzuschalten, wenn man das Feature nicht braucht. Auf der anderen Seite ist der RTTI-Overhead im Vergleich zu Exceptions sehr gering und entsteht vor allem im Hinblick auf ein wenig zusätzlich benötigten Speicherplatz, nicht in Form unnötig ausgeführter Anweisungen. (Nach Abschalten der RTTI-Unterstützung darf man also kein &amp;quot;schnelleres&amp;quot; Programme erwarten.)&lt;br /&gt;
&lt;br /&gt;
== Templates (Schablonen) ==&lt;br /&gt;
[[Templates (C-Plusplus)|Templates]] sind ein Mechanismus, der zwischen Implementierungs- und Kompilierungs-Zeitpunkt greift. Im Grunde genommen steht mit einer C++-Template &amp;quot;ein bisschen Programmcode&amp;quot; stellvertretend für &amp;quot;möglicherweise sehr viel Programmcode&amp;quot;, der aber noch in einem bestimmten Aspekt - einem Datentyp oder eine Konstante - variieren kann. Der allgemeine Teil (Template) wird nur einmalig implementiert und später in mehr oder weniger vielen Varianten kompiliert. (Das am ehesten vergleichbare Äquivalent zu C++-Templates sind in C die Präprozessor-Makros.)&lt;br /&gt;
&lt;br /&gt;
Unter diesem Aspekt betrachtet sind Templates keine Verschwendung (wie manchmal behauptet) sonder sehr sparsam und ideal für Mikrocontroller, da sie im Vergleich zu einer Bibliotheksfunktionen, die quasi &amp;quot;auf Vorrat&amp;quot; viele Varianten berücksichtigen, von denen konkret aber nicht alle genutzt werden, einem Programm nur das hinzufügt, was wirklich benötigt wird.&lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite sind Templates ein neueres Feature von C++ zu dem bis vor wenigen Jahren auf Seite der Compiler-Lieferanten kaum Erfahrung hinsichtlich der optimalen Umsetzung bestand. Auch in der Fachliteratur werden Templates meist mit viel geringerer Tiefe und weniger Praxisbezug behandelt als diejenigen Features, die schon sehr lange von C++ unterstützt werden (Vererbung usw.). Eine generelle Empfehlung, Templates bei der Verwendung von C++ im Bereich der Mikrocontroller-Programmierung NICHT einzusetzen, ist daraus aber keinesfalls abzuleiten - ganz im Gegenteil: Zur Lösung vieler Probleme sind Templates besser geeignet als etwa Präprozessor-Makros oder gar [[Copy&amp;amp;Paste-Programmierung]].&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer_Diskussion:Martin&amp;diff=14273</id>
		<title>Benutzer Diskussion:Martin</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer_Diskussion:Martin&amp;diff=14273"/>
		<updated>2004-06-17T13:03:39Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Templates_(C%2B%2B)&amp;diff=14274</id>
		<title>Diskussion:Templates (C++)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Templates_(C%2B%2B)&amp;diff=14274"/>
		<updated>2004-06-17T13:02:53Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Um den Artikel klein zu halten, habe ich mich darin auf ein einziges, kurzes Beispiel beschränkt, das nur die Grundlagen der C++-Templates verdeutlichen sollte. Falls Interesse besteht, kann ich aber auch mal ein paar Code-Beispiele mit Templates vorstellen, die ich selbst bei der Programmierung von Mikrocontrollern mit C++ als hilfreich und nützlich empfunden habe. (--[[Benutzer:Martin|Martin]] 15:00, 17. Jun 2004 (CEST))&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer_Diskussion:Martin&amp;diff=2472</id>
		<title>Benutzer Diskussion:Martin</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer_Diskussion:Martin&amp;diff=2472"/>
		<updated>2004-06-17T13:00:19Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Um den Artikel klein zu halten, habe ich mich darin auf ein einziges, kurzes Beispiel beschränkt, das nur die Grundlagen der C++-Templates verdeutlichen sollte. Falls Interesse besteht, kann ich aber auch mal ein paar Code-Beispiele mit Templates vorstellen, die ich selbst bei der Programmierung von Mikrocontrollern mit C++ als hilfreich und nützlich empfunden habe. (--[[Benutzer:Martin|Martin]] 15:00, 17. Jun 2004 (CEST))&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Inline_(C%2B%2B)&amp;diff=4124</id>
		<title>Inline (C++)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Inline_(C%2B%2B)&amp;diff=4124"/>
		<updated>2004-06-17T12:54:34Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In C++ werden die Anweisungen von Unterprogrammen(*1), die mit dem Zusatz &#039;&#039;inline&#039;&#039; definiert sind, an jeder Aufrufstelle erneut eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Ein Unterprogramm &#039;&#039;inline&#039;&#039; zu definieren entspricht dem klassischen Austausch von &amp;quot;Geschwindigkeit der Ausführung&amp;quot; gegen &amp;quot;Platzbedarf des Maschinen-Codes&amp;quot;. Da man bei der Programmierung von Mikrocontrollern mitunter in der einen oder anderen Richtung optimieren muss, kann dieses Feature interessant sein.&lt;br /&gt;
&lt;br /&gt;
Mit &#039;&#039;inline&#039;&#039; wird:&lt;br /&gt;
* ein Unterprogrammsprung-Befehl vermieden (=&amp;gt; schneller),&lt;br /&gt;
* ebenso wie der Rücksprung-Befehl am Ende, aber dafür&lt;br /&gt;
* bei Aufrufen an vielen &#039;&#039;&#039;verschiedenen&#039;&#039;&#039; Stellen mehr Code erzeugt.&lt;br /&gt;
* Für sehr kleine Unterprogramme(*2) wird evtl. sogar weniger Code erzeugt (=&amp;gt; doppelter Gewinn) und&lt;br /&gt;
* für leere Unterprogramme wird überhaupt kein Code erzeugt(*3).&lt;br /&gt;
&lt;br /&gt;
Ohne &#039;&#039;inline&#039;&#039; wird:&lt;br /&gt;
* für das Unterprogramm nur &#039;&#039;&#039;einmal&#039;&#039;&#039; Code erzeugt, der bei jedem Aufruf&lt;br /&gt;
* über einen entsprechenden Maschinenbefehl erreicht wird.&lt;br /&gt;
* Eventuell sind unmittelbar nach Eintritt in das Unterprogramm weitere Maschinebefehle nötig(*4),&lt;br /&gt;
* ebenso wie am Ende, wenn das Unterprogramm an die Aufrufstelle zurückkehrt.&lt;br /&gt;
&lt;br /&gt;
Als &#039;&#039;inline&#039;&#039; definierte Unterprogramme werden manchmal auch [[Makros]] genannt, sie verhalten sich aber &amp;quot;semantisch korrekt&amp;quot;. Insbesondere gilt, dass &#039;&#039;inline&#039;&#039;-Unterprogramme&lt;br /&gt;
* lokale Hilfsvariablen haben können und&lt;br /&gt;
* Seiteneffekte auch bei mehrfacher Verwendung eines Parameters nur einmalig stattfinden.&lt;br /&gt;
Damit sind die folgenden Unterprograme (Vertauschen zweier Ganzzahlen, Bestimmung des Maximums zweier Ganzzahlen) unproblematisch.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inline void swap(int *xp, int *yp) {&lt;br /&gt;
        int tmp = *xp; *xp = *yp; *yp = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
inline int max(int a, int b) {&lt;br /&gt;
        return (a &amp;gt; b) ? a : b;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei &amp;quot;Tricksereien&amp;quot; mit [[C-Präprozessor|Makros]] wäre im Fall von &#039;&#039;swap&#039;&#039; dagegen die Verwendung&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int i, j;&lt;br /&gt;
...&lt;br /&gt;
if (i &amp;lt; j)&lt;br /&gt;
      swap(&amp;amp;i, &amp;amp;j);&lt;br /&gt;
else  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ein Syntaxfehler. (Ein Makro für swap müsste wegen der Hilfsvariablen zu einem ein Block {...} expandieren, womit das Semikolon am Ende der Zeile nicht stehen darf.)&lt;br /&gt;
&lt;br /&gt;
Ebenso ist mit einer &#039;&#039;inline-Funktion&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
j = max(i++, 10);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
kein Problem. (Ein Makro würde wegen des rein textuellen Ersatzes seiner Parameter die Inkrementierung u.U. doppelt auslösen.)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
*1: Der Begriff Unterprogramm schließt hier &#039;&#039;Funktionen&#039;&#039; (C-Terminologie) und &#039;&#039;Methoden&#039;&#039; (C++-Terminologie) ein.&lt;br /&gt;
*2: Sehr kleine Unterprogramme kommen insbesondere bei der Objektorientierter Programmierung vor, bei der die Erfahrung und guter Stil zu der Richtlinie geführt haben, Attribute von Klassen &#039;&#039;privat&#039;&#039; zu machen und für Zugriff &#039;&#039;public&#039;&#039; Methoden bereit zu stellen.&lt;br /&gt;
*3: Normalerweise gibt es keinen Grund, leere Unterprogramme zu schreiben - ausgenommen universell gehaltene Programmteile, die applikationsspezifisch verfeinert und mit zusäzlichen Features ausgestattet werden können.&lt;br /&gt;
*4: Beispielsweise kann es sein, dass unmittelbar nach Eintritt in das Unterprogramm noch [[Register]] gesichert und am Ende restauriert werden müssen, wenn diese innerhalb des Unterprogramms für Zwischenberechnungen benutzt werden. Die Details regelt die &#039;&#039;Calling-Sequence&#039;&#039;, die jedoch abhängig vom verwendeten Compiler ist.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Templates_(C%2B%2B)&amp;diff=2474</id>
		<title>Templates (C++)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Templates_(C%2B%2B)&amp;diff=2474"/>
		<updated>2004-06-17T12:52:22Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Templates in C++ - mitunter &#039;&#039;Schablonen&#039;&#039; genannt - erlauben die &amp;quot;generische Programmierung&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Bei der Programmierung von Mikrocontrollern in C++ sind Templates deshalb interessant, weil sie zum Zeitpunkt der Kompilierung greifen und damit zu weniger Overhead führen (können) als sehr &amp;quot;universelle&amp;quot; Bibliotheksfuntionen, deren Leistungsumfang von einer konkreten Applikation nur teilweise benutzt wird. Da Templates nur einmalig hinterlegt sind, vermeiden sie die Nachteile der [[Copy&amp;amp;Paste-Programmierung]].&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie parametrisierte [[Makros]] kann man Templates als Quelltexte verstehen, die &#039;&#039;&#039;einmal&#039;&#039;&#039; geschrieben und &#039;&#039;&#039;häufig&#039;&#039;&#039; eingesetzt werden - jeweils mit mehr oder weniger großen Variationen. Insbesondere lassen sich mit Templates&lt;br /&gt;
* Datentypen(*1) und&lt;br /&gt;
* Compilezeit-Konstanten&lt;br /&gt;
parametrisieren, das heißt bis zu einer konkreten Verwendung einer Template (= Instanziierung) offen halten.&lt;br /&gt;
&lt;br /&gt;
Als Beispiel hier eine Template(-Funktion) zum Vertauschen von zwei Ganzzahlen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
void swap(T* xp, T* yp) {&lt;br /&gt;
     T tmp; tmp = *xp; *xp = *yp; *yp = tmp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die erste Zeile erklärt dabei dem C++-Compiler, dass das nachfolgend verwendete Symbol &#039;&#039;T&#039;&#039; einen beliebigen Typnamen repräsentiert. (Ohne diese Zeile würde man eine Fehlermeldung wegen eines undefinierten Namens erhalten.)&lt;br /&gt;
&lt;br /&gt;
Bei der späteren, tatsächlichen Verwendung dieser Funktion kann man einen konkreten Typ angeben&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int a, b;&lt;br /&gt;
double c, d;&lt;br /&gt;
struct s e, f;&lt;br /&gt;
...&lt;br /&gt;
swap&amp;lt;int&amp;gt;(&amp;amp;a, &amp;amp;b);&lt;br /&gt;
swap&amp;lt;double&amp;gt;(&amp;amp;c, &amp;amp;d);&lt;br /&gt;
swap&amp;lt;struct s&amp;gt;(&amp;amp;e, &amp;amp;f);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oder - noch einfacher - lässt den Compiler aus dem Typ des verwendeten Template-Arguments auf den Typ von &#039;&#039;T&#039;&#039; schließen(*2):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
swap(&amp;amp;a, &amp;amp;b);&lt;br /&gt;
swap(&amp;amp;c, &amp;amp;d);&lt;br /&gt;
swap(&amp;amp;e, &amp;amp;f);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beim Programmieren mit Templates sollte allerdings auf die Minimierung von Abschnitten geachtet werden, für die der erzeugte Code &#039;&#039;&#039;nicht&#039;&#039;&#039; mit den Template-Parametern variiert, zumindest dann, wenn eine Template typischerweise in ein und demselben Quelltext mehrfach mit unterschiedlichen Parametern verwendet wird. &lt;br /&gt;
Für das obige Beispiel ist das insofern der Fall, als Zuweisungen in der Template-Funktion Machinencode erzeugen werden, der für die unterschiedlichen Datentypen jeweils verschieden ausfällt. (Z.B. ein &#039;&#039;MOV&#039;&#039;-Befehl für 2 oder 4 Byte bei für die Verwendung mit &#039;&#039;int&#039;&#039;, 8 &lt;br /&gt;
Byte für &#039;&#039;double&#039;&#039; und vielleicht einen &#039;&#039;memmove&#039;&#039;-Aufruf für die Strukturzuweisung.)&lt;br /&gt;
&lt;br /&gt;
Andererseits könnte der Aufruf von &#039;&#039;swap&#039;&#039; mit den Datentypen &#039;&#039;long&#039;&#039; und &#039;&#039;float&#039;&#039; dazu führen, dass aufgrund der Template zwei Funktionen instanziiert werden, die vom Maschinencode her identisch sind (wenn &#039;&#039;float&#039;&#039; und &#039;&#039;long&#039;&#039; beide 4 Byte haben). Das selbe gilt bei der Verwendung von &#039;&#039;swap&#039;&#039; mit verschiedenen Struktur-Typen der selben Größe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Um den berühmt-berüchtigten &amp;quot;Code-Bloat&amp;quot; durch Templates zu vermeiden, ist also eine gute Kenntnis der Hintergründe des Template-Mechanismus unabdingbar!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
*1: Früher hatten Templates in C++ daher den Namen &#039;&#039;Parametrized Types&#039;&#039;.&lt;br /&gt;
*2: Voraussetzung dafür ist, dass die Template eine Funktion und keine Klasse beschreibt und dass der parametrisierte Typ &#039;&#039;T&#039;&#039; aus den aktuellen Parametern erkannt werden kann. (Hier: erwartet wird ein &#039;&#039;Zeiger auf T&#039;&#039;, übergeben werden mit &#039;&#039;&amp;amp;a&#039;&#039; und &#039;&#039;&amp;amp;b&#039;&#039; konkret &#039;&#039;Zeiger auf int&#039;&#039;, also muss es sich bei dem Typ &#039;&#039;T&#039;&#039; in &#039;&#039;&#039;diesem&#039;&#039;&#039; Aufruf um &#039;&#039;int&#039;&#039; handeln.)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Inline_(C%2B%2B)&amp;diff=2471</id>
		<title>Inline (C++)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Inline_(C%2B%2B)&amp;diff=2471"/>
		<updated>2004-06-17T11:43:29Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In C++ werden die Anweisungen von Unterprogrammen(*1), die mit dem Zusatz &#039;&#039;inline&#039;&#039; definiert sind, an jeder Aufrufstelle erneut eingesetzt.&lt;br /&gt;
&lt;br /&gt;
Ein Unterprogramm &#039;&#039;inline&#039;&#039; zu definieren entspricht dem klassischen Austausch von &amp;quot;Geschwindigkeit der Ausführung&amp;quot; gegen &amp;quot;Platzbedarf des Maschinen-Codes&amp;quot;. Da man bei der Programmierung von Mikrocontrollern mitunter in der einen oder anderen Richtung optimieren muss, kann dieses Feature interessant sein.&lt;br /&gt;
&lt;br /&gt;
Mit &#039;&#039;inline&#039;&#039; wird:&lt;br /&gt;
* ein Unterprogrammsprung-Befehl vermieden (=&amp;gt; schneller),&lt;br /&gt;
* ebenso wie der Rücksprung-Befehl am Ende, aber dafür&lt;br /&gt;
* bei Aufrufen an vielen &#039;&#039;&#039;verschiedenen&#039;&#039;&#039; Stellen mehr Code erzeugt.&lt;br /&gt;
* Für sehr kleine Unterprogramme(*2) wird evtl. sogar weniger Code erzeugt (=&amp;gt; doppelter Gewinn) und&lt;br /&gt;
* für leere Unterprogramme wird überhaupt kein Code erzeugt(*3).&lt;br /&gt;
&lt;br /&gt;
Ohne &#039;&#039;inline&#039;&#039; wird:&lt;br /&gt;
* für das Unterprogramm nur &#039;&#039;&#039;einmal&#039;&#039;&#039; Code erzeugt, der bei jedem Aufruf&lt;br /&gt;
* über einen entsprechenden Maschinenbefehl erreicht wird.&lt;br /&gt;
* Eventuell sind unmittelbar nach Eintritt in das Unterprogramm weitere Maschinebefehle nötig(*4),&lt;br /&gt;
* ebenso wie am Ende, wenn das Unterprogramm an die Aufrufstelle zurückkehrt.&lt;br /&gt;
&lt;br /&gt;
Als &#039;&#039;inline&#039;&#039; definierte Unterprogramme werden manchmal auch [[Makros]] genannt, sie verhalten sich aber &amp;quot;semantisch korrekt&amp;quot;. Insbesondere gilt, dass &#039;&#039;inline&#039;&#039;-Unterprogramme&lt;br /&gt;
* lokale Hilfsvariablen haben können und&lt;br /&gt;
* Seiteneffekte auch bei mehrfacher Verwendung eines Parameters nur einmalig stattfinden.&lt;br /&gt;
Damit sind die folgenden Unterprograme (Vertauschen zweier Ganzzahlen, Bestimmung des Maximums zweier Ganzzahlen) unproblematisch.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inline void swap(int *xp, int *yp) {&lt;br /&gt;
        int tmp = *xp; *xp = *yp; *yp = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
inline int max(int a, int b) {&lt;br /&gt;
        return (a &amp;gt; b) ? a : b;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Bei &amp;quot;Tricksereien&amp;quot; mit [[C-Präprozessor|Makros]] wäre im Fall von &#039;&#039;swap&#039;&#039; dagegen die Verwendung&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (i &amp;lt; j)&lt;br /&gt;
      swap(i, j);&lt;br /&gt;
else  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ein Syntaxfehler. (Ein Makro für swap müsste wegen der Hilfsvariablen zu einem ein Block {...} expandieren, womit das Semikolon am Ende der Zeile nicht stehen darf.)&lt;br /&gt;
&lt;br /&gt;
Ebenso ist mit einer &#039;&#039;inline-Funktion&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
j = max(i++, 10);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
kein Problem. (Ein Makro würde wegen des rein textuellen Ersatzes seiner Parameter die Inkrementierung u.U. doppelt auslösen.)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
*1: Der Begriff Unterprogramm schließt hier &#039;&#039;Funktionen&#039;&#039; (C-Terminologie) und &#039;&#039;Methoden&#039;&#039; (C++-Terminologie) ein.&lt;br /&gt;
*2: Sehr kleine Unterprogramme kommen insbesondere bei der Objektorientierter Programmierung vor, bei der die Erfahrung und guter Stil zu der Richtlinie geführt haben, Attribute von Klassen &#039;&#039;privat&#039;&#039; zu machen und für Zugriff &#039;&#039;public&#039;&#039; Methoden bereit zu stellen.&lt;br /&gt;
*3: Normalerweise gibt es keinen Grund, leere Unterprogramme zu schreiben - ausgenommen universell gehaltene Programmteile, die applikationsspezifisch verfeinert und mit zusäzlichen Features ausgestattet werden können.&lt;br /&gt;
*4: Beispielsweise kann es sein, dass unmittelbar nach Eintritt in das Unterprogramm noch [[Register]] gesichert und am Ende restauriert werden müssen, wenn diese innerhalb des Unterprogramms für Zwischenberechnungen benutzt werden. Die Details regelt die &#039;&#039;Calling-Sequence&#039;&#039;, die jedoch abhängig vom verwendeten Compiler ist.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=C-Pr%C3%A4prozessor&amp;diff=2957</id>
		<title>C-Präprozessor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=C-Pr%C3%A4prozessor&amp;diff=2957"/>
		<updated>2004-06-17T10:37:39Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Erste Verarbeitungsphase bei der Kompilierung eines [[C]]/[[C-Plusplus|C++]]-Programms.&lt;br /&gt;
&lt;br /&gt;
Der C-Präprozessor verändert den Quelltext, den die späteren Verarbeitungsphasen erhalten, in folgender Hinsicht:&lt;br /&gt;
* Entfernen einzelner Abschnitte (= bedingte Kompilierung)&lt;br /&gt;
* Einbeziehen zusätzlicher Dateien ([[Include-Files]])&lt;br /&gt;
* Ersetzen von (parametrisierbaren) [[Makro]]s&lt;br /&gt;
&lt;br /&gt;
Da bei der Programmierung von Mikrocontrollern oft Optimierungen (Ausführungsgeschwindigkeit, Programmgröße) wichtig sind, kann die Kentnis und der geschickte Einsatz des C-Präprozessors ein Schlüssel zum Erfolg sein, wenn es darum geht, universell wiederverwendbare Programmteile EINMAL zu schreiben und VIELFACH in unterschiedlichen Projekten (mit kleineren Variationen) zu kompilieren.&lt;br /&gt;
&lt;br /&gt;
Eine am C-Präprozessor häufig geäußerte Kritik ist, dass er (nahezu) ohne Berücksichtigung der eigentlichen Sprachsyntax arbeitet (&amp;quot;The C-Preprocessor doesn&#039;t know about C&amp;quot;). Die Tatsache, dass Makros beispielsweise auf der Basis von Textersatz arbeiten, kann zu Überaschungen führen. So wird in&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define cub(a) a*a*a&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
y = 4;&lt;br /&gt;
x = cub(y+1);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
in x nicht etwa der Wert 125 (5 hoch 3) stehen, sondern der Wert 16, da nach Ersetzen des Makros der folgende Quelltext kompiliert wird:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
x = y+1*y+1*y+1; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Während man dieses Problem noch durch (vorbeugende) Klammerung lösen kann, ist im Allgemeinen auch die doppelte Verwendung eines Makro-Parameters im Ersatztext ein Problem:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define max(a, b) ((a&amp;gt;b) ? (a) : (b))&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
...&lt;br /&gt;
x = max(y, 10);   /* OK */&lt;br /&gt;
x = max(++y, 10); /* ?? */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Im zweiten Fall wird die Variable &#039;&#039;y&#039;&#039; u.U. ZWEIMAL inkrementiert - was ohne Kenntnis der Makro-Definition keineswegs offensichtlich ist (&#039;&#039;max&#039;&#039; könnte auch eine echte Funktion sein).&lt;br /&gt;
&lt;br /&gt;
Die Tatsache dass der C-Präprozessor die Syntax von C/C++ nicht wirklich berücksichtigt, ist allerdings auch nützlich. So lassen sich mit dem C-Präprozessor Datentypen parametrisieren, um systematische Programmteile zu vereinfachen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* GSAWP:&lt;br /&gt;
   generiert Funktionsdefinition zum Vertauschen des Inhalts von zwei Variablen&lt;br /&gt;
*/&lt;br /&gt;
#define GSWAP(n, T)s\&lt;br /&gt;
        void n(T *xp, T *yp) { T tmp = *xp; *xp = *yp; *yp = tmp; }&lt;br /&gt;
...&lt;br /&gt;
GSWAP(iswap, int)&lt;br /&gt;
GSWAP(dswap, double)&lt;br /&gt;
GSWAP(swap_s, struct s)&lt;br /&gt;
...&lt;br /&gt;
int a, b;&lt;br /&gt;
double c, d;&lt;br /&gt;
struct s e, f;&lt;br /&gt;
...&lt;br /&gt;
iswap(&amp;amp;a, &amp;amp;b);&lt;br /&gt;
dswap(&amp;amp;c, &amp;amp;d);&lt;br /&gt;
swap_s(&amp;amp;e. &amp;amp;f);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In [[C-Plusplus|C++]] wurden ergänzend zum C-Präprozessor weitere Mechanismen eingeführt. So können z.B. Unterprogramme mit dem Zusatz [[Inline (C-Plusplus)|inline]] versehen werden und [[Templates (C-Plusplus)|Templates]] erlauben generische Programmierung, womit der viele &amp;quot;Makro-Tricks&amp;quot; wie die obigen überflüssig werden.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Mikrocontroller.net:Beobachtete_Fehler&amp;diff=2479</id>
		<title>Mikrocontroller.net:Beobachtete Fehler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Mikrocontroller.net:Beobachtete_Fehler&amp;diff=2479"/>
		<updated>2004-06-16T23:48:20Z</updated>

		<summary type="html">&lt;p&gt;Martin: Meinung zu &amp;quot;blaue Links&amp;quot; sowie &amp;quot;Editierhilfe&amp;quot;-Problem&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[de:Wikipedia:Präemptives Multitasking]] sollte zu [http://de.wikipedia.org/wiki/Pr%E4emptives_Multitasking Wikipedia] Linken &amp;lt;- Inter-Wiki-Links gehen nicht ?&lt;br /&gt;
Die Wikipedias haben einen Mechanismus um auf andere Wikis zu verlinken, eventuell kann der Sysop ja diesen für links auf de.wikipedia konfigurieren... [[Benutzer:Suschman|Suschman]]&lt;br /&gt;
&lt;br /&gt;
Manche Seiten haben einen Weissen Hintergrund, andere einen Sandgelben. Liegt das nur an mir oder sind die Einstellungen nicht einheitlich ? [[Benutzer:Suschman|Suschman]]&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Spezialseiten&amp;quot; haben einen gelblichen Hintergrund, Wiki-Seiten einen weissen. ([[Benutzer:Andreas|Andreas]] 14:52, 8. Jun 2004 (CEST))&lt;br /&gt;
&lt;br /&gt;
=== Startseite ===&lt;br /&gt;
&lt;br /&gt;
Inhaltliches Problem:&lt;br /&gt;
Die Startseite ist nicht gut genug: Schaut man in der Statistik unter &amp;quot;Beliebte Seiten&amp;quot; nach, dann sieht man, daß die Startseite über 11.000 mal aufgerufen wurde, aber die beliebteste Fachseite nur 3000 mal. Selbst die Testseite hat stolze 1200 Aufrufe zu verzeichnen. Mir scheint, ein Großteil der Surfer findet von der Startseite nicht zum eigentlichen Wiki. Das könnte daran liegen, daß auf der Startseite zu sehr auf das das Wiki selbst eingegangen wird und zu wenig auf die Inhalte. Die Startseite der Wikipedia ist ja auch völlig anders aufgebaut. Ich könnte das natürlich einfach ändern, aber ich hätte gerne andere Meinungen zu dem Thema. Was denkt Ihr? &lt;br /&gt;
-- Markus&lt;br /&gt;
&lt;br /&gt;
* Ganz meine Meinung! Die Startseite ist zu unübersichtlich, man findet nicht wirklich den &amp;quot;Eingang&amp;quot;. [[Benutzer:OldBug|Patrick]] 14:28, 7. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
* Zustimmung! Der Schreibschutz ist jetzt aufgehoben, wenn du die Startseite aendern moechtest, mach&#039;s einfach. ([[Benutzer:Andreas|Andreas]] 14:50, 8. Jun 2004 (CEST))&lt;br /&gt;
&lt;br /&gt;
* Klasse neue Startseite, Markus! Was ich mir noch vorstellen könnte ist, dass einige nicht checken das alle blauen Wörter Links sind und ein Artikel dahinter steckt. Mir ist dazu aber bisher noch keine idiotensichere Formulierung eingefallen. - [[Benutzer:Ozel|Ozel]] 09:50, 9. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
* Ich finde die neue Startseite auch schöner als die alte. Aber: Es ist eine gewisse Konvention im Internet, dass Links UNTERSTRICHEN angezeigt werden. Ich weiß, ich weiß, das kann man alles durch Stylesheets, Preferences usw. konfigurieren, aber der DEFAULT ist halt, wenn ich auf eine x-beliebige Seite gehe, dass ich Unterstrichenes anklicken kann. Insofern finde ich &amp;quot;blaue&amp;quot; Links nicht so einleuchtend.  Na gut, immer noch besser als MMN (Mystery Meat Navigation) und nur meine 2 Cent zum &amp;quot;Mal-drüber-Nachdenken&amp;quot; --[[Benutzer:Martin|Martin]] 01:48, 17. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
=== Bearbeitungshilfe ===&lt;br /&gt;
Wenn man sich eine Seite zum Editieren holt und auf &amp;quot;Bearbeitungshilfe&amp;quot; klickt, kommt man zur Seite [[Uc-wiki:Editierhilfe]], die aber keinen Text enthält =&amp;gt; also keine große &amp;quot;Hilfe&amp;quot; :-( ... --[[Benutzer:Martin|Martin]] 01:48, 17. Jun 2004 (CEST)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=C-Pr%C3%A4prozessor&amp;diff=2469</id>
		<title>C-Präprozessor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=C-Pr%C3%A4prozessor&amp;diff=2469"/>
		<updated>2004-06-16T20:18:47Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Erste Verarbeitungsphase bei der Kompilierung eines [[C]]/[[C-Plusplus|C++]]-Programms.&lt;br /&gt;
&lt;br /&gt;
Der C-Präprozessor verändert den Quelltext, den die späteren Verarbeitungsphasen erhalten, in folgender Hinsicht:&lt;br /&gt;
* Entfernen einzelner Abschnitte (= bedingte Kompilierung)&lt;br /&gt;
* Einbeziehen zusätzlicher Dateien ([[Include-Files]])&lt;br /&gt;
* Ersetzen von (parametrisierbaren) [[Makros]]&lt;br /&gt;
&lt;br /&gt;
Da bei der Programmierung von Mikrocontrollern oft Optimierungen (Ausführungsgeschwindigkeit, Programmgröße) wichtig sind, kann die Kentnis und der geschickte Einsatz des C-Präprozessors ein Schlüssel zum Erfolg sein, wenn es darum geht, universell wiederverwendbare Programmteile EINMAL zu schreiben und VIELFACH in unterschiedlichen Projekten (mit kleineren Variationen) zu kompilieren.&lt;br /&gt;
&lt;br /&gt;
Eine am C-Präprozessor häufig geäußerte Kritik ist, dass er (nahezu) ohne Berücksichtigung der eigentlichen Sprachsyntax arbeitet (&amp;quot;The C-Preprocessor doesn&#039;t know about C&amp;quot;). Die Tatsache, dass Makros beispielsweise auf der Basis von Textersatz arbeiten, kann zu Überaschungen führen. So wird in&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define cub(a) a*a*a&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
y = 4;&lt;br /&gt;
x = cub(y+1);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
in x nicht etwa der Wert 125 (5 hoch 3) stehen, sondern der Wert 16, da nach Ersetzen des Makros der folgende Quelltext kompiliert wird:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
x = y+1*y+1*y+1; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Während man dieses Problem noch durch (vorbeugende) Klammerung lösen kann, ist im Allgemeinen auch die doppelte Verwendung eines Makro-Parameters im Ersatztext ein Problem:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define max(a, b) ((a&amp;gt;b) ? (a) : (b))&lt;br /&gt;
...&lt;br /&gt;
int x, y;&lt;br /&gt;
...&lt;br /&gt;
x = max(y, 10);   /* OK */&lt;br /&gt;
x = max(++y, 10); /* ?? */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Im zweiten Fall wird die Variable &#039;&#039;y&#039;&#039; u.U. ZWEIMAL inkrementiert - was ohne Kenntnis der Makro-Definition keineswegs offensichtlich ist (&#039;&#039;max&#039;&#039; könnte auch eine echte Funktion sein).&lt;br /&gt;
&lt;br /&gt;
Die Tatsache dass der C-Präprozessor die Syntax von C/C++ nicht wirklich berücksichtigt, ist allerdings auch nützlich. So lassen sich mit dem C-Präprozessor Datentypen parametrisieren, um systematische Programmteile zu vereinfachen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* GSAWP:&lt;br /&gt;
   generiert Funktionsdefinition zum Vertauschen des Inhalts von zwei Variablen&lt;br /&gt;
*/&lt;br /&gt;
#define GSWAP(n, T)s\&lt;br /&gt;
        void n(T *xp, T *yp) { T tmp = *xp; *xp = *yp; *yp = tmp; }&lt;br /&gt;
...&lt;br /&gt;
GSWAP(iswap, int)&lt;br /&gt;
GSWAP(dswap, double)&lt;br /&gt;
GSWAP(swap_s, struct s)&lt;br /&gt;
...&lt;br /&gt;
int a, b;&lt;br /&gt;
double c, d;&lt;br /&gt;
struct s e, f;&lt;br /&gt;
...&lt;br /&gt;
iswap(&amp;amp;a, &amp;amp;b);&lt;br /&gt;
dswap(&amp;amp;c, &amp;amp;d);&lt;br /&gt;
swap_s(&amp;amp;e. &amp;amp;f);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In [[C-Plusplus|C++]] wurden ergänzend zum C-Präprozessor weitere Mechanismen eingeführt (Inline-Funktionen, Templates) welche &amp;quot;Makro-Tricks&amp;quot;&lt;br /&gt;
wie die obigen überflüssig machen.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Makro&amp;diff=2514</id>
		<title>Makro</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Makro&amp;diff=2514"/>
		<updated>2004-06-16T18:50:35Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine mehr oder weniger große Anzahl von Anweisungen, unter einer Kurzbezeichnung zu einer Gruppe zusammengefasst und als Einheit verwendbar.&lt;br /&gt;
&lt;br /&gt;
Hinsichtlich eines Makros ist zu unterscheiden&lt;br /&gt;
* dessen Definition, i.d.R. einmalig und VOR der ersten Verwendung (evtl. auch durch [[Include-Files]]),&lt;br /&gt;
* dessen Verwendungen (0-mal bis beliebig oft).&lt;br /&gt;
&lt;br /&gt;
Um Makros besonders flexibel zu machen, sind sie oft &amp;quot;parametrisierbar&amp;quot;. Die Makro-Definition ist dann als eine Schablone zu sehen, bei der einige Stellen noch offen gehalten wurden, um sie erst später, bei der Makro-Verwendung zu füllen. &lt;br /&gt;
&lt;br /&gt;
Makros werden i.d.R von [[Assembler]]sprachen angeboten, sind aber auch in einigen [[HLL|höheren Programmiersprachen]] verfügbar, etwa in [[C]]/[[C-Plusplus|C++]] durch den [[C-Präprozessor]]. Schließlich gibt es auch reine Makrosprachen (etwa den Makroprozessor m4 von Unix/Linux), die als Werkzeug zur systematischen Transformation von Textdateien eingesetzt werden können.&lt;br /&gt;
&lt;br /&gt;
Bei der Programmierung haben parametrisierbare Makros eine gewisse Ähnlichkeit zu Unterprogrammen (mit Parametern), werden anders als diese aber zum Zeitpunkt der Übersetzung ausgeführt und hinsichtlich der Parameterwerte festgelegt. Bei der Programmierung von Mikrocontrollern ist es mitunter eforderlich, zwischen der Verwendung von Unterprogrammen und Makros abzuwägen. Universell wiederverwendbare, und deshalb in einer gewissen Umfang noch konfigurierbare Programmteile können in Form von Makros effizienter als Unterprogramme sein. Allerdings müssen die folgenden Voraussetzungen bestehen:&lt;br /&gt;
* Der &amp;quot;variable&amp;quot; Teil (= aktuelle Werte der Parameter) muss bei der Kompilierung festgelegt werden können.&lt;br /&gt;
* Der Makro darf nur ein einziges Mal in genau dieser Form verwendet werden.&lt;br /&gt;
Sofern der erste Punkt nicht sichergestellt ist, scheiden (parametrisierte) Makros komplett aus. Ob die Mehrfachverwendung eines Makros mit identischen Parametern ein Vor- oder Nachteil gegenüber einem Unterprogramm ist, hängt davon ab, was optimiert werden soll: im Hinblick auf die Ausführungsgeschwindigkeit ist der Makro vorteilhaft, geht es um geringe Code-Größe ist fast immer das Unterprogramm besser. (Die Ausnahme von dieser Regel bilden triviale Makros, die weniger Machinen-Code erzeugen als der Befehl für einen Unterprogrammsprung und die notwendige Parameter-Übergabe.)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Analog&amp;diff=2464</id>
		<title>Diskussion:Analog</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Analog&amp;diff=2464"/>
		<updated>2004-06-15T10:48:27Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Der Artikel ist meiner Ansicht nach nicht ganz korrekt. [[Analog]] bedeutet &amp;quot;proportional&amp;quot;. Ein analoges Signal entspricht damit einem Verlauf und keiner bestimmten Spannung. Ist aber für mich schwer in Worte zu fassen, wie man vielleicht hier sieht ;-) -- [[Benutzer:OldBug|Patrick]] 11:06, 9. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
Hm, lest doch einfach mal &amp;quot;Analogie&amp;quot; in Wikipedia... Die haben das besser hinbekommen, als ich :-) Aber kopieren zählt ja bekanntlich nicht! -- [[Benutzer:OldBug|Patrick]] 10:38, 14. Jun 2004 (CEST)&lt;br /&gt;
&lt;br /&gt;
Ich habe den Aspekt der Quantisierung als einen Unterschied [[Analog]]&amp;lt;--&amp;gt;[[Digital]] in den Artikel mit aufgenommen. (Da Patrick diesen Diskussion-Artikel hier initiiert hat, möchte ich aber auch das endgültige Löschen ihm überlassen --[[Benutzer:Martin|Martin]] 12:48, 15. Jun 2004 (CEST).)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digital&amp;diff=2724</id>
		<title>Digital</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digital&amp;diff=2724"/>
		<updated>2004-06-15T10:39:10Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Digitale Signale:&lt;br /&gt;
Der Gegensatz zu [[Analog]]en Signalen.&lt;br /&gt;
&lt;br /&gt;
Vom Wortstamm her kommt digital von &amp;quot;Finger&amp;quot; und bedeutet hier so viel wie &amp;quot;abzählbar&amp;quot;. Mit einer abzählbaren Menge möglicher Werte kann eine kontinuierlich verlaufende Größe - etwa eine Temperatur zwischen 0 und 10 Grad - &amp;quot;digital&amp;quot; nur abgestuft repräsentiert werden. Die [[Auflösung]] bestimmt dabei die Größe der Stufen. Mit einer Auflösung von 1 Grad könnte &amp;quot;5 Volt&amp;quot; z.B. für alle Werte zwischen 4,5 und 5,5 Grad stehen.&lt;br /&gt;
&lt;br /&gt;
Die in der elektronischen Schaltungstechnik verwendeten digitalen Signale sind in aller Regel zugleich &amp;quot;binär&amp;quot; und können nur zwei gültige Werte annehmen: Logisch 1 oder Logisch 0.&lt;br /&gt;
Um mehr als zwei Werte zu repräsentieren braucht man mehrere binäre Digitalsignale (für die Werte 0, 1, 2 usw. bis 10 mindestens vier).&lt;br /&gt;
&lt;br /&gt;
Den beiden Werten eines einzelnen (binären) Digitalsignals ist normalerweise ein bestimmter [[Spannung]]sbereich zugeordnet (manchmal auch ein [[Strom]]bereich). Einer dieser Bereiche gilt als Logisch 0, der anderere als Logisch 1.&lt;br /&gt;
&lt;br /&gt;
Zwischenwerte sind&lt;br /&gt;
* insofern VERBOTEN, als eine - korrekt funktionierende - Digitalschaltung solche Spannungswerte nicht(*1) erzeugen darf;&lt;br /&gt;
* insofern UNDEFINIERT, als eine Digitalschaltung beim Anliegen einer Spannung, die weder Logisch 0 noch Logisch 1 repräsentiert, prinzipiell tun kann, was sie will(*2).&lt;br /&gt;
&lt;br /&gt;
(*1: Da der Wechsel zwischen den beiden Bereichen nicht &amp;quot;unendlich schnell&amp;quot; erfolgt, wird in der Praxis natürlich auch immer für kurze Zeit einmal ein Zwischenwert ausgegeben.) &lt;br /&gt;
&lt;br /&gt;
(*2: Digitalschaltungen können u.U. auch permanent zerstört werden, wenn ein Pegel im undefinierten Bereich über zu lange Zeit anliegt).&lt;br /&gt;
&lt;br /&gt;
Bei [[TTL]]-Signalen gilt z.B. der &amp;quot;High&amp;quot;-Pegel von +2,0..+5,0 V als &amp;quot;Logisch 1&amp;quot;, während der &amp;quot;Low&amp;quot;-Pegel für &amp;quot;Logisch 0&amp;quot; zwischen 0..+0,8 V liegen muss.&lt;br /&gt;
&lt;br /&gt;
Bei [[CMOS]]-Signalen (wo die Betriebsspannung der Bausteine variieren kann) gelten Pegel von 0..33% der Betriebsspannung als  &amp;quot;Logisch 0&amp;quot;, Pegel von 66..100% der Betriebsspannung als &amp;quot;Logisch 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Bei der [[RS232]]-Übertragung ist Logisch 1 als Spannung von -3..-15V definiert, Logisch 0 entspricht +3..+15V.&lt;br /&gt;
&lt;br /&gt;
Um Störungen auszufiltern, gelten häufig geringfügig andere Werte für die zu ERZEUGENDEN Spannungen. Bei TTL-Signalen sollte die erzeugte Spannung für Logisch 0 z.B. höchstens +0,4V betragen, für Logisch 1 mindestens +2,4V. Bei der RS232-Übertragung sollte die Sendeseite für Logisch 1 eine Spannung -5..-15V liefern und für Logisch 0 dagegen +5..+15V.&lt;br /&gt;
&lt;br /&gt;
Im erweiterten Sinn kann man auch jedes Signal als &amp;quot;digital&amp;quot; bezeichnen, bei dem es zwei definierte Wertebereiche gibt und Werte außerhalb dieser Bereiche  KEINE definierte Bedeutung haben. Wenn beispielsweise eine Frequenz von 10..12 kHz bedeutet, &amp;quot;der Wassertank ist leer&amp;quot; und eine Frequenz von 18..20 kHz bedeutet, &amp;quot;der Wassertank ist voll&amp;quot;, würde eine Frequenz von 15 kHz überhaupt nichts bedeuten (bzw. erzeugerseitig: das Gerät ist kaputt, empfängerseitig: hmm? - so what!)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digital&amp;diff=2462</id>
		<title>Digital</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digital&amp;diff=2462"/>
		<updated>2004-06-15T10:15:28Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Digitale Signale:&lt;br /&gt;
Der Gegensatz zu [[Analog]]en Signalen.&lt;br /&gt;
&lt;br /&gt;
Vom Wortstamm her kommt digital von &amp;quot;Finger&amp;quot; und bedeutet hier so viel wie &amp;quot;abzählbar&amp;quot;. Mit einer abzählbaren Menge möglicher Werte kann eine kontinuierlich verlaufende Größe - etwa eine Temperatur zwischen 0 und 10 Grad - &amp;quot;digital&amp;quot; nur abgestuft repräsentiert werden. Die [[Auflösung]] bestimmt dabei die Größe der Stufen. Mit einer Auflösung von 1 Grad könnte &amp;quot;5 Volt&amp;quot; z.B. für alle Werte zwischen 4,5 und 5,5 Grad stehen.&lt;br /&gt;
&lt;br /&gt;
Die in der elektronischen Schaltungstechnik verwendeten digitalen Signale sind in aller Regel zugleich &amp;quot;binär&amp;quot; und können nur zwei gültige Werte annehmen: Logisch 1 oder Logisch 0.&lt;br /&gt;
Um mehr als zwei Werte zu repräsentieren braucht man mehrere binäre Digitalsignale (für die Werte 0, 1, 2 usw. bis 10 mindestens vier).&lt;br /&gt;
&lt;br /&gt;
Den beiden Werten eines einzelnen (binären) Digitalsignals ist normalerweise ein bestimmter [[Spannung]]sbereich zugeordnet (manchmal auch ein [[Strom]]bereich). Einer dieser Bereiche gilt als Logisch 0, der anderere als Logisch 1.&lt;br /&gt;
&lt;br /&gt;
Zwischenwerte sind&lt;br /&gt;
* insofern VERBOTEN, als eine - korrekt funktionierende - Digitalschaltung solche Spannungswerte nicht(*1) erzeugen darf;&lt;br /&gt;
* insofern UNDEFINIERT, als eine Digitalschaltung beim Anliegen einer Spannung, die weder Logisch 0 noch Logisch 1 repräsentiert, prinzipiell tun kann, was sie will(*2).&lt;br /&gt;
&lt;br /&gt;
(*1: Da der Wechsel zwischen den beiden Bereichen nicht &amp;quot;unendlich schnell&amp;quot; erfolgt, wird in der Praxis natürlich auch immer für kurze Zeit einmal ein Zwischenwert ausgegeben.) &lt;br /&gt;
&lt;br /&gt;
(*2: Digitalschaltungen können u.U. auch permanent zerstört werden, wenn ein Pegel im undefinierten Bereich über zu lange Zeit anliegt).&lt;br /&gt;
&lt;br /&gt;
Bei [[TTL]]-Signalen gilt z.B. der &amp;quot;High&amp;quot;-Pegel von +2,0..+5,0 V als &amp;quot;Logisch 1&amp;quot;, während der &amp;quot;Low&amp;quot;-Pegel für &amp;quot;Logisch 0&amp;quot; zwischen 0..+0,8 V liegen muss.&lt;br /&gt;
&lt;br /&gt;
Bei [[CMOS]]-Signalen (wo die Betriebsspannung der Bausteine variieren kann) gelten Pegel von 0..33% der Betriebsspannung als  &amp;quot;Logisch 0&amp;quot;, Pegel von 66..100% der Betriebsspannung als &amp;quot;Logisch 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Bei der [[RS232]]-Übertragung ist Logisch 1 als Spannung von -3..-15V definiert, Logisch 0 entspricht +3..+15V.&lt;br /&gt;
&lt;br /&gt;
Um Störungen auszufiltern, gelten häufig geringfügig andere Werte für die zu ERZEUGENDEN Spannungen. Bei TTL-Signalen sollte die erzeugte Spannung für Logisch 0 z.B. höchstens +0,7V betragen, für Logisch 1 mindestens +2,4V. Bei der RS232-Übertragung sollte die Sendeseite für Logisch 1 eine Spannung -5..-15V liefern und für Logisch 0 dagegen +5..+15V.&lt;br /&gt;
&lt;br /&gt;
Im erweiterten Sinn kann man auch jedes Signal als &amp;quot;digital&amp;quot; bezeichnen, bei dem es zwei definierte Wertebereiche gibt und Werte außerhalb dieser Bereiche  KEINE definierte Bedeutung haben. Wenn beispielsweise eine Frequenz von 10..12 kHz bedeutet, &amp;quot;der Wassertank ist leer&amp;quot; und eine Frequenz von 18..20 kHz bedeutet, &amp;quot;der Wassertank ist voll&amp;quot;, würde eine Frequenz von 15 kHz überhaupt nichts bedeuten (bzw. erzeugerseitig: das Gerät ist kaputt, empfängerseitig: hmm? - so what!)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Basic&amp;diff=3050</id>
		<title>Basic</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Basic&amp;diff=3050"/>
		<updated>2004-06-05T22:39:18Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine [[Programmiersprache]], die in den 1970ern erfunden wurde mit der Zielsetzung &amp;quot;Anfängern den Einstieg in das Programmieren zu erleichtern&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Das ursprüngliche Basic war aus heutiger Sicht unglaublich primitiv:&lt;br /&gt;
* jeder einzelnen Anweisung musste eine Zeilennummer vorangestellt werden - m.a.W.: beim Schreiben eines Programms war es ratsam z.B. Zehnerschritte zu verwenden, um später noch Anweisungen einfügen zu können (*1);&lt;br /&gt;
* die Namen von Variablen konnten ein oder zwei Zeichen lang sein, wobei das erste ein Buchstabe und das zweite eine Ziffer sein musste - m.a.W.: A, A0, A1, A2, ... B, B0, B1, ... , Z, Z0, ... Z7, Z8, Z9;&lt;br /&gt;
* die Namen von Array-Variablen konnten nur ein Zeichen lang sein - m.a.W.: mehr als 26 Arrays waren nicht drin ...;&lt;br /&gt;
* es gab zwar Unterprogramme, aber KEINE Parameter und KEINE lokalen Variablen - m.a.W.: genaueste manuelle(!) Buchführung nötig, wo man welche Variable zu welchem Zweck verwendet hat;&lt;br /&gt;
* darüberhinaus erfolgte die Ablaufsteuerung allein durch &amp;quot;goto&amp;quot;-Anweisungen - m.a.W.: Grüß-Gott [[Spaghetti-Code]], Good-Bye [[Strukturierte Programmierung]]&lt;br /&gt;
&lt;br /&gt;
(*1: Mit etwas Glück hatte man eine &amp;quot;renum&amp;quot;-Anweisung zur Verfügung, mit der man vor größeren Programmänderungen alles neu durchnummerieren konnte.)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digital&amp;diff=2453</id>
		<title>Digital</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digital&amp;diff=2453"/>
		<updated>2004-06-05T22:19:03Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Digitale Signale:&lt;br /&gt;
Der Gegensatz zu [[Analog]]en Signalen.&lt;br /&gt;
Ein digitales Signal kann nur zwei gültige Werte annehmen: Logisch 1 oder Logisch 0.&lt;br /&gt;
&lt;br /&gt;
Beiden Werten ist normalerweise ein bestimmter [[Spannung]]sbereich zugeordnet (manchmal auch ein [[Strom]]bereich). Einer dieser Bereiche gilt als Logisch 0, der anderere als Logisch 1.&lt;br /&gt;
&lt;br /&gt;
Zwischenwerte sind&lt;br /&gt;
* insofern VERBOTEN, als eine - korrekt funktionierende - Digitalschaltung solche Spannungswerte nicht(*1) erzeugen darf;&lt;br /&gt;
* insofern UNDEFINIERT, als eine Digitalschaltung beim Anliegen einer Spannung, die weder Logisch 0 noch Logisch 1 repräsentiert, prinzipiell tun kann, was sie will(*2).&lt;br /&gt;
&lt;br /&gt;
(*1: Da der Wechsel zwischen den beiden Bereichen nicht &amp;quot;unendlich schnell&amp;quot; erfolgt, wird in der Praxis natürlich auch immer für kurze Zeit einmal ein Zwischenwert ausgegeben.) &lt;br /&gt;
&lt;br /&gt;
(*2: Digitalschaltungen können u.U. auch permanent zerstört werden, wenn ein Pegel im undefinierten Bereich über zu lange Zeit anliegt).&lt;br /&gt;
&lt;br /&gt;
Bei [[TTL]]-Signalen gilt z.B. der &amp;quot;High&amp;quot;-Pegel von +2,0..+5,0 V als &amp;quot;Logisch 1&amp;quot;, während der &amp;quot;Low&amp;quot;-Pegel für &amp;quot;Logisch 0&amp;quot; zwischen 0..+0,8 V liegen muss.&lt;br /&gt;
&lt;br /&gt;
Bei [[CMOS]]-Signalen (wo die Betriebsspannung der Bausteine variieren kann) gelten Pegel von 0..33% der Betriebsspannung als  &amp;quot;Logisch 0&amp;quot;, Pegel von 66..100% der Betriebsspannung als &amp;quot;Logisch 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Bei der [[RS232]]-Übertragung ist Logisch 1 als Spannung von -3..-15V definiert, Logisch 0 entspricht +3..+15V.&lt;br /&gt;
&lt;br /&gt;
Um Störungen auszufiltern, gelten häufig geringfügig andere Werte für die zu ERZEUGENDEN Spannungen. Bei TTL-Signalen sollte die erzeugte Spannung für Logisch 0 z.B. höchstens +0,7V betragen, für Logisch 1 mindestens +2,4V. Bei der RS232-Übertragung sollte die Sendeseite für Logisch 1 eine Spannung -5..-15V liefern und für Logisch 0 dagegen +5..+15V.&lt;br /&gt;
&lt;br /&gt;
Im erweiterten Sinn kann man auch jedes Signal als &amp;quot;digital&amp;quot; bezeichnen, bei dem es zwei definierte Wertebereiche gibt und Werte außerhalb dieser Bereiche  KEINE definierte Bedeutung haben. Wenn beispielsweise eine Frequenz von 10..12 kHz bedeutet, &amp;quot;der Wassertank ist leer&amp;quot; und eine Frequenz von 18..20 kHz bedeutet, &amp;quot;der Wassertank ist voll&amp;quot;, würde eine Frequenz von 15 kHz überhaupt nichts bedeuten (bzw. erzeugerseitig: das Gerät ist kaputt, empfängerseitig: hmm? - so what!)&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Analog&amp;diff=2439</id>
		<title>Analog</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Analog&amp;diff=2439"/>
		<updated>2004-06-05T22:10:29Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Analoge Signale: Der Gegensatz zu [[Digital]]en Signalen. Bei einem analogen Signal haben alle Werte innerhalb eines gegebenen Bereichs eine Bedeutung.&lt;br /&gt;
&lt;br /&gt;
Analoge Signale werden häufig in Form einer bestimmten Spannung (z.B. -12..+12V)  oder eines bestimmten Stroms (z.B. 0..1024mA) repräsentiert.&lt;br /&gt;
&lt;br /&gt;
Um ein analoges Signal digital zu repräsentieren, werden Analog-Digital-Converter ([[ADC]]) eingesetzt, um analoge Signale aus digitalen zu erzeugen, Digital-Analog-Converter ([[DAC]]).&lt;br /&gt;
&lt;br /&gt;
Im erweiterten Sinn kann man auch jedes Signal als &amp;quot;analog&amp;quot; bezeichnen, bei dem ein Mittelwert zwischen zwei Werten ebenfalls eine definierte Bedeutung hat. Wenn beispielsweise eine Frequenz von 10 kHz bedeutet, &amp;quot;der Wassertank ist leer&amp;quot; und eine Frequenz von 20 kHz bedeutet, &amp;quot;der Wassertank ist voll&amp;quot;, würde eine Frequenz von 15 kHz bedeuten, &amp;quot;der Wassertank ist zwischen leer und voll&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digital&amp;diff=1097</id>
		<title>Digital</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digital&amp;diff=1097"/>
		<updated>2004-06-05T21:57:12Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Digitale Signale:&lt;br /&gt;
Der Gegensatz zu [[Analog]]en Signalen.&lt;br /&gt;
Ein digitales Signal kann nur zwei gültige Werte annehmen: Logisch 1 oder Logisch 0.&lt;br /&gt;
&lt;br /&gt;
Beiden Werten ist normalerweise ein bestimmter [[Spannung]]sbereich zugeordnet (manchmal auch ein [[Strom]]bereich). Einer dieser Bereiche gilt als Logisch 0, der anderere als Logisch 1.&lt;br /&gt;
&lt;br /&gt;
Zwischenwerte sind&lt;br /&gt;
* insofern VERBOTEN, als eine - korrekt funktionierende - Digitalschaltung solche Spannungswerte nicht(*1) erzeugen darf;&lt;br /&gt;
* insofern UNDEFINIERT, als eine Digitalschaltung beim Anliegen einer Spannung, die weder Logisch 0 noch Logisch 1 repräsentiert, prinzipiell tun kann, was sie will(*2).&lt;br /&gt;
&lt;br /&gt;
(*1: Da der Wechsel zwischen den beiden Bereichen nicht &amp;quot;unendlich schnell&amp;quot; erfolgt, wird in der Praxis natürlich auch immer für kurze Zeit einmal ein Zwischenwert ausgegeben.) &lt;br /&gt;
&lt;br /&gt;
(*2: Digitalschaltungen können u.U. auch permanent zerstört werden, wenn ein Pegel im undefinierten Bereich über zu lange Zeit anliegt).&lt;br /&gt;
&lt;br /&gt;
Bei [[TTL]]-Signalen gilt z.B. der &amp;quot;High&amp;quot;-Pegel von +2,0..+5,0 V als &amp;quot;Logisch 1&amp;quot;, während der &amp;quot;Low&amp;quot;-Pegel für &amp;quot;Logisch 0&amp;quot; zwischen 0..+0,8 V liegen muss.&lt;br /&gt;
&lt;br /&gt;
Bei [[CMOS]]-Signalen (wo die Betriebsspannung der Bausteine variieren kann) gelten Pegel von 0..33% der Betriebsspannung als  &amp;quot;Logisch 0&amp;quot;, Pegel von 66..100% der Betriebsspannung als &amp;quot;Logisch 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Bei der [[RS232]]-Übertragung ist Logisch 1 als Spannung von -3..-15V definiert, Logisch 0 entspricht +3..+15V.&lt;br /&gt;
&lt;br /&gt;
Um kleinere Störungen auszufiltern, gelten häufig geringfügig andere Werte für die zu ERZEUGENDEN Spannungen.&lt;br /&gt;
&lt;br /&gt;
Bei TTL-Signalen sollte die erzeugte Spannung für Logisch 0 höchstens +0,7V betragen, für Logisch 1 mindestens +2,4V. Bei der RS232-Übertragung sollte die Sendeseite für Logisch 1 -5..-15V erzeugen und für Logisch 0 +5..+15V.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Digital&amp;diff=1096</id>
		<title>Digital</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Digital&amp;diff=1096"/>
		<updated>2004-06-05T21:55:30Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Digitale Signale:&lt;br /&gt;
Der Gegensatz zu [[Analog]]en Signalen.&lt;br /&gt;
Ein digitales Signal kann nur zwei gültige Werte annehmen: Logisch 1 oder Logisch 0.&lt;br /&gt;
&lt;br /&gt;
Beiden Werten ist normalerweise ein bestimmter [[Spannung]]sbereich zugeordnet (manchmal auch ein [[Strom]]bereich). Einer dieser Bereiche gilt als Logisch 0, der anderere als Logisch 1.&lt;br /&gt;
&lt;br /&gt;
Zwischenwerte sind&lt;br /&gt;
* insofern VERBOTEN, als eine - korrekt funktionierende - Digitalschaltung solche Spannungswerte nicht(*1) erzeugen darf;&lt;br /&gt;
* insofern UNDEFINIERT, als eine Digitalschaltung beim Anliegen einer Spannung, die weder Logisch 0 noch Logisch 1 repräsentiert, prinzipiell tun kann, was sie will(*2).&lt;br /&gt;
&lt;br /&gt;
(*1: Da der Wechsel zwischen den beiden Bereichen nicht &amp;quot;unendlich schnell&amp;quot; erfolgt, wird in der Praxis natürlich auch immer für kurze Zeit einmal ein Zwischenwert ausgegeben.) &lt;br /&gt;
&lt;br /&gt;
(*2: Digitalschaltungen können u.U. auch permanent zerstört werden, wenn ein Pegel im undefinierten Bereich über zu lange Zeit anliegt).&lt;br /&gt;
&lt;br /&gt;
Bei [[TTL]]-Signalen gilt z.B. der &amp;quot;High&amp;quot;-Pegel von +2,0..+5,0 V als &amp;quot;Logisch 1&amp;quot;, während der &amp;quot;Low&amp;quot;-Pegel für &amp;quot;Logisch 0&amp;quot; zwischen 0..+0,8 V liegen muss.&lt;br /&gt;
&lt;br /&gt;
Bei [[CMOS]]-Signalen (wo die Betriebsspannung der Bausteine variieren kann) gelten Pegel von 0..33% der Betriebsspannung als  &amp;quot;Logisch 0&amp;quot;, Pegel von 66..100% der Betriebsspannung als &amp;quot;Logisch 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Bei der [[RS232]]-Übertragung ist Logisch 1 als Spannung von -3..-15V definiert, Logisch 0 entspricht +3..+15V.&lt;br /&gt;
&lt;br /&gt;
Um kleinere Störungen auszufiltern, ist gelten häufig geringfügig andere Werte für die zu ERZEUGENDEN Spannungen.&lt;br /&gt;
&lt;br /&gt;
Bei TTL-Signalen sollte die erzeugte Spannung für Logisch 0 höchstens +0,7V betragen, für Logisch 1 mindestens +2,4V. Bei der RS232-Übertragung sollte die Sendeseite für Logisch 1 -5..-15V erzeugen und für Logisch 0 +5..+15V.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Martin&amp;diff=11889</id>
		<title>Benutzer:Martin</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Martin&amp;diff=11889"/>
		<updated>2004-06-05T15:13:33Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nachdem ich in den letzten Tagen das Wiki um einige Seiten bereichert habe und in Zukunft vielleicht auch noch ein bisschen mehr von mir kommt, fand ich es etwas netter, wenn künftig ein Name da steht und nicht nur eine IP-Nummer.&lt;br /&gt;
&lt;br /&gt;
Hier mein Kurzsteckbrief:&lt;br /&gt;
* Geboren bin ich 1954 in Ludwigshafen am Rhein.&lt;br /&gt;
* Kleine Elektrobasteleien haben mich schon sehr früh fasziniert (mit 6 oder 7 Jahren, etwa die Beleuchtung der Puppenstuben meiner Schwestern),&lt;br /&gt;
* so etwa mit 10 Jahren kam dann die elektrische Eisenbahn, wo es nicht nur Häuser und Straßen zu beleuchten gab,&lt;br /&gt;
* und nach und nach wurde es eben &amp;quot;anspruchsvoller&amp;quot; (Radiobaukasten, Verstärker, Modellschiff mit Funkfernsteuerung und all diese Sachen).&lt;br /&gt;
* Bei dieser Gelegenheit einmal schönen Dank an meinen Physiklehrer, der das gefördert hat und mir einige Türen öffnete.&lt;br /&gt;
* Eine davon brachte mich frühzeitig mit der Digitaltechnik in Berührung ...&lt;br /&gt;
* ... die Gatter und Flipflops waren damals allerdings noch &amp;quot;diskret&amp;quot; mit Dioden und Transistoren aufgebaut.&lt;br /&gt;
* &amp;quot;Naturgemäß&amp;quot; folgte ein Studium der Elektrotechnik, nach dem Vordiplom machte ich weiter mit Datentechnik (Technische Informatik).&lt;br /&gt;
* Dazwischen gab es immer wieder kleinener Elektronikarbeiten, teils einfach &amp;quot;aus Spaß&amp;quot; dran, teils auch fürs Studium.&lt;br /&gt;
* Ein paar Mal landeten meine Sachen auch in Schaltungswettbewerben (Funkschau, Elektronik, so &amp;quot;um Platz 20 herum&amp;quot;) oder wurden anderweitig veröffentlicht.&lt;br /&gt;
* Dann - Mitte der 1970er - kamen langsam die Mikroprozessoren in Mode ...&lt;br /&gt;
* ... für mich als Student war das aber preislich eine Kategorie zu hoch (ein 8080 kostete anfänglich so um die 1000 DM).&lt;br /&gt;
* Im Alter von 25 Jahren, noch als Student, meldete ich dann einen &amp;quot;Gewerbebetrieb&amp;quot; an, um im Auftrag Programmierarbeiten erledigen zu können.&lt;br /&gt;
* Beruflich bin ich sowohl selbstständig als auch in der Software-Ecke geblieben (meine letzte eigenständige Hardware-Entwicklung war vor knapp 20 Jahren ein Interface zur Ansteuerung eines Lochstreifenstanzers über die Parallel-Schnittstelle).&lt;br /&gt;
* Da ich aber schon vor mehr als 20 Jahren auf Unix und C stieß, habe ich von DOS/Windows nicht sonderlich viel mitbekommen ...&lt;br /&gt;
* ... einige eher leidvolle Erfahrungen findet man hier: [http://www.rent-a-guru.de/pub/sadstory.html]&lt;br /&gt;
* Heute verdiene ich meinen Lebensunterhalt vor allem mit Schulungen, u.a. für die Programmiersprachen [[C]]/[[C-Plusplus|C++]], [[Java]] und [[Tcl/Tk]] und alle [[Unix]]-ähnlichen Betriebssysteme inkl. [[Linux]].&lt;br /&gt;
* Derzeit recht gefragte Themen sind &amp;quot;Embedded Linux&amp;quot; und &amp;quot;C++ für Mikrocontroller&amp;quot; - für mich eine willkommene Gelegenheit, wieder &amp;quot;zu meinen Wurzeln&amp;quot; zurück zu finden.&lt;br /&gt;
* Interessante Projekte sind natürlich auch willkommen (also wer was hat oder weiß, nur her damit :-))&lt;br /&gt;
&lt;br /&gt;
PS: Wenn ich etwas mehr Zeit habe, schreibe ich vielleicht auch noch etwas mehr und lade auch ein Bild hoch.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Martin&amp;diff=1093</id>
		<title>Benutzer:Martin</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Martin&amp;diff=1093"/>
		<updated>2004-06-05T15:10:36Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nachdem ich in den letzten Tagen das Wiki um einige Seiten bereichert habe und in Zukunft vielleicht auch noch ein bisschen mehr von mir kommt, fand ich es etwas netter, wenn künftig ein Name da steht und nicht nur eine IP-Nummer.&lt;br /&gt;
&lt;br /&gt;
Hier mein Kurzsteckbrief:&lt;br /&gt;
* Geboren bin ich 1954 in Ludwigshafen am Rhein.&lt;br /&gt;
* Kleine Elektrobasteleien haben mich schon sehr früh fasziniert (mit 6 oder 7 Jahren, etwa die Beleuchtung der Puppenstuben meiner Schwestern),&lt;br /&gt;
* so etwa mit 10 Jahren kam dann die elektrische Eisenbahn, wo es nicht nur Häuser und Straßen zu beleuchten gab,&lt;br /&gt;
* und nach und nach wurde es eben &amp;quot;anspruchsvoller&amp;quot; (Radiobaukasten, Verstärker, Modellschiff mit Funkfernsteuerung und all diese Sachen).&lt;br /&gt;
* Bei dieser Gelegenheit einmal schönen Dank an meinen Physiklehrer, der das gefördert hat und mir einige Türen öffnete.&lt;br /&gt;
* Eine davon brachte mich frühzeitig mit der Digitaltechnik in Berührung ...&lt;br /&gt;
* ... die Gatter und Flipflops waren damals allerdings noch &amp;quot;diskret&amp;quot; mit Dioden und Transistoren aufgebaut.&lt;br /&gt;
* &amp;quot;Naturgemäß&amp;quot; folgte ein Studium der Elektrotechnik, nach dem Vordiplom machte ich weiter mit Datentechnik (Technische Informatik).&lt;br /&gt;
* Dazwischen gab es immer wieder kleinener Elektronikarbeiten, teils einfach &amp;quot;aus Spaß&amp;quot; dran, teils auch fürs Studium.&lt;br /&gt;
* Ein paar Mal landeten meine Sachen auch in Schaltungswettbewerben (Funkschau, Elektronik, so &amp;quot;um Platz 20 herum&amp;quot;) oder wurden anderweitig veröffentlicht.&lt;br /&gt;
* Dann - Mitte der 1970er - kamen langsam die Mikroprozessoren in Mode ...&lt;br /&gt;
* ... für mich als Student war das aber preislich eine Kategorie zu hoch (ein 8080 kostete anfänglich so um die 1000 DM).&lt;br /&gt;
* Im Alter von 25 Jahren, noch als Student, meldete ich dann einen &amp;quot;Gewerbebetrieb&amp;quot; an, um im Auftrag Programmierarbeiten erledigen zu können.&lt;br /&gt;
* Beruflich bin ich sowohl selbstständig als auch in der Software-Ecke geblieben (meine letzte eigenständige Hardware-Entwicklung war vor knapp 20 Jahren ein Interface zur Ansteuerung eines Lochstreifenstanzers über die Parallel-Schnittstelle).&lt;br /&gt;
* Da ich aber schon vor mehr als 20 Jahren auf Unix und C stieß, habe ich von DOS/Windows nicht sonderlich viel mitbekommen ...&lt;br /&gt;
* ... einige eher leidvolle Erfahrungen findet man hier: [http://www.rent-a-guru.de/pub/sadstory.html]&lt;br /&gt;
* Heute verdiene ich meinen Lebensunterhalt vor allem mit Schulungen, u.a. für die Programmiersprachen [[C]]/[[C-Plusplus|C++]], [[Java]] und [[Tcl/Tk]] und alle [[Unix]]-ähnlichen Betriebssysteme inkl. [[Linux]].&lt;br /&gt;
* Derzeit recht gefragte Themen sind &amp;quot;Embedded Linux&amp;quot; und &amp;quot;C++ für Mikrocontroller&amp;quot; - für mich eine willkommene Gelegenheit, wieder &amp;quot;zu meinen Wurzeln&amp;quot; zurück zu finden.&lt;br /&gt;
* Interessante Projekte sind natürlich auch willkommen (also wer was hat oder weiß, nur her damit :-))&lt;br /&gt;
&lt;br /&gt;
PS: Wenn ich etwas mehr Zeit habe, scheibe ich vielleicht auch noch etwas mehr und lade auch ein Bild hoch.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
	</entry>
</feed>