Mikroprozessoren / Mikrocontroller - Haben Register Adressen?


7

Mein Professor für eingebettete Systeme bezeichnet die Speicherorte von Registern immer wieder als ihre jeweiligen "Adressen". Das verwirrt mich; Ich hatte immer den Eindruck, dass in keinem Mikroprozessor die CPU-Register keine Adressen haben, da sie sich nicht im Hauptspeicher befinden (sie befinden sich im Mikroprozessor selbst). Ich bin auch verwirrt darüber, worauf wir uns beziehen, wenn wir den "Speicherort des Registers" sagen - wieder ist es nicht im Hauptspeicher.

Warum beziehen wir uns auf die Positionen der CPU-Register durch "Adressen"? Haben alle / einige Register Adressen?

Ich dachte darüber nach und argumentierte, dass sie möglicherweise mit bestimmten Hauptspeicherorten "verbunden" sind, um den Zugriff auf die in den Registern gespeicherten Werte zu ermöglichen. Ist dies eine Speicherzuordnung, um diesen Gedanken zu erweitern?

Ich sollte auch hinzufügen, dass wir speziell mit dem LPC1768-Mikrocontroller von NXP arbeiten, der den ARM Cortex-M3-Mikroprozessor verwendet.

Antworten:


6

Es hängt vom jeweiligen Prozessor ab, ob sich "Register" im selben Adressraum wie der reguläre Datenspeicher oder separat befinden. In beiden Fällen benötigt jeder, wenn mehrere vorhanden sind, noch eine Adresse.

Angenommen, der Prozessor verfügt über 16 Register, die eng mit der CPU verbunden und getrennt vom Datenspeicher implementiert sind. Diese Register müssen noch irgendwie identifiziert werden. In diesem Fall wäre eine 4-Bit-Adresse erforderlich, um einzelne Register zu unterscheiden. In einer RISC-Architektur würde die 4-Bit-Adresse aller Register, an denen ein Befehl bearbeitet wurde, in den Befehlscode aufgenommen. Beispielsweise kann der ADD-Befehl den Wert eines Quellregisters in ein Zielregister einfügen. Dieser Befehl würde 4 Bits zum Identifizieren des Quellregisters und weitere 4 Bits zum Identifizieren des Zielregisters enthalten. Die Dokumentation bezieht sich möglicherweise auf diese Register mit der "Nummer" 0 bis 15, aber das ist wirklich die Adresse, an der sich die Register in einem speziellen kleinen Speicher der CPU befinden.

Darüber hinaus können diese Register, selbst wenn ein Prozessor spezielle dedizierte Register hat, in den allgemeinen Datenadressraum abgebildet werden. Verweise auf diese Adressen werden abgefangen und auf die internen Register verwiesen.

Es gibt viele Schemata, aber wenn Sie mehr als ein Register haben, müssen diese Register irgendwie voneinander unterschieden werden und innerhalb der Hardware eine "Adresse" haben, unabhängig davon, ob dies in der Dokumentation oder so genannt wird nicht.


Ah, da ist also das Problem. Ich habe den Hauptspeicher / RAM immer ausschließlich mit Speicheradressen verknüpft . Ich hätte nie gedacht, Speicheradressen mit irgendetwas anderem zu verknüpfen. Danke, dass du das geklärt hast!
Chevestong

Auch jetzt bin ich neugierig; Welche Komponente ist für das Auffinden und Zugreifen auf diese Registeradressen verantwortlich?
Chevestong

1
Wenn es sich um dedizierte Register handelt, gibt es Hardware, um ein Register auszuwählen. Da es so wenige Register gibt, kann mehr Hardware verwendet werden, um die Adressbits zu decodieren und zu verarbeiten, die Sie in einem normalen großen Speicher verwenden könnten. Dies kann die Decodierung beschleunigen, mehrere Ports zulassen usw. Normalerweise kann jedes Register einen ALU-Eingang ansteuern und den ALU-Ausgang speichern. In einigen Architekturen (dsPIC ist ein Beispiel) können drei separate Register diese Dinge separat in derselben Anweisung ausführen.
Olin Lathrop

8

Die Quelle der Verwirrung ist, dass es (im Allgemeinen) zwei Arten von Dingen gibt, die als "Register" bezeichnet werden können.

