Parallaxenpropeller - Parallax Propeller

Parallax-Propeller im Dual-In-Line-Paket
Parallaxenpropeller in TQFP

Der Parallax P8X32A Propeller ist ein Multi-Core - Prozessor parallel Computerarchitektur Mikrocontroller - Chip mit acht 32-Bit - Reduced Instruction Set Computer (RISC) zentralen Verarbeitungseinheit (CPU) Kerne. Es wurde 2006 eingeführt und wird von Parallax, Inc. entwickelt und verkauft .

Der Propeller-Mikrocontroller, die Propeller- Assemblersprache und der Spin- Interpreter wurden vom Mitbegründer und Präsidenten von Parallax, Chip Gracey, entwickelt. Die Programmiersprache Spin und die integrierte Entwicklungsumgebung (IDE) von Propeller Tool wurden von Chip Gracey und dem Software-Ingenieur Jeff Martin von Parallax entwickelt.

Am 6. August 2014 hat Parallax Inc. die gesamte Hardware und Tools von Propeller 1 P8X32A als Open-Source-Hardware und -Software unter der GNU General Public License (GPL) 3.0 veröffentlicht. Dazu gehörten der Verilog- Code, HDL-Dateien (High -Level Hardware Description Language ), Spin-Interpreter, PropellerIDE- und SimpleIDE-Programmiertools und -Compiler.

Multi-Core-Architektur

Jeder der acht 32-Bit-Kerne (als Cog bezeichnet ) hat eine zentrale Verarbeitungseinheit (CPU), die Zugriff auf 512 32-Bit-lange Wörter (2  KB ) von Befehlen und Daten hat. Selbstmodifizierender Code ist möglich und wird intern verwendet, zB da sich der Bootloader mit dem Spin Interpreter selbst überschreibt. Unterroutinen in Spin (objektbasierter High-Level-Code) verwenden einen Call-Return-Mechanismus, der die Verwendung eines Call- Stack erfordert . Assembler-Code (PASM, Low-Level) benötigt keine Aufrufliste. Der Zugriff auf den gemeinsam genutzten Speicher (32 KB Direktzugriffsspeicher (RAM); 32 KB Nur-Lese-Speicher (ROM)) wird über Round-Robin-Scheduling von einem internen Computerbuscontroller gesteuert, der als Hub bezeichnet wird . Jeder Zahn hat auch Zugriff auf zwei dedizierte Hardwarezähler und einen speziellen Videogenerator zur Verwendung bei der Erzeugung von Zeitsignalen für PAL , NTSC , VGA , servomechanism -Kontrolle und andere.

Geschwindigkeits- und Energieverwaltung

Der Propeller kann entweder mit einem internen On-Chip-Oszillator getaktet werden (was eine geringere Gesamtzahl der Teile bietet, aber etwas Genauigkeit und thermische Stabilität einbüßt) oder einen externen Quarzoszillator oder Keramikresonator (bietet eine höhere maximale Geschwindigkeit mit größerer Genauigkeit bei höheren Gesamtkosten) ). Nur der externe Oszillator kann durch einen auf dem Chip ausgeführt wird phasenverriegelten Schleife (PLL) Taktvervielfacher , die auf 1x eingestellt werden können, 2x, 4x, 8x, 16x oder.

Sowohl die Onboard-Oszillatorfrequenz (sofern verwendet) als auch der PLL-Multiplikatorwert können zur Laufzeit geändert werden. Bei richtiger Anwendung kann dies die Energieeffizienz verbessern; zum Beispiel kann der PLL-Multiplikator vor einer langen Wartezeit ohne Operation , die für Timing-Zwecke benötigt wird, verringert und anschließend erhöht werden, wodurch der Prozessor weniger Strom verbraucht. Die Nützlichkeit dieser Technik ist jedoch auf Situationen beschränkt, in denen kein anderes Zahnrad zeitabhängigen Code ausführt (oder sorgfältig entworfen wurde, um mit der Änderung fertig zu werden), da die effektive Taktrate allen Zahnrädern gemeinsam ist.

