Dr. Sommer schrieb:
> J. V. schrieb:
>> Zumindest im Memory Dump sieht man sie
>> dort auch. Der Compiler legt sie aber bei 0x0800.0000 an den Codeanfang.
> Das ist schon richtig. Bei (fast?) allen Cortex-M Controllern ist der
> Flash bei 0x08000000 zu finden. Manche wie der STM32 können den
> zusätzlich an die 0-Adresse spiegeln je nach Einstellung der BOOT*-Pins
> und des SYSCFG Registers. An 0x08000000 zu flashen/lesen ist aber der
> sichere Weg, weil der Flash dort immer zu finden ist.
>
Jo. Der wichtige Teil zum Verständnis ist hier, dass der Cortex beim
Booten seinen initialen SP und PC (Vektoren 0 und 1) IMMER von Adressen
0 bzw. 4 holt, das ist vom Cortex Kern so vorgegeben und kann nicht von
Chipherstellern geändert werden!
Was ein Chip aber machen kann, ist den Adressbereich 0 umzuspiegeln, wie
Dr. Sommer schrieb. Auf STM32F4xxx Prozessoren kann z.B. 0 == 0x800_0000
(internes Flash) oder 0 == 0x1fff_0000 (interner Bootloader) oder sogar
0 == 0x2000_0000 (internes SRAM) sein. Damit kann das Booten von
variablen Speicherbereichen erfolgen.
Dass "fast Alle" Cortex Ms 0x800_0000 als physikalische Flashadresse
nutzen, scheint mir aber etwas aus dem Fenster gelehnt. Es sind nicht
Wenige, aber z.B. der NXP Kinetis FRDM64K (M4) hat an 0x800_0000 einen
Alias für den FlexBus (externer Speicher) und den Flash hardcodiert auf
0, und der Atmel SAMV71 (Cortex M7) addressiert das interne Flash über
0x40_0000. Die NXP LPC18xx (M3) Serie macht es noch Anders, weil es dort
gar kein internes Flash gibt, nur einen internen Bootloader, der den
Adressbereich 0 nach dem Booten vom Bootloader auf externe Flashes (z.B.
SPIFI auf Adresse 0x1400_0000) abbilden kann. Also da toben sich die ARM
Licensees schon aus! ;-)