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