我为NXP Kinetis微控制器编写了一个bootloader应用程序。以下是我要做的事情:1。在CFlash地址0x0000到0x8000中创建一个引导加载程序应用程序2.从地址0x8000到0x1FFFF创建我的主应用程序代码
此代码工作正常。现在我的疑问是,我将ISR置于引导加载程序和主应用程序代码中,并且没有使用任何ISR向量重定位。是否有必要在主应用程序中重定位向量表?
PS:我可能不会因为两个应用程序中的ISR相同而面临这个问题。
答案 0 :(得分:2)
在大多数现代MCU上,不需要向量表重定位,因为在编译应用程序时可以将向量表基址指定为参数。
如果你的目标没有这样的功能,并且引导程序中的向量表是0x0000到0x8000那么你需要为应用程序重新定位向量表,以便应用程序中发生的中断导致跳转到正确处理程序。
答案 1 :(得分:1)
虽然我不知道Kinetis微控制器的具体细节,但以下是基于其他飞思卡尔/恩智浦控制器的一般行为。
引导加载程序旨在允许您更新固件。 (否则,您不需要一个。)并且,必须将引导加载程序保存在受保护的内存中以防止意外删除。通过保护引导加载程序,您还可以保护向量。因此,您无法再更新向量。
除非您极端保证每次固件更新都会使ISR代码从与先前版本完全相同的地址开始,否则您可以让ISR在地址空间中自由移动。这就是向量重定位或重定向发挥作用的地方。
目前,你有引导加载程序和应用程序在两组向量中使用相同的地址,一切正常。
只要您将固件更新到ISR入口点很可能已移动地址的另一个版本,您的代码就会停止工作,因为MCU / bootloader会将ISR事件发送到错误的地址。
如果启用/实现向量重定位/重定向,将有效地忽略原始引导加载程序向量,并将使用重定位向量。由于这些都与您的应用程序一起更新,没问题。
矢量重定位有两种方法。一种是基于硬件(具有无ISR呼叫开销的优势),另一种是基于软件的(一些最小开销,但即使在没有硬件向量重定向的微控制器中也可以实现)。