为什么需要内存别名?

Ηλε*_*κός 3 arm processor cpu-architecture stm32 stm32f4

我对 ST Microelectronics 的这种架构设计感到困惑。以STM32F407VG为例。程序加载到闪存中的地址 0x08000000。该地址映射到地址 0x00000000,因为复位后处理器首先查看 0x00000000。为什么不让闪存首地址为 0x00000000。内存别名的优点是什么?

在此处输入图片说明

old*_*mer 6

处理器内核正在查看堆栈指针的地址 0x00000000 和复位向量的地址 0x00000004(以及其他向量)。因此,从核心的角度来看,您希望应用程序回答。但是这些产品除了您稍后添加的应用程序之外,还包含一个工厂编程的引导加载程序,那么您如何使用一个地址引导两个程序呢?一种方法是将它们镜像到该地址。如果您还想添加让处理器从 sram 启动的功能,您还需要将其映射进去。

因此,除某些芯片外,并非所有芯片都通过基于带引脚或非易失性寄存器位等的镜像来解决此问题。

STM32 部件只会在 0x00000000 处映射一个百分比,所以你真的想为 0x08000000 构建应用程序(或者其他一些地址,如 0x02000000 用于它们的一小部分部件,阅读文档!)。例如,向量表如下所示:

0x20001000
0x08000031
...
Run Code Online (Sandbox Code Playgroud)

处理器内核读取 0x00000004 得到值 0x08000031,这意味着在地址 0x08000030 处开始执行复位处理程序的指令。从那里程序用完 0x08000000 地址空间而不是 0x00000000。

不是每个人都这样做,但有些人这样做,不仅限于 ST(STM32)。

不是每个人都有片上编程的引导加载程序,其中一些没有理由多路复用该地址空间,也不会。