Die effektive Taktrate reicht von 32 kHz bis 80 MHz (wobei die genauen Werte für die dynamische Steuerung abhängig von der verwendeten Konfiguration, wie oben beschrieben, verfügbar sind). Bei 80 MHz führt die proprietäre interpretierte Spin- Programmiersprache ungefähr 80.000 Instruktions-Token pro Sekunde auf jedem Kern aus, was 8 mal 80.000 für 640.000 High-Level-Instruktionen pro Sekunde ergibt. Die meisten maschinensprachlichen Befehle benötigen zur Ausführung 4 Taktzyklen, was zu 20 Millionen Befehlen pro Sekunde (MIPS) pro Zahnrad oder insgesamt 160 MIPS für einen 8-Zahn-Propeller führt.

Der Stromverbrauch kann reduziert werden, indem die Taktrate auf das erforderliche Maß gesenkt wird, nicht benötigte Zahnräder (die dann wenig Strom verbrauchen) abgeschaltet und I/O-Pins, die nicht benötigt werden, neu konfiguriert oder sicher in einen hochohmigen Zustand versetzt werden können ( tristated ), als Eingaben. Pins können dynamisch neu konfiguriert werden, aber auch hier gilt die Änderung für alle Zahnräder, daher ist die Synchronisierung für bestimmte Designs wichtig. Ein gewisser Schutz ist für Situationen verfügbar, in denen ein Kern versucht, einen Pin als Ausgang zu verwenden, während ein anderer versucht, ihn als Eingang zu verwenden. Dies wird im technischen Referenzhandbuch von Parallax erklärt.

On-Board-Peripherie

Jedes Zahnrad hat Zugriff auf eine dedizierte Counter-Timer-Hardware und einen speziellen Timing-Signalgenerator, der das Design von Video-Ausgangsstufen wie Composite- PAL- oder NTSC- Displays (einschließlich Modulation für Rundfunk) und Video Graphics Array (VGA)-Monitoren vereinfachen soll . Parallax stellt somit Beispielcode zur Verfügung, der Videosignale (Text und etwas niedrig aufgelöste Grafiken) unter Verwendung einer minimalen Anzahl von Teilen bestehend aus dem Propeller, einem Quarzoszillator und einigen Widerständen erzeugen kann, um einen groben Digital-Analog-Wandler (DAC .) zu bilden ). Die Frequenz des Oszillators ist wichtig, da die Korrekturfähigkeit der Video-Timing-Hardware auf die Taktrate beschränkt ist. Es ist möglich, mehrere Zahnräder parallel zu verwenden, um ein einzelnes Videosignal zu erzeugen. Allgemeiner kann die Timing-Hardware verwendet werden, um verschiedene Pulsbreitenmodulations- (PWM)-Timing-Signale zu implementieren .

ROM-Erweiterungen

Neben dem Spin-Interpreter und einem Bootloader liefert das eingebaute ROM einige Daten, die für bestimmte Sound-, Video- oder Mathematikanwendungen nützlich sein können:

  • eine Bitmap- Schriftart wird bereitgestellt, die für typische Zeichenerzeugungsanwendungen geeignet ist (aber nicht anpassbar);
  • eine Logarithmustabelle (Basis 2, 2048 Einträge);
  • eine Antilog- Tabelle (Basis 2, 2048 Einträge); und
  • eine Sinustabelle (16-Bit, 2049 Einträge, die den ersten Quadranten darstellen, Winkel von 0 bis /2; die anderen drei Quadranten werden aus derselben Tabelle erstellt).

Die mathematischen Erweiterungen sollen helfen, das Fehlen einer Gleitkommaeinheit und primitivere fehlende Operationen wie Multiplikation und Division auszugleichen (dies ist in Spin maskiert, ist aber für Assembler- Routinen eine Grenze ). Der Propeller ist jedoch ein 32-Bit-Prozessor, und diese Tabellen haben möglicherweise eine unzureichende Genauigkeit für Anwendungen mit höherer Präzision.

Eingebauter Spin-Bytecode-Interpreter

Spin ist eine Multitasking- High-Level- Computerprogrammiersprache, die von Parallax 's Chip Gracey entwickelt wurde, der auch den Propeller- Mikrocontroller, auf dem es läuft, für seine Propeller-Mikrocontroller-Produktlinie entwickelt hat.

