In vielen Tutorials zu ARM-CPU-Registern wird das Befehlsregister so erwähnt: "Register R15 im ARM-Mikrocontroller ist der Programmzähler und zeigt auf den nächsten Befehl, der aus dem Speicher abgerufen werden soll."
Aber ich habe auch gelesen, dass es in der Harvard-Architektur einen Befehlsspeicher und einen Datenspeicher gibt. Was ich davon verstanden oder missverstanden habe, war, dass die Befehlscodes im Flash-ROM gespeichert sind und die Daten im RAM gespeichert sind.
Aber wenn ich mehr darüber lese, habe ich den Eindruck, dass die Anweisungen auch aus dem RAM statt aus dem ROM geholt werden.
Hat ROM außer dem Speichern des Maschinencodes nichts mit der gesamten Operation zu tun?
Bearbeiten: Die Frage setzt kein Betriebssystem voraus, nur einen eigenständigen ARM-Mikrocontroller.
ARM-Kerne sind eigentlich das, was man modifizierte Harvard-Architektur nennt . In diesem Fall befinden sich ROM und RAM im selben Adressraum, sodass ein ARM-Prozessor Code aus beiden ausführen oder auf beide als Daten zugreifen kann. In der modifizierten Harvard-Architektur ist der Verarbeitungskern direkt mit zwei separaten Befehls- und Datencaches verbunden. Dies ermöglicht eine hohe Leistung, da gleichzeitig auf Befehle und Daten zugegriffen werden kann. Auf hoher Ebene lässt der kombinierte Adressraum das gesamte System wie eine Von-Neumann-Architektur wirken.
Die Struktur des Adressraums wird durch die physikalischen Verbindungen zwischen dem Verarbeitungskern selbst und allen Speichern und Peripheriegeräten bestimmt. Zum größten Teil wird das Layout des Adressraums mit bestimmten Bereichen festgelegt, die speicherabgebildeten Peripheriegeräten, Masken-ROM, Flash, RAM usw. entsprechen. Es kann jedoch eine gewisse Möglichkeit geben, bestimmte Abschnitte des Adressraums neu zuzuordnen oder Peripheriegeräte zu konfigurieren oder externe Speicher, die in bestimmten Bereichen des Adressraums sitzen.
Die ARM-Architektur ist eine von Neumann-Architektur , keine Harvard-Architektur. Das bedeutet, dass sowohl für Anweisungen als auch für Daten ein einheitlicher Adressraum verwendet wird. Ob eine bestimmte Adresse RAM oder ROM enthält, hängt vom Systemdesigner ab. Anweisungen können von beiden abgerufen werden.
ARM-Mikrocontroller, die neueren Cortex-M-Controller, haben Modi, um entweder vom RAM oder vom ROM aus zu arbeiten. Überprüfen Sie beispielsweise die BOOT0- und BOOT1-Bits im STM32-Referenzhandbuch . Dies konfiguriert so ziemlich die Startadresse der Ausführung, indem die tatsächlichen Speicheradressen tatsächlich in ein festes Speicheradresssegment ( 0x0000 0000
to 0x0007 FFFF
) umgewandelt werden.
Der Cortex-M-Kern hat vier Arten von "Speicher": RAM, ROM (Flash und Systemspeicher), FSMC und Peripherie. RAM ist, nun ja, internes statisches RAM. ROM ist internes Flash oder der nicht beschreibbare eingebettete Bootloader. FSMC ermöglicht die Verwendung von externem Speicher (sowohl RAM als auch ROM, je nach externer Hardware). Peripherer Speicher sind spezifische Register, die peripheren Funktionen wie UARTs, ADCs usw. zugeordnet werden. Die Hardware für den Zugriff darauf ist separat, um die Geschwindigkeit zu erhöhen (Harvard-Stil), insbesondere weil Flash langsamer als SRAM ist.
All diese sind jedoch in einem einzigen Adressraum (von Neumann-Stil) vereint, was den Zugriff auf sie aus der Sicht eines Programmierers vereinfacht. Sie unterscheiden sich nur durch ihre Adressbereiche (implementierungsabhängig). Die BOOT-Pins ermöglichen die Konfiguration zwischen drei Startadressen: eine im RAM, eine im ROM (Nur-Lese-Bootloader) und eine weitere im ROM (Flash). Dadurch ist es möglich, Ihre Frage mit "beides" zu beantworten . Ich habe es nie versucht, aber es scheint möglich zu sein, von einem Segment zum anderen zu springen.
Denken Sie jedoch daran, dass diese Erinnerungen immer noch nicht gleichermaßen behandelt werden können. Sie können nicht beliebig in das ROM schreiben. Es ist Flash, wodurch sie wiederbeschreibbar sind, aber Sie müssen ein spezielles Verfahren verwenden, um darauf zu schreiben (es wird normalerweise als "Flash als EEPROM verwenden" zum Speichern von Programmdaten oder als "Bootloader" bezeichnet, wenn Programmcode gespeichert wird, normalerweise beim Start).
Wenn man vom Flash (ROM) ausführt, werden die Anweisungen direkt vom ROM abgerufen. Normalerweise gibt es einen Startcode , der Daten vom ROM in den RAM kopiert (initialisierte globale Variablen, normalerweise im Datenabschnitt gespeichert ) . Das Referenzhandbuch enthält diese Informationen ebenfalls
Beim Booten vom SRAM müssen Sie im Initialisierungscode der Anwendung die Vektortabelle im SRAM verschieben, indem Sie die NVIC-Ausnahmetabelle und das Offset-Register verwenden.
was normalerweise durch den Startup-Code durchgeführt wird.
Ungeachtet der Architektur hält R15 die Programmzähleradresse. Die nächste (hoffentlich gültige) Anweisung wird von dieser (hoffentlich gültigen) Adresse geholt. Beachten Sie, dass beides problematisch sein kann.
1) ungültige Operationscodes. 2) Speicher jeglicher Art dürfen für die Adresse nicht installiert werden.
Ja, es ist wünschenswert, dass für Daten reservierte Bereiche nicht als Programmcode ausgeführt werden. Der Adressraum, von dem wir sprechen, ist begrenzt (es ist kein Adressraum mit Fenstern, wie er in PCs, Midrange, Mainframe usw. verwendet wird) und kann RAM, ROM, Peripherieports enthalten.
Es sollte sicherlich möglich sein, Anweisungen aus dem RAM abzurufen, wenn wir RAM für die Adressen haben, die wir für gültig für Anweisungen halten, sodass Code geladen werden kann, wenn wir dies wünschen, im Overlay-Stil. Auch ohne Betriebssystem.
phuclv