为什么 Cortex-A 的复位处理程序位于 0x0 而 Cortex-M3 则不然

问题描述 投票:0回答:3

Cortex-M3 的初始堆栈指针值位于 0x0,重置处理程序位于 0x4,原因是什么?这样做的设计理由是什么?

为什么 ARM 的人不能像 Cortex-A 那样将 0x0 留给复位处理程序,然后在复位处理程序内初始化 SP?

arm microcontroller cortex-m cortex-a
3个回答
7
投票

我认为这属于“这不是一个错误,这是一个功能”的旗帜。

ARM 架构 M(微控制器)配置文件具有与 A 和 R 配置文件完全不同的异常模型。 A 配置文件(与 R 配置文件一样)保留了与以前的 ARM 处理器的向后兼容性。 M-profile 被允许偏离这一点,因此被设计为更容易完全从 C/C++ 编程(没有 asm)。

因此向量条目包含地址而不是指令,一旦完成,为什么不以相同的方式设置 SP?它还会在异常输入时自动保存状态。


2
投票

unixsmurf 所说的一切...

传统的arm方法有点奇怪,典型的方法是地址列表,而不是指令表。所以这可能是一个因素。但他们创建了无数个中断,而不仅仅是一个(向量表的深度为 128/256,而不仅仅是少数),毫无疑问,您不想在调用 C 之前包装每个中断,因此向量表、更改/缺少模式,并为您保留寄存器,将这个包放在一起。您可以将 C 处理程序的地址放在表中,包括重置向量,要在那里获取重置向量,您需要在调用之前至少设置堆栈指针,因此您需要一个位置供用户指示堆栈指针的初始值。


0
投票

Cortex-M 和 Cortex-A 在启动和向量故事处理方面有不同的方法。

Cortex-M:根据设计,处理器应首先从地址 0 获取堆栈指针,并从地址 0x4 获取重置处理程序,作为重置后启动序列的一部分,然后任何传入中断其中断处理程序(在 cortex-m 中,中断是向量化的)任何中断都必须有自己的中断处理程序)必须从向量表条目中获取,一般来说,在常见情况下,堆栈指针和复位处理程序放置在向量表的 tp 上,其余中断处理程序按顺序放置在其之后,这里每个处理程序在向量表中的位置非常重要,因为这就是 cortex-m 哪个处理程序对应哪个中断信号的方式。 这种机制允许直接获取地址并正确执行处理程序的第一条指令以及重置处理程序的最大优点是最大限度地减少中断延迟的启动时间,以便上下文切换和启动的许多方面主要由硬件,这当然允许更具确定性的启动时间和中断延迟,因为我们避免处理此类事情的缓存,这非常适合实时应用程序,这就是为什么 ARM 希望拥有专用的实时处理器系列的原因之一时间申请,他们实际上在这里成功了。

Cortex-A:另一方面,从其用例定义来看,Cortex-A 并不是针对实时应用程序,而是针对高性能计算以及在其上运行完整的操作系统,因此他们保留了向量如何运行的标准方式表应该看起来像并且没有偏离标准,所以这里向量表由多个条目组成,就像在 cortex-m 中一样,但不同之处在于,在 cortex-a 中,每个向量表条目都是到相应异常模式的跳转指令处理程序,但在 cortex-m 中是异常处理程序地址本身,我认为在 cortex-A 中的原因之一是在跳转到实际处理程序之前允许更多的自由和空间来处理正确的模式切换,这比 cortex- 的情况复杂得多m 其中我们只有两种完全由硬件管理的处理程序/线程模式。

© www.soinside.com 2019 - 2024. All rights reserved.