Spin-Code wird auf dem Propeller Tool geschrieben, einer GUI-orientierten Softwareentwicklungsplattform, die für Windows XP geschrieben wurde. Dieser Compiler wandelt den Spin-Code in Bytecodes um, die (mit demselben Tool) in den 32 KB Haupt-RAM und optional in den I²C- Boot elektrisch löschbaren programmierbaren Nur-Lese-Speicher ( EEPROM ) des Propeller-Chips geladen werden können . Nach dem Booten des Propellers wird ein Bytecode-Interpreter aus dem eingebauten ROM in den 2 KB RAM des primären COG kopiert. Dieses COG beginnt dann mit der Interpretation der Bytecodes im 32 KB Haupt-RAM. In anderen COGs kann mehr als eine Kopie des Bytecode-Interpreters ausgeführt werden, sodass mehrere Spin-Code- Threads gleichzeitig ausgeführt werden können. Innerhalb eines Spin-Code-Programms können Assembler-Code-Programm(e) inline eingefügt werden. Diese Assembler-Programme laufen dann auf ihren eigenen COGs.

Wie Python verwendet Spin Leerzeichen zum Einrücken anstelle von geschweiften Klammern oder Schlüsselwörtern , um Blöcke abzugrenzen .

Der Interpreter des Propellers für seine proprietäre Multithread- Computersprache Spin ist ein Bytecode- Interpreter. Dieser Interpreter decodiert Befehlsfolgen, eine Anweisung pro Byte , aus Benutzercode, der von einer zweckspezifischen integrierten Entwicklungsumgebung (IDE) aus bearbeitet, kompiliert und auf den Propeller geladen wurde . Diese IDE, die Parallax The Propeller Tool nennt , ist für die Verwendung unter einem Microsoft Windows- Betriebssystem vorgesehen.

Die Spin-Sprache ist eine höhere Programmiersprache . Da es in Software interpretiert wird, läuft es langsamer als die reine Propeller-Assembly, kann aber platzsparender sein: Propeller-Assembly-Opcodes sind 32 Bit lang; Spin-Direktiven sind 8 Bit lang, denen eine Anzahl von 8-Bit-Bytes folgen können, um zu spezifizieren, wie diese Direktive arbeitet. Spin ermöglicht auch die Vermeidung erheblicher Speichersegmentierungsprobleme , die für Assemblercode berücksichtigt werden müssen.

Beim Start wird eine Kopie des Bytecode-Interpreters (weniger als 2 KB) in den dedizierten RAM eines Zahnrads kopiert und beginnt dann mit der Interpretation des Bytecodes im 32 KB Haupt-RAM. Ab diesem Punkt können weitere Cogs gestartet werden, wobei eine separate Kopie des Interpreters in den dedizierten RAM des neuen Cogs geladen wird (insgesamt können somit acht Interpreter-Threads gleichzeitig ausgeführt werden). Dies bedeutet insbesondere, dass für alle Propeller-Anwendungen mindestens eine minimale Menge an Startcode Spin-Code sein muss .

Syntax

Die Syntax von Spin kann in Blöcke unterteilt werden, die Folgendes enthalten:

  • VAR – globale Variablen
  • CON – Programmkonstanten
  • PUB – Code für ein öffentliches Unterprogramm
  • PRI – Code für ein privates Unterprogramm
  • OBJ – Code für Objekte
  • DAT – vordefinierte Daten, Speicherreservierungen und Assemblercode

Beispiel-Keywords

  • reboot: bewirkt einen Neustart des Mikrocontrollers
  • waitcnt: warten, bis der Systemzähler einen bestimmten Wert erreicht oder überschreitet
  • waitvid: wartet auf ein (Video-)Timing-Ereignis, bevor (Video-)Daten an I/O-Pins ausgegeben werden
  • coginit: startet einen Prozessor für eine neue Aufgabe

Beispielprogramm

Ein Beispielprogramm (wie es im Propeller Tool Editor erscheinen würde ), das alle 3.000.000 Zyklen den aktuellen Systemzähler ausgibt und dann nach 40.000.000 Zyklen von einem anderen Zahnrad heruntergefahren wird:

Beispiel SPIN-Programm.png

Der Parallax Propeller sammelt nach und nach Softwarebibliotheken, die ihm ähnliche Fähigkeiten wie das ältere BASIC Stamp- Produkt von Parallax verleihen ; es gibt jedoch keine einheitliche Liste, welche PBASIC- Einrichtungen jetzt Spin-Äquivalente haben.

