覆盖ARM Cortex-M3

时间:2017-06-22 21:10:41

标签: arm embedded microcontroller cortex-m3 mpu

根据ARM的说法,Cortex-M3的默认行为是阻止某些内存区域的执行。 这里的信息: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/CIHDHAEF.html

根据以上信息页面:“可选的MPU可以覆盖默认的内存访问行为”。 这一切都很好,因为我们希望从特定于实现的0xF0000000区域执行代码,该区域默认设置了XN“Execute Never”标志。

我们能够对MPU进行编程以对存储区域施加额外的限制,因此MPU工作正常。但是如果我们将MPU设置为允许在0xF0000000区域中执行,那么当我们尝试在0xF0000000处执行时,CPU仍会进入异常。

有人知道Cortex-M3 MPU是否应该能够解除默认限制,正如ARM页面建议的那样?

1 个答案:

答案 0 :(得分:1)

虽然在ARM文档中可能没有明确说明,但似乎默认的MPU配置已经是限制性最小的,以便具有MPU的设备与默认情况下的设备行为完全相同。所以你不能删除这些限制是有道理的。

Memory access behaviour表将0xE0100000-0xFFFFFFFF区域显示为“ Device ”区域,而不是内存区域。 设备正常区域的处理器行为在Memory regions, types and attributes中描述。对具有设备属性保留访问顺序的区域的要求将要求处理器在执行代码时以不同方式处理此类内存,从而使处理器更加复杂。从这种记忆中执行效率也会降低。

基本上,如果意图是支持从内存执行,那么它必须映射到内存区域而不是设备区域。

请注意,在Cortex-R4 documentation中明确规定了限制:

  

无法从具有Device或强排序内存类型属性的区域执行指令。处理器将这些区域视为具有XN权限。

然而,我无法为M3找到类似的明确陈述。