为什么需要内存别名?

问题描述

我对ST Microelectronics的这种体系结构设计感到困惑。 以STM32F407VG为例。程序在地址0x08000000的Flash中加载。该地址映射到地址0x00000000,因为复位后处理器首先看向0x00000000。 为什么不只将Flash的第一个地址设为0x00000000。内存别名的优点是什么?

enter image description here

解决方法

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

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

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

0x20001000
0x08000031
...

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

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

并非每个人都在芯片上编写了一个引导加载程序,其中一些没有理由多路复用该地址空间,并且不会。

,

关于old_timer的答案涵盖了很多,对于其他部分,例如基于Cortex M0的STM32F0范围,没有SCB->VTOR向量表偏移量寄存器,要解决此问题,您可以映射不同的区域(RAM或闪存)设置为0x00000000,以使您拥有运行时可修改的向量表。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...