Es wurde scherzhaft behauptet: "Wenn sich zwei Sprachen in einer Bar treffen würden – Fortran und BASIC – würde man neun Monate später Spin finden." Dies bezieht sich auf die Whitespace-Formatierung von FORTRAN und den schlüsselwortbasierten Betrieb von BASIC.

Paket und E/A

Die erste Version des Chips (genannt P8X32A) bietet einen 32-Bit-Port in einem 40-Pin-0.6-in- Dual-In-Line-Gehäuse (DIP), 44-Pin- LQFP oder Quad-Flat-No-Leads-Gehäuse (QFN) . Technologiepaket montieren . Von den 40 verfügbaren Pins werden 32 für E/A verwendet, vier für Strom- und Massepins, zwei für einen externen Quarz (sofern verwendet), einer für die Stromausfall- und Brownout-Erkennung und einer für den Reset.

Alle acht Kerne können gleichzeitig auf den 32-Bit-Port (bezeichnet mit „A“; ein „B“ gibt es derzeit nicht) zugreifen. Ein spezieller Kontrollmechanismus wird verwendet, um I/O-Konflikte zu vermeiden, wenn ein Kern versucht, einen I/O-Pin als Ausgang zu verwenden, während ein anderer versucht, ihn als Eingang zu verwenden. Jeder dieser Pins kann für die oben beschriebenen Zeitgebungs- oder Pulsbreitenmodulations-Ausgangstechniken verwendet werden.

Parallax hat erklärt, dass es erwartet, dass spätere Versionen des Propellers mehr I/O-Pins und/oder mehr Speicher bieten.

Virtuelle E/A-Geräte

Screenshot der Grafikdemo, die Parallax erstellt hat, um die NTSC-Videobibliothek zu demonstrieren

Die Designer des Propellers haben es nach dem Konzept der "virtuellen E/A-Geräte" entworfen. Zum Beispiel verwendet das HYDRA Game Development Kit (ein Computersystem, das für Bastler entwickelt wurde, um zu lernen, wie man Videospiele im Retro-Stil entwickelt, den eingebauten Zeichengenerator und die Videounterstützungslogik, um eine virtuelle Grafikverarbeitungseinheit zu generieren , die VGA ausgibt.) Farbbilder, PAL/NTSC-kompatible Farbbilder oder HF-Video+Audio in Software übertragen.

Die hier angezeigte Bildschirmaufnahme wurde unter Verwendung eines virtuellen Softwaretreibers erstellt , der die Pixeldaten über eine serielle Verbindung an einen PC sendet.

Es stehen Softwarebibliotheken zur Verfügung, um verschiedene I/O-Geräte zu implementieren, die von einfachen UARTs und seriellen I/O-Schnittstellen wie SPI-, I²C- und PS/2-kompatiblen seriellen Maus- und Tastaturschnittstellen, Motortreibern für Robotersysteme, MIDI-Schnittstellen und LCD-Controllern reichen.

Dedizierte Cores statt Interrupts

Die Designphilosophie des Propellers besteht darin, dass eine harte Echtzeit- Multi-Core-Architektur den Bedarf an dedizierter Interrupt- Hardware und Unterstützung bei der Montage überflüssig macht. In der traditionellen CPU-Architektur werden externe Interrupt-Leitungen einem On-Chip-Interrupt-Controller zugeführt und von einer oder mehreren Interrupt-Service-Routinen bedient . Wenn ein Interrupt auftritt, unterbricht der Interrupt-Controller die normale CPU-Verarbeitung und speichert den internen Zustand (typischerweise auf dem Stack) und leitet dann an die bezeichnete Interrupt-Service-Routine weiter. Nach der Behandlung des Interrupts führt die Serviceroutine einen Return from Interrupt- Befehl aus, der den internen Zustand wiederherstellt und die CPU-Verarbeitung wieder aufnimmt.

