Memory-mapped IO vs. Port-mapped IO in Mikrocontrollern

Ich habe über die Zuordnung externer Peripheriegeräte zu Mikrocontrollern gelesen.

Ich verstehe, dass speicherabgebildetes IO bedeutet, dass derselbe Adressraum im Mikrocontroller für den internen Speicher und auch zum Abbilden externer Peripheriegeräte verwendet werden kann. Daher können dieselben Anweisungen, die wir normalerweise verwenden, verwendet werden, um mit externen Geräten zu kommunizieren.

Port-mapped IO bedeutet, dass es einen bestimmten Adressraum gibt, der speziell für die Abbildung externer Peripherie verwendet wird. Manchmal müssen bestimmte Anweisungen verwendet werden, um über diesen Adressraum auf die Peripheriegeräte zuzugreifen.

Offensichtlich können wir hier die Vorteile von Memory-Mapped IO sehen. Allerdings habe ich das aus dem Link unten gelesen

„Der Nachteil der speicherabgebildeten IO-Methode besteht darin, dass der gesamte Adressbus für jedes Gerät vollständig decodiert werden muss. Beispielsweise würde eine Maschine mit einem 32-Bit-Adressbus Logikgatter benötigen, um den Zustand aller 32 Adressleitungen richtig aufzulösen decodieren Sie die spezifische Adresse eines beliebigen Geräts. Dies erhöht die Kosten für das Hinzufügen von Hardware zur Maschine.

Kann mir das bitte jemand erklären, da ich das nicht verstehe. Warum muss der Mikrocontroller den 32-Bit-Adressbus so dekodieren?

https://www.bogotobogo.com/Embedded/memory_mapped_io_vs_port_mapped_isolated_io.php

Kennen Sie die Adressdecodierung?
Nun, Sie müssen nicht den gesamten Bus decodieren, aber dann haben Sie am Ende einen nicht verfügbaren Adressraum (ein bestimmtes Peripheriegerät kann mehr als eine Adresse haben).

Antworten (2)

Die Aussage ist so wie sie ist falsch oder zumindest unvollständig.

Normalerweise aktiviert ein E/A-Befehl einige spezielle Pins auf dem Controller, um die E/A-Operation von einer Speicheroperation zu unterscheiden.

Die obige Aussage scheint davon auszugehen, dass der E/A-Befehl dann nur einen Teil des 32-Bit-Adressbusses verwendet und daher weniger Adressdecodierung benötigt wird. Ohne dies zu erwähnen, ist die Aussage an sich falsch.

Beachten Sie, dass insbesondere in den frühen Tagen der Mikrocontroller ganze Abschnitte der Adresskarte auf wenige Peripheriegeräte abgebildet wurden, indem einige Adresszeilen verwendet wurden, um alle Peripheriegeräte auszuwählen. Beispielsweise würden die Adressleitungen 15 und 14 eines von drei Peripheriegeräten auswählen, wobei 16 K als Adressraum verbleiben.

Diese Technik ist immer noch weit verbreitet.
Heutzutage hat ein 32-Bit-Prozessor einen Adressraum von 2 GB, aber viele Mikrocontroller haben weniger als 1 MB Speicher (in Flash und RAM), was nur 20 Adressleitungen erfordert. Dies hinterlässt viele freie Adresszeilen für diese Art von Sparse-Decodierung.

Ich denke nicht, dass Ihre Aussagen zur "sparse Decoding" mehr zutreffend sind. Beispielsweise haben die Cortex-M-Prozessoren, mit denen ich arbeite, Tausende von E/A-Geräteregistern, und der Zugriff auf sie erfordert, dass irgendwie alle 32 Bits der Adresse decodiert werden.
@ElliotAlderson Das sind On-Chip-Geräte und damit On-Chip-Decodierung. Ich sprach über die Off-Chip-Decodierungspraktiken. Die On-Chip-Decodierungslogik für 32 Bit ist nur ein winziger Bruchteil der Gatter, die benötigt werden, um zB das AXI-Protokoll zu implementieren. Nachdem ich SOCs mit ARM-AXI-Bussen gebaut habe, ist meine Schätzung, dass die Decodierlogik weniger als 0,1 % des AXI-Busses ausmacht, was oft weniger als 1 % der Chip-Gates ausmacht.

Warum muss der Mikrocontroller den 32-Bit-Adressbus so dekodieren?

Bei speicherabgebildeter E/A muss die Adresse ausreichend dekodiert werden, um die E/A- und Speicherbereiche zu trennen. Je weniger Adresszeilen verwendet werden, um jeden Block auszuwählen, desto größer wird der Block und desto mehr Platz könnte verschwendet werden. In einer 32-Bit-MCU könnten Sie A31 einfach decodieren, um z. Legen Sie Speicher in die ersten 2 GB und I/O in die zweiten 2 GB. Bei noch verfügbaren 2 GB Speicherplatz ist das wahrscheinlich kein Problem, aber in einer MCU mit 16 oder weniger Adressbits würde es den verfügbaren Speicherplatz stark reduzieren.

Bei separatem E/A-Bereich bewirken die E/A-Befehle, dass eine andere Aktivierungsleitung aktiviert wird, sodass Speichergeräte nicht reagieren, selbst wenn sie sich auf derselben Adresse befinden. Jetzt können die E/A-Geräte eine Teilmenge der Adressleitungen verwenden und die anderen ignorieren, und die E/A-Befehle müssen keine Adresse mit voller Breite angeben.

In der Vergangenheit wurden die meisten frühen MCUs um eine vorhandene CPU mit eingebetteten Peripheriegeräten herum entwickelt, mit einem kleinen (oder keinem) internen ROM und der Möglichkeit, externen Speicher zu verwenden. Diejenigen, die auf Intel 8080 usw. basierten, hatten einen separaten E/A-Bereich, während diejenigen, die auf dem Motorola 6800 basierten, speicherabgebildete E/A hatten. Diese frühen MCUs hatten nur wenige Transistoren und wenig Speicherplatz, sodass die Einsparungen durch separaten E/A-Platz erheblich sein könnten. Dies bedeutete, dass maximaler Speicherplatz ohne „Löcher“ verfügbar war und E/A-Geräte weniger Dekodierungslogik benötigten.