如何解决为什么需要内存别名?
我对ST Microelectronics的这种体系结构设计感到困惑。 以STM32F407VG为例。程序在地址0x08000000的Flash中加载。该地址映射到地址0x00000000,因为复位后处理器首先看向0x00000000。 为什么不只将Flash的第一个地址设为0x00000000。内存别名的优点是什么?
解决方法
处理器内核正在将地址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,以使您拥有运行时可修改的向量表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。