Um ein externes Signal umgehend am Propeller zu verarbeiten, wird eine der 32 I/O-Leitungen als Eingang konfiguriert. Ein Zahnrad ist dann so konfiguriert, dass es auf einen Übergang (entweder positive oder negative Flanke) an diesem Eingang wartet, wobei eine der beiden Zählerschaltungen verwendet wird, die jedem Zahnrad zur Verfügung stehen. Während es auf das Signal wartet, arbeitet das Zahnrad im Energiesparmodus und schläft im Wesentlichen. In Erweiterung dieser Technik kann ein Propeller so eingerichtet werden, dass er auf acht unabhängige Interrupt- Leitungen mit einer Bearbeitungsverzögerung von im Wesentlichen null reagiert . Alternativ kann eine Leitung verwendet werden, um den Interrupt zu signalisieren, und dann können zusätzliche Eingangsleitungen gelesen werden, um die Art des Ereignisses zu bestimmen. Der Code, der in den anderen Kernen läuft, wird durch das Interrupt-Handling-Zahnrad nicht beeinflusst. Im Gegensatz zu einer herkömmlichen Multitasking-Einzelprozessor-Interrupt-Architektur bleibt das Signalantwort-Timing vorhersehbar , und tatsächlich kann die Verwendung des Begriffs Interrupt in diesem Zusammenhang zu Verwirrung führen, da diese Funktion richtiger als Abfragen mit einer Null-Schleifenzeit betrachtet werden kann.

Boot-Mechanismus

Beim Einschalten, Brownout- Erkennung, Software-Reset oder externem Hardware-Reset lädt der Propeller eine Maschinencode- Boot- Routine aus dem internen ROM in den RAM seines ersten (primären) Zahnrads und führt sie aus. Dieser Code emuliert eine I²C- Schnittstelle in der Software und verwendet vorübergehend zwei I/O-Pins für die benötigten seriellen Takt- und Datensignale, um Benutzercode von einem externen I 2 C EEPROM zu laden .

Gleichzeitig emuliert es einen seriellen Port mit zwei anderen I/O-Pins, mit denen Software direkt in den RAM (und optional in das externe EEPROM) hochgeladen werden kann. Wenn der Propeller keine Befehle von der seriellen Schnittstelle sieht, lädt er das Anwenderprogramm (dessen Eingabecode wie oben beschrieben in Spin geschrieben werden muss) aus dem seriellen EEPROM in den 32 KB Hauptspeicher. Danach lädt es den Spin-Interpreter aus seinem eingebauten ROM in den dedizierten RAM seines ersten Zahnrads und überschreibt den größten Teil des Bootloaders.

Unabhängig davon, wie das Benutzerprogramm geladen wird, beginnt die Ausführung mit der Interpretation des anfänglichen Benutzer- Bytecodes, wobei der Spin-Interpreter im primären Zahnrad läuft. Nachdem dieser anfängliche Spin-Code ausgeführt wurde, kann die Anwendung jedes nicht verwendete Zahnrad aktivieren, um einen neuen Thread zu starten und/oder Assembler- Routinen zu starten .

Externer persistenter Speicher

Der Propeller bootet von einem externen seriellen EEPROM ; Sobald die Bootsequenz abgeschlossen ist, kann auf dieses Gerät als externes Peripheriegerät zugegriffen werden.

Andere Sprachimplementierungen

Abgesehen von Spin und dem Low-Level-Assembler des Propellers wurden eine Reihe anderer Sprachen darauf portiert.

C-Compiler

Parallax unterstützt Propeller-GCC, eine Portierung des GNU Compiler Collection (GCC)-Compilers für die Programmiersprachen C und C++ , für Propeller (Zweigversion_1_0). Der C-Compiler und die C-Bibliothek sind ANSI C-kompatibel. Der C++-Compiler ist ANSI-C99-kompatibel. Volles C++ wird mit externem Speicher unterstützt. Das SimpleIDE-Programm bietet Benutzern eine einfache Möglichkeit, Programme zu schreiben, ohne Makefiles zu benötigen . Im Jahr 2013 hat Parallax Propeller-GCC und Simple Libraries in die Propeller-C Learn-Tutorialreihe aufgenommen. Propeller-GCC wird aktiv gepflegt. Propeller-GCC und SimpleIDE sind offiziell unterstützte Parallax-Softwareprodukte.

Der ImageCraft ICCV7 für Propeller C-Compiler wurde als End-of-Life-Status markiert.

Ein kostenloser ANSI-C-Compiler namens Catalina ist verfügbar. Es basiert auf LCC . Catalina wird aktiv gepflegt.

BASIC-Compiler

