我无法理解重新映射中断向量或引导块的概念。重映射矢量表有什么用?如何使用重映射和无重映射?有关这方面好文章的链接吗?我用Google搜索,但无法得到好的答案。将RAM映射到0x0000并将0x0000中存在的任何内容映射到其他地方有什么好处?如果从0x0000执行,执行是否更快?
答案 0 :(得分:6)
这是一个简单的实用问题。复位向量位于0x0 * ,当系统首次上电时,内核将开始从那里获取指令。因此,你必须立即从上电中获得一些代码 - 它必须是某种ROM,因为此时RAM将是未初始化的。现在,一旦您完成了初始启动过程并正确启动了应用程序,您就会遇到问题 - 您的异常向量以及处理它们的代码都在ROM中!如果要安装其他中断处理程序,该怎么办?如果要切换热复位处理程序的复位向量,该怎么办?通过将矢量区域重新映射,应用程序可以自由地为其安装了自己的矢量和处理程序代码的RAM区域切换ROM引导固件。
当然,这可能并不总是必要的 - 例如对于运行单个专用应用程序的微控制器,该应用程序本身可以处理上电 - 但是一旦进入更复杂的单独引导加载程序和应用程序代码领域,它就变得更加重要。性能也是一个理论上的问题,至少 - 如果你有慢速但快速的RAM,你可能会受益于将向量和中断处理程序复制到RAM中 - 但我认为这远不是现代微处理器上的问题。 / p>
此外,如果应用程序希望能够在运行时更新引导闪存,那么它绝对需要一种将向量和处理程序放在别处的方法。否则,如果在闪存块处于编程模式时中断,则由于无法从向量中读取,设备将锁定递归硬故障,从不完成编程操作并自行完成。
虽然大多数类型的ARM内核都有change their own vector base address的一些方法,但有些(比如Cortex-M0),更不用说大量的非ARM内核,不需要,这就需要这种非架构特定的系统级重映射功能可以实现相同的结果。对于围绕像ARM7TDMI这样的旧内核构建的微控制器,它很可能在固定替代方案后面没有RAM"高矢量"地址(更适合与MMU一起使用),使该选项无效。
*是的,好的,0x4如果我们说的是Cortex-M,但你知道我的意思......;)