1

我为 NXP Kinetis 微控制器编写了一个引导加载程序应用程序。以下是我做同样的事情: 1. 在 CFlash 地址 0x0000 到 0x8000 中创建引导加载程序应用程序 2. 从地址 0x8000 到 0x1FFFF 创建我的主应用程序代码

这段代码工作正常。现在我的疑问是,我在引导加载程序和主应用程序代码中都放置了 ISR,并且没有使用任何 ISR 向量重定位。是否有必要在主应用程序中重新定位向量表?

PS:我可能不会因为两个应用程序中的 ISR 相同而面临这个问题。

4

2 回答 2

2

在大多数现代 MCU 上,不需要向量表重定位,因为可以在编译应用程序时将向量表基地址指定为参数。

如果您的目标没有这样的功能并且引导加载程序中的向量表是 0x0000 到 0x8000,那么您将需要为应用程序重新定位向量表,以便应用程序中发生的中断导致跳转到正确的处理程序。

于 2018-02-12T18:25:35.687 回答
1

虽然我不知道 Kinetis 微控制器的细节,但以下是基于其他飞思卡尔/恩智浦控制器的一般行为。

引导加载程序旨在让您更新固件。(否则,您不需要。)而且,引导加载程序必须保存在受保护的内存中,以防止意外擦除。通过保护引导加载程序,您还可以保护向量。所以,你不能再更新向量了。

除非您采取极端措施来保证每次固件更新都会使 ISR 代码从与以前版本完全相同的地址开始,否则您宁愿让 ISR 在地址空间中自由移动。这就是矢量重定位或重定向发挥作用的地方。

目前,您让引导加载程序和应用程序在两组向量中使用相同的地址,并且一切正常。

一旦您将固件更新到 ISR 入口点很可能已移动地址的另一个版本,您的代码将停止工作,因为 MCU/引导加载程序会将 ISR 事件发送到错误的地址。

如果您启用/实施向量重定位/重定向,原始引导加载程序向量将被有效忽略,并且将使用重定位向量。由于这些与您的应用程序一起更新,所以没问题。

向量重定位有两种方法。一种是基于硬件的(具有没有 ISR 调用开销的优点),另一种是基于软件的(一些开销最小,但即使在没有可用硬件矢量重定向的微控制器中也可以实现)。

于 2018-02-10T17:23:05.307 回答