Warum wird Speicher-Aliasing benötigt?
Ich bin verwirrt mit diesem Architekturdesign von ST Microelectronics. Nehmen Sie zum Beispiel STM32F407VG. Das Programm wird in Flash unter der Adresse 0x08000000 geladen. Diese Adresse wird der Adresse 0x00000000 zugeordnet, da der Prozessor nach dem Zurücksetzen zuerst 0x00000000 ansieht. Warum nicht einfach die erste Flash-Adresse auf 0x00000000 setzen? Was ist der Vorteil von Speicher-Aliasing?
Antworten
Der Prozessorkern sucht nach der Adresse 0x00000000 für den Stapelzeiger und nach 0x00000004 für den Rücksetzvektor (und weiter über andere Vektoren). Aus der Sicht der Kerne soll die Anwendung also antworten. Diese Produkte enthalten jedoch zusätzlich zu Ihrer später hinzugefügten Anwendung einen werkseitig programmierten Bootloader. Wie können Sie also zwei Programme mit einer Adresse booten? Eine Möglichkeit besteht darin, sie in diese Adresse zu spiegeln. Was ist, wenn Sie auch die Funktion hinzufügen möchten, den Prozessor von sram booten zu lassen, müssen Sie dies ebenfalls zuordnen.
Daher lösen nicht alle, außer einigen Chips, das Problem auf diese Weise, indem sie auf der Basis von Strap-Pins oder nichtflüchtigen Registerbits usw. spiegeln.
Die STM32-Teile ordnen nur einen Prozentsatz bei 0x00000000 zu. Sie möchten also unbedingt die Anwendung für 0x08000000 erstellen (oder eine andere Adresse wie 0x02000000 für eine kleine Teilmenge ihrer Teile, lesen Sie die Dokumente!). So sieht zum Beispiel die Vektortabelle aus:
0x20001000
0x08000031
...
Der Prozessorkern liest 0x00000004 und erhält den Wert 0x08000031, was bedeutet, dass die Ausführung von Anweisungen unter der Adresse 0x08000030 für den Rücksetzhandler gestartet wird. Und von dort läuft das Programm aus dem 0x08000000-Adressraum heraus, nicht aus 0x00000000.
Nicht jeder macht es so, aber einige tun es, nicht beschränkt auf ST (STM32).
Nicht jeder hat einen auf dem Chip programmierten Bootloader, und einige von ihnen haben keinen Grund, diesen Adressraum zu multiplexen, und werden dies auch nicht tun.
Zusammen mit der Antwort von old_timer, die viel abdeckt, gibt es für andere Teile wie den Cortex M0-basierten STM32F0-Bereich kein Versatzregister für Vektortabellen. SCB->VTORUm dies zu umgehen, können Sie verschiedene Bereiche (RAM oder Flash) auf 0x00000000 abbilden, um eine zu erhalten Laufzeitmodifizierbare Vektortabelle.