PropBASIC ist eine BASIC- Programmiersprache für den Parallax Propeller Microcontroller. PropBASIC erfordert Brads Spin Tool (BST), einen plattformübergreifenden Satz von Tools für die Entwicklung mit dem Parallax Propeller. Seit August 2015 läuft BST auf i386-linux-gtk2, PowerPC-darwin ( Mac OS X 10.4 bis 10.6), i386-darwin (Mac OS X 10.4 bis 10.6) und i386-Win32 ( Windows 95 bis Windows 7 ).

Weiter auf dem Propeller

Für den Propeller sind mindestens sechs verschiedene Versionen von Forth erhältlich , sowohl kommerzielle als auch Open-Source-Software .

PropForth

Eine kostenlose Version, die umfangreiche Entwicklungs- und Community-Unterstützung genießt, ist PropForth. Es ist auf die Requisitenarchitektur zugeschnitten und weicht notwendigerweise von jedem allgemeinen Standard bezüglich architektonischer Einzigartigkeit ab, im Einklang mit dem Konzept von Forth.

Über den Forth-Interpreter hinaus bietet PropForth viele Funktionen, die die Fähigkeiten des Chips ausnutzen. Linked I/O bezieht sich auf die Methode, einen Datenstrom einem Prozess zuzuordnen, wodurch ein Prozess direkt mit dem nächsten verknüpft werden kann, transparent für die Anwendung. Dies kann in vielen Fällen die Notwendigkeit einer Hardware-Debugging- oder JTAG-Schnittstelle ( Joint Test Action Group ) reduzieren oder eliminieren . Multi-Channel Synchronous Serial (MCS) bezieht sich auf die synchrone serielle Kommunikation zwischen Prop-Chips. 96-Bit-Pakete werden kontinuierlich zwischen zwei Zahnrädern gesendet. Das Ergebnis ist, dass Anwendungen zusätzliche Ressourcen (+6 Zahnräder für jeden hinzugefügten Prop-Chip) mit geringen oder keinen Auswirkungen auf den Durchsatz einer gut konstruierten Anwendung sehen.

LogicAnalyzer bezieht sich auf ein Erweiterungspaket, das einen Software-Logikanalysator implementiert. EEPROMfilesystem und SDfilesystem sind Erweiterungen, die eine rudimentäre Speicherung mit EEPROM und SD-Flash implementieren.

PagedAssembler bezieht sich auf das Paket von Optimierungen, das es ermöglicht, Assembler-Routinen im laufenden Betrieb ein- und auszulagern (und durch Überschreiben auszulagern ), was eine praktisch unbegrenzte Anwendungsgröße ermöglicht. Die Skriptausführung ermöglicht das spontane Laden von Erweiterungen, wodurch Programmquellen bis zur Größe eines Speichermediums ermöglicht werden.

Propeller und Java

Es gibt Bestrebungen, die Java Virtual Machine (JVM) auf Propeller auszuführen . Ein Compiler, Debugger und Emulator werden entwickelt.

Pascal-Compiler und Laufzeit

Eine große Teilmenge von Pascal wird durch einen Compiler und Interpreter basierend auf dem P-Code-Maschinen- P4-System implementiert.

Grafische Programmierung

Screenshot des PICoPLC-Ladder-Editors

Die speicherprogrammierbare PICo- Steuerung (PLC, PICoPLC) unterstützt die Ausgabe an den Propeller-Prozessor. Das Programm wird in einem GUI- Leiterlogik- Editor erstellt und der resultierende Code wird als Spin-Quelle ausgegeben. PICoPLC unterstützt auch P8X32 mit der Funktion Create-Simulate-Run. Keine Einschränkung der Zielhardware, da Oszillatorfrequenz und IO-Pins im Ladder-Editor frei konfigurierbar sind. PICoPLC-Entwickler-Website ( [2] ).

Zukünftige Versionen

Ab 2014 baut Parallax einen neuen Propeller mit Zahnrädern, die jeweils mit etwa 200 MIPS laufen, während die Zahnräder des aktuellen Propellers jeweils mit etwa 20 MIPS laufen. Die verbesserte Leistung würde sich aus einer Erhöhung der maximalen Taktgeschwindigkeit auf 200 MHz (von 80 MHz) und einer Architektur ergeben, die Befehle Pipelines durchführt und durchschnittlich fast einen Befehl pro Taktzyklus ausführt (etwa eine zehnfache Erhöhung).

Verweise

Externe Links