首页 > 解决方案 > 为什么需要内存别名?

问题描述

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

在此处输入图像描述

标签: armstm32cpu-architectureprocessorstm32f4

解决方案


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

因此,并非所有芯片都以这种方式通过基于带引脚或非易失性寄存器位等的镜像来解决问题。

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

0x20001000
0x08000031
...

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

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

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


推荐阅读