Das erste ist wahrscheinlich das, mit dem Sie vertraut sind: In ARM sind es Register R0, R1, R2, ... R12, SP, LR, PCund in x86 eax, ebx, ecx, edx, ebpund so weiter. Diese können auch als " Kernregister " oder " Prozessorregister " bezeichnet werden. Sie haben keine Adressen im Systemspeicher und können nur über bestimmte Anweisungen aufgerufen werden.

Das andere sind die Register, die verschiedene Hardwareblöcke (Peripheriegeräte) in der CPU selbst oder außerhalb der CPU steuern können. Auf LPC1768 und vielen anderen eingebetteten Prozessoren sind sie normalerweise speicherabgebildet, und deshalb haben sie Adressen. Zum Beispiel befindet sich der UART0-Block unter der Adresse 0x4000C000 und dort müssen Sie lesen oder schreiben, um mit ihm zu kommunizieren. Zur Unterscheidung von den Kernregistern können sie als " Peripherieregister " oder " Hardwareregister " bezeichnet werden.

Auf einigen Low-End-8-Bit-Mikrocontrollern wie 8051 oder PIC gibt es möglicherweise überhaupt keine Kernregister außer vielleicht einem Akkumulator, und alle anderen Register werden in verschiedene Speicherbereiche wie "internes RAM" (zur temporären Speicherung / Berechnung) oder abgebildet Speicher "Special Function Registers" (SFR) für die Steuer- und Peripherieregister. In ihnen haben "Register" fast immer eine Adresse.

Größere ARMs haben auch Coprozessorregister , mit denen verschiedene Kernfunktionen (z. B. MMU oder Cache) mit Anweisungen wie MRCoder gesteuert werden können MCR. Diese Register sind den Kernregistern insofern ähnlich, als sie keine Speicheradresse, sondern nur eine Nummer haben.

Unter x86 können Sie auch über E / A- Ports verfügen , auf die über Anweisungen zugegriffen werden kann inund outmit denen einige Hardwareblöcke gesteuert werden können. Diese haben eine ähnliche Funktion wie die Peripherieregister, werden jedoch normalerweise nicht als solche bezeichnet.


Sind die Prozessorregister in irgendeiner Weise zugänglich?
Chevestong

1
@ ProSteve037: natürlich, sonst hätte es keinen Sinn, sie zu haben :) Normalerweise funktionieren die meisten Anweisungen tatsächlich mit Prozessorregistern. ZB auf ARM: MOV, LDR, STR, ADD, SUB und so weiter.
Igor Skochinsky

1
@ ProSteve037 In einem gewissen Sinne Prozessorregister zu tun , eine Art Adresse haben, aber es ist in den verwendeten register fielddes Opcodes (das Maschinencode - Befehlswort), und können nicht verwechselt werden mit Speicheradressen (ihre Positionen in dem Opcode - Format unterscheiden und die Felder sind unterschiedlich groß).
luser droog

3

Sie haben Recht, dass sich einige Register nicht im Hauptspeicher befinden, sondern im Mikroprozessor selbst, und dass diese Register bestimmten Speicherplätzen zugeordnet sind.

Der LPC1768-Mikrocontroller verfügt nur über 64 KB RAM (was Sie unter Hauptspeicher verstehen), jedoch über einen 32-Bit-Adressbus und 4 GB Gesamtadressraum. Der Rest dieses Adressraums enthält den Flash-Speicher, in dem Ihr Programm gespeichert ist, und die Register für alle Peripheriegeräte (z. B. die Ausgangs-Pin-Zustände oder den ADC).

Wenn Sie versuchen, auf einen Speicherplatz zuzugreifen, erkennt die Logik im Mikrocontroller in der Regel, wo sich die Speicheradresse physisch befindet, und betreibt Steuerleitungen, damit die Daten dort ankommen, wo sie beabsichtigt waren, unabhängig davon, ob sie sich im RAM befinden. A. GPIO-Port oder ein Peripheriesteuerregister.

Dies vereinfacht das Schreiben von Software, da Sie sich nicht zu viele Gedanken darüber machen müssen, wo sich die Register physisch befinden, und das Kompilieren von übergeordneten Sprachen (wie C) erheblich vereinfacht.

