4

我无法理解重新映射中断向量或引导块的概念。重映射向量表有什么用?它如何使用重映射和不重映射?有没有关于这方面好文章的链接?我用谷歌搜索了这个,但无法得到好的答案。将 RAM 映射到 0x0000 并将 0x0000 中存在的任何内容映射到其他地方有什么好处?如果从 0x0000 执行,执行速度会更快吗?

4

1 回答 1

7

这是一个简单的实用性问题。复位向量位于 0x0 *,当系统首次上电时,内核将开始从那里获取指令。因此,您必须在上电后立即获得一些可用的代码 - 它必须是某种 ROM,因为此时 RAM 将未初始化。现在,一旦您完成了初始引导过程并正确启动了您的应用程序,您就会遇到问题 - 您的异常向量和处理它们的代码都在 ROM 中!如果你想安装不同的中断处理程序怎么办?如果您想为热复位处理程序切换复位向量怎么办?通过使向量区域可重映射,应用程序可以自由地为安装了自己的向量和处理程序代码的 RAM 区域切换 ROM 引导固件。

当然,这可能并不总是必要的——例如,对于运行单个专用应用程序并自行处理上电的微控制器——但一旦您进入更复杂的独立引导加载程序和应用程序代码领域,它就变得更加重要。性能也是一个理论上的问题,至少——如果你有慢速闪存但快速 RAM,你可能会从将向量和中断处理程序复制到该 RAM 中受益——但我认为这在现代微机上远不是一个问题。

此外,如果应用程序希望能够在运行时更新引导闪存,那么它绝对需要一种将向量和处理程序放在其他地方的方法。否则,如果在闪存模块处于编程模式时触发中断,则设备将由于无法从向量中读取而锁定在递归硬故障中,永远不会完成编程操作并自行变砖。

虽然大多数类型的 ARM 内核都有一些方法可以更改它们自己的向量基地址,但有些(如 Cortex-M0),更不用说大量的非 ARM 内核,没有,这需要这种非架构特定的系统 -级别重新映射功能以实现相同的结果。对于围绕 ARM7TDMI 等较旧内核构建的微控制器,在固定的替代“高向量”地址后面也很可能没有 RAM(更适合与 MMU 一起使用),从而使该选项无用。

* 是的,好的,如果我们谈论的是 Cortex-M,则为 0x4,但你知道我的意思...... ;)

于 2015-04-15T08:44:14.000 回答