Die meisten ARM Cortex-M-Kern-basierten MCUs haben eine Harvard-Architektur (mit Ausnahme von Cortex-M0 und M0+).
Was ich nicht verstehe, ist, warum wir nur einen Speicheradressraum sehen. Zum Beispiel sehen wir in tge STM32F4 nur einen einheitlichen Speicheradressraum:
Wenn ARM Cortex-M-basierte MCUs (in den meisten Fällen) über eine Harvard-Architektur verfügen, warum sehen wir dann nicht zwei separate Speicheradressräume – einen für Daten und einen für Codeanweisungen – anstelle von einem?
Wenn Sie zufällig einen STM32F4-Chip auswählen und sich das Datenblatt ansehen , sehen wir in Abschnitt 2.2 ein Blockdiagramm des Chips.
Wir sehen, dass die CPU drei (!) Busse hat, die mit I-BUS, D-BUS und S-BUS bezeichnet sind. Alle gehen zur "AHB-Bus-Matrix" und der D-BUS geht auch zu einem "CCM-Daten-RAM".
Ich habe nach "Cortex-M4 S-Bus" gesucht und diese Seite von ARM gefunden, die die Busse beschreibt , die den Unterschied zwischen den Bussen beschreibt: Für Adressen kleiner als 0x20000000 wird der D-Bus für den Datenzugriff und der I-Bus verwendet für Befehlszugriffe. Für Adressen ab 0x20000000 wird der S-Bus sowohl für Befehls- als auch für Datenzugriffe verwendet.
Der Prozessor fungiert also unterhalb von 0x20000000 als Harvard-Architektur und darüber von Neumann.
Wenn wir jedoch zurück zum Chipdatenblatt gehen, sehen wir in Abschnitt 2.2.7 (nach dem Seitenumbruch) ein Diagramm der AHB-Busmatrix, die die verschiedenen Busse mit verschiedenen Speicherkomponenten auf dem Chip verbindet. Wir sehen, dass der I-Bus und der D-Bus Zugriff auf dieselben Speicherkomponenten haben: Flash-Speicher (über ACCEL), SRAM1 und FSMC Static MemCtl. Indem wir also eine Harvard-Architektur nehmen und dann die I- und D-Busse mit demselben Speicher verbinden, verwandeln wir sie in eine sogenannte von-Neumann-Architektur. Wir können davon ausgehen, dass jeder Speicherbereich auf allen Bussen, auf die zugegriffen werden kann, dieselbe Adresse hat, da das Datenblatt sonst etwas anderes sagen würde. Es ist praktisch, dass jeder Speicher nur eine Adresse hat. Es wäre möglich, den Prozessor so anzuschließen, dass sich die Anweisung bei 0x00000000 von den Daten bei 0x00000000 unterscheidet.aber die Designer des STM32F405xx haben das nicht getan .
Es gibt einen kleinen Unterschied: Der "Data CCM"-Speicher kann nicht für Anweisungen verwendet werden, da er nur am D-Bus angeschlossen ist. Ihre Speicherkarte zeigt "data CCM" nicht unter 0x20000000 an, also schätze ich, dass dieser Unterschied auf Ihrem Chip nicht existiert. Es kann jedoch andere Unterschiede zwischen dem I-Bus und dem D-Bus geben.
Die ARM-Cortex-Teile werden als „Harvard-Architektur“ beworben, aber sie sind wirklich modifizierte Harvard-Architektur .
Insbesondere verwenden sie separate Daten- und Befehls-Caches, und (wenn ich mich richtig erinnere) werden einige Speicherbereiche nicht als Befehlsspeicher verwendet. Aber der gesamte Speicherplatz ist als Daten verfügbar, auch wenn zumindest ein Teil davon als Anweisungen verfügbar ist.
Die meisten Maschinen, die sich heute "Harvard-Architektur" nennen, haben keine vollständig getrennten Speicherbereiche und sind daher eine Art modifiziertes Harvard.
Viele Programme müssen in der Lage sein, hartcodierte Konstanten in ihnen zu verwenden. Um zum Beispiel eine Operation wie „x=12345“ (in fast jeder gebräuchlichen Sprache) durchzuführen, braucht man ein Mittel, um die Zahl 12345 in ein Register zu bekommen. Es gibt mindestens vier Ansätze, mit denen dies erreicht werden kann:
Einige Architekturen wie ältere Versionen des PIC verfügen über Befehle, die größer sind als der größte unmittelbare Wert, den man möglicherweise laden möchte, und ermöglichen daher das Einfügen beliebiger Werte als Teil des Befehls, ohne dass Mittel erforderlich sind, um den Coderaum als Daten zu behandeln.
Einige Architekturen wie MIPS und einige neuere ARM-Varianten verfügen über Anweisungen, die die Hälfte eines Registers laden können und die zusammen mit einem folgenden "ODER sofort" verwendet werden können, um die andere Hälfte zu laden, wiederum ohne Mittel zu benötigen, um den Coderaum als Daten zu behandeln .
Einige Architekturen wie ältere Versionen von ARM enthalten eine Anweisung zum Abrufen eines beliebigen Werts von einer Adresse, die sich in der Nähe des aktuell ausgeführten Codes befindet. Während der ARM über Möglichkeiten verfügt, einige Zahlen als unmittelbare Konstanten auszudrücken, wird erwartet, dass Code, der größere Werte verwenden muss, die erforderlichen Zahlen im Codebereich in der Nähe des Codes platziert hat, der sie benötigt, damit sie mit dem Wert „Laden in der Nähe“ abgerufen werden können " Anweisung. Dieser Ansatz erfordert die Fähigkeit, Code und Datenraum austauschbar zu behandeln.
Es wäre für eine Architektur möglich, Konstanten zu verwenden, die in einem schreibgeschützten oder vorinitialisierten Bereich des Datenraums gespeichert sind. Dieser Ansatz würde nicht die Fähigkeit erfordern, Code- und Datenraum austauschbar zu behandeln, aber wenn er auf einen Mikrocontroller angewendet wird, könnte es erforderlich sein, eine fest verdrahtete Partition zwischen Code- und Datenspeicherung (z. B. 12 KB Code und 4 KB Daten) zu haben. Ich kenne keine aktuellen Designs, die einen solchen Ansatz verwenden, wäre aber nicht überrascht, wenn einige frühe Computer dies tun würden. Wenn ein Anweisungssatz eine Anweisung zum Laden eines Werts von einer bestimmten der ersten 1024 Stellen enthielt, könnten ein Compiler und Linker die Dinge so anordnen, dass, wenn zwei Kompilierungseinheiten beide den Wert 0x08675309 benötigen, dieser nur einmal darin gespeichert werden müsste Tisch.unterschiedliche Konstanten, würde aber erfordern, dass Konstanten, die von unterschiedlichen Funktionen verwendet werden, in jeder Funktion, in der sie verwendet werden, dupliziert werden.
Während die meisten dieser Ansätze mit nicht verwandten Code- und Datenadressräumen gut funktionieren würden, wurde der ARM-Ansatz Nr. 3 entwickelt, der die Fähigkeit erfordert, beliebige Konstanten an Adressen zu platzieren und zu laden, die sich unter den Adressen befinden, an denen Code platziert und ausgeführt wird.
Benutzer253751
Benutzer253751
gvg
Peter Kordes
Navin