Im speziellen Fall des LPC1768 sehen wir im Datenblatt ( http://www.nxp.com/documents/data_sheet/LPC1769_68_67_66_65_64_63.pdf ) die Adresskarte auf Seite 20 (Abbildung 4), in der alle aufgeführt sind Peripheriegeräte werden im Speicher zugeordnet.

Natürlich enthält der Prozessor auch eine Handvoll interner Register, die nicht speicherabgebildet sind. Auf diese kann viel schneller zugegriffen werden als auf alles andere im Adressraum, da die Speicherverwaltungslogik im Vergleich zum Kern langsam ist und als temporärer Speicher verwendet wird während des Betriebs. Ein Teil der Aufgabe eines Compilers besteht darin, Daten in Registern zu speichern und für Sie aus dem / in den Speicher zu verschieben.


2

Wie andere gesagt haben, hängt es von der Mikrocontroller-Familie ab. Und es kommt darauf an, was Sie unter Registrierung verstehen.

Der msp430 verfügt beispielsweise über zwei Sätze von "Registern". Die erste ist die RISC-Registerdatei mit 16 16-Bit-Registern. Dazu gehören die Register Programmzähler, Stapelzeiger, Status und Konstanter Generator sowie 12 allgemein verwendete Register. Dies sind Register in der traditionellen Architektur, in der das Wort verwendet wird.

Datei registrieren

Der zweite Registersatz ist alles andere. Ports, Peripheriegeräte, Interrupts usw. Diese sind Teil der einzelnen Speicherdatei und teilen sich den Speicherplatz mit dem allgemein verwendeten RAM und Flash (Code Space).

Speicherkarte

Zum Beispiel hat der msp430g2231 ein Port 1-Ausgangsregister an der Speicheradresse 0x21.

Besonderheiten

Sie können mit dem Registernamen p1out auf das Register zugreifen, dies ist jedoch nur ein Zeiger auf die 8-Bit-Speicheradresse 0x21. Am wichtigsten ist, dass der Compiler das so sieht. Die Header-Datei, in diesem Fall msp430g2231.h, definiert "p1out" als 0x0021. Abgesehen von der RISC-Registerdatei bedeutet die übliche Verwendung von Register lediglich eine Speicheradresse für eine x-spezifische Option. Was Sie als Register p1out sehen, ist nur die Art und Weise, wie eine höhere Sprache das Programmieren erleichtert, anstatt Speicherkarten zu speichern.

Wenn Sie einen Zeiger auf die Speicheradresse 0x27f verwenden, lesen Sie stattdessen aus dem RAM. Zeiger auf die Speicheradresse 0xffdf, und Sie würden stattdessen Ihren kompilierten Code lesen. Alles, was ein Register ist, ist eine Speicheradresse für eine spezielle Funktion.


2

Als Oberbegriff bedeutet "registrieren" nur einen Ort, an dem Sie Informationen speichern ("registrieren") können, nicht mehr.

Die meisten Architekturen reservieren das Termregister für Positionen innerhalb der CPU, die durch Bits in einem Befehl identifiziert werden und auf die häufig viel schneller zugegriffen werden kann als der allgemeine Massenspeicher ("RAM"). (Und oft kann in einem Ausführungszyklus parallel auf 2 oder 3 Register zugegriffen werden.)

In der Microchip PIC-Dokumentation werden jedoch alle adressierbaren Stellen als Register bezeichnet, auch einschließlich RAM. Wenn Ihr Professor diese Verwendung des Begriffs kopiert, sollte er Sie IMO darüber informieren, dass der Begriff "Register" heutzutage nicht mehr so ​​verwendet wird. (Wie ich hoffe, dass ich es in meinen PIC-Assembler-Klassen getan habe.)


1
Nicht nur Mikrochip - sehen Sie sich den 8051 für ein viel früheres Beispiel an, und selbst das könnte Vorgänger haben.
Chris Stratton

@ChrisStratton: Ich bin mir ziemlich sicher, dass der PIC von General Instruments (auf dem der 16C54 von Microchip basiert) älter ist als der 8051, und er könnte sogar älter sein als der Vorgänger 8048.
Supercat

Ja, es sieht so aus, als ob es dem 8048 um etwa ein Jahr vorausgeht.
Chris Stratton

1

Register haben Adressen, obwohl sie sich im Allgemeinen nicht im Speicher befinden.

Denken Sie eine Minute darüber nach: Eine Adresse bezeichnet einen Ort in einem Raum, an dem der Speicher nur eine Instanz eines Raums ist. E / A hat oft einen eigenen Adressraum. In einigen Mikrocontroller-Architekturen sind Codespeicher und Datenspeicher separate Räume.

Und so können Register auch ihren eigenen Speicherplatz haben: Manchmal haben FP- und Integer-Register (und beim 68000, glaube ich, Adressregister) jeweils einen eigenen Speicherplatz.

Eine Frage ist: Wie können wir feststellen, ob sich Adresse 1 auf Byte 1 im Speicher, E / A-Port 1 oder Register 1 bezieht? Normalerweise aus dem Kontext: in einem IN- oder OUT-Befehl offensichtlich ein Port. In einem Register-zu-Register-Befehl ist es eine Registeradresse. In einem Ladebefehl gibt es eine (große) Speicheradresse und eine (kleine) Registeradresse und so weiter.

In einem ARM-Kern ist eine Speicheradresse normalerweise eine 32-Bit-Zahl. Eine Registeradresse ist eine 5-Bit-Nummer.


Viele Prozessoren haben einige Register, auf die "nach Nummer" zugegriffen wird, aber auch einige Register, auf die nur mit speziellen Anweisungen zugegriffen werden kann. Ich weiß nicht, wie man das "S" -Register des 6502 sinnvoll als beispielsweise mit einer Adresse beschreiben könnte. Abgesehen von Push / Pop / Call / Return sind die einzigen Anweisungen, die darauf zugreifen, TSX / TXS (Übertragung von S nach X oder X nach S). Bit 4 des Opcodes wählt zwischen TSX und TAX oder zwischen TXS und TXA, aber es ist nicht sinnvoll, die Opcodes als "X in Register #b übertragen" zu betrachten, da keine anderen Anweisungen, die sich auf A beziehen, reg # 0 und sind S als reg # 1.
Supercat

1

Wenn man eine Adresse als einen Satz von kBits definiert, die verwendet werden können, um ein Element aus einem Satz von bis zu 2^kElementen auszuwählen , dann ist es üblich, dass viele Register in vielen Prozessoren und Controllern Adressen haben, aber auch, dass Controller einige haben Register, die von Schaltkreisen abgetastet werden, die bestimmte Bedingungen erkennen und über keine Adresse identifizierbar sind. Es ist jedoch wichtig zu beachten, dass in vielen Fällen die Adressdrähte, die CPU-Register steuern, keine Beziehung zu den Adressdrähten haben, die mit größeren Speichersystemen verbunden sind. Daher existieren Register- "Adressen" häufig in einem völlig getrennten "Universum" von Speicheradressen.

Auf den meisten Prozessoren werden Register- "Adressen" immer entweder intern von der Prozessorlogik außerhalb der Steuerung des Programmiergeräts generiert oder von bestimmten Bits in jedem Befehl abgerufen. Die einzige Möglichkeit, durch Ändern des Codes unter Software zu beeinflussen, welches Register von einem bestimmten Befehl abgerufen werden soll, besteht darin, die entsprechenden Bits innerhalb dieses Befehls zu patchen. Auf dem General Instruments PIC, dessen Design in Form des Microchip PIC weiterlebt, würde Hardware, wenn ein Opcode alle Nullen für eine Adresse spezifiziert, den Inhalt eines anderen Registers ersetzen, das sich an Adresse 3 befindet. Dies ermöglicht es dem Code, Berechnungen zur Auswahl zu verwenden eine Adresse.

Das vielleicht wichtigste Verständnis von Adressen ist, dass ein System unterschiedliche Adressräume haben kann, die effektiv in verschiedenen Universen existieren. Auf dem 8051 gibt es zum Beispiel, je nachdem wie man zählt, mindestens vier verschiedene Adressräume und möglicherweise bis zu sechs; vier von ihnen sind völlig unabhängig (die Anweisungen:

mov a,80h  ; Direct address space
mov a,@r0  ; Assume R0 = 80h
movc a,@a+dptr ; Assume A = 0 and DPTR = 80h
movx a,@dptr ; Assume DPTR = 80h

Alle rufen Daten von "Adresse 80h" ab, lesen jedoch vier nicht miteinander verbundene Dinge: eine Adresse im E / A-Bereich (das Datenregister von Port 0, glaube ich), das interne Datenregister 80h, den Codespeicher unter der Adresse 0x0080 und den externen Datenspeicher unter der Adresse 0x0080 . In vielen Systemen hätten diese Dinge tatsächlich keinerlei Beziehung zueinander. Die Tatsache, dass ein Register auf eine bestimmte Adresse in einem Universum reagiert, sagt wenig oder gar nichts darüber aus, ob es auf diese oder eine andere Adresse in einem anderen Universum reagiert.


0

RISC bedeutet "Reduced Instruction Set Computer". Ein Teil der Art und Weise, wie Sie die Größe des Befehlssatzes reduzieren, besteht darin, nur eine Art von Datenort zu haben, der Register, RAM oder E / A enthält.

Als die Leute diese Ideen ernst nahmen, waren die beiden erwarteten Vorteile von RISC-Designs, dass Sie den Prozessor viel schneller machen könnten, wenn Sie ihn viel einfacher machen würden, und dass Sie Ihren Programmcode optimieren könnten, wenn Sie eine Speicheradresse für irgendetwas verwenden könnten. Anstatt alles zum Laden und Entladen zu zwingen, wird das ALU-Register für Arithmetik, das Speicheradressregister für Speicheradressierung usw. durchlaufen.

Zwei Überreste dieser Denkweise sind: (1) Wir haben Prozessoren, die vortäuschen, dass alle Register gleich sind, indem sie Register in den Speicherraum abbilden, und (2) wir haben Professoren, die vortäuschen, dass alle Register gleich sind, indem sie Registerspeicherorte aufrufen.

Sei tolerant. Es war ein wichtiges Forschungsgebiet für Doktoranden, das einen signifikanten und dauerhaften Einfluss auf die Gestaltung einiger Prozessoren hatte.


Nein. RISC bedeutet nicht, dass die Unterscheidung zwischen der Registerdatei und dem Hauptspeicher verloren geht, da dies die Befehlsdecodierung erschweren würde, was das Gegenteil von RISC-Zielen ist. Bei RISC geht es klassisch um einfache Anweisungen, die schnell das tun, was sie tun, und es dem Programmierer / Compiler überlassen, sie miteinander zu verbinden. Daher haben Register- und Speicheradressversionen von Anweisungen in einer klassischen RISC-Architektur unterschiedliche Codierungen. Und der Speicherzugriff erfolgt normalerweise auf eine Adresse, die von einem Register mit einer begrenzten sofortigen Verschiebung bereitgestellt wird, da nur so viele Bits im Befehlswort verfügbar sind.
Chris Stratton

Das hast du bis auf den ersten Satz richtig verstanden. Der Verlust der Unterscheidung zwischen Registerdatei und Hauptspeicher ist eine der Möglichkeiten der klassischen RISC-vereinfachten Befehlsdecodierung, die eines der Ziele von RISC ist. In der Praxis greifen praktische Überlegungen ein. Siehe zum Beispiel The Ultimate RISC
david

Ein RISC-Befehlswort codiert ganz explizit eine Registernummer oder eine Speicherreferenz, was eine Unterscheidung im Vergleich zu der hier in Betracht gezogenen Situation darstellt, in der ein Register genauso wie eine Speicheradresse codiert wird.
Chris Stratton

Bitte lesen Sie zuerst die Referenz. Vor dem Posten.
David

Der Hinweis bezieht sich auf eine seltsame akademische Architektur, nicht auf klassische Risc-Designs, wie sie tatsächlich gebaut wurden.
Chris Stratton

0

Der 8051, wenn ich mich recht erinnere, könnte über Speicheradressen auf die Register zugreifen, aber dies ist nicht bei allen Prozessoren der Fall. Die ARM-Prozessoren haben dazu keine Möglichkeit, auf die Allzweckregister r0-r15 kann auf dem Speicherbus nicht zugegriffen werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.