Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C bootloader应用程序中的向量表重定位_C_Embedded_Microcontroller_Bootloader_Nxp Microcontroller - Fatal编程技术网

C bootloader应用程序中的向量表重定位

C bootloader应用程序中的向量表重定位,c,embedded,microcontroller,bootloader,nxp-microcontroller,C,Embedded,Microcontroller,Bootloader,Nxp Microcontroller,我已经为NXP Kinetis微控制器编写了一个引导程序应用程序。以下是我做的事情:1。在CFlash地址0x0000到0x8000 2中创建了引导加载程序应用程序。已创建从地址0x8000到0x1FFF的主应用程序代码 此代码运行良好。现在我的疑问是,我在引导加载程序和主应用程序代码中都放置了ISR,并且没有使用任何ISR向量重新定位。是否需要重新定位主应用程序中的向量表 PS:我可能不会因为两个应用程序中的ISR相同而面临这个问题。虽然我不知道Kinetis微控制器的具体情况,但以下是基于其

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

此代码运行良好。现在我的疑问是,我在引导加载程序和主应用程序代码中都放置了ISR,并且没有使用任何ISR向量重新定位。是否需要重新定位主应用程序中的向量表


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

虽然我不知道Kinetis微控制器的具体情况,但以下是基于其他飞思卡尔/NXP控制器的一般行为

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

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

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

一旦您将固件更新到ISR入口点最有可能移动地址的另一个版本,您的代码将停止工作,因为MCU/bootloader将ISR事件发送到错误的地址

如果启用/实现向量重定位/重定向,原始引导加载程序向量将被有效忽略,并将使用重定位的向量。因为这些都是随应用程序一起更新的,所以没有问题


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

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


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

向量表在哪里,它指向什么?如果不是在重置后的值,则显然需要移动它(如果可能,取决于内核)。@old_timer问题是关于所有中断向量,如计时器、adc、uart等。向量位置存储在地址0x0000。对,那么我的问题又回到您这里了……您读过处理器的工作原理了吗?你不明白其中的哪一部分?这不是一个nxp的东西,而是一个处理器核心的东西。nxp kenetis太通用了,你有哪个核心决定了什么是可用的…对于那些想更好地理解向量表的人来说:谢谢你的回答。我自己解决了。如果我错了,请纠正我。在我的例子中,启动代码负责这个向量重定位。我只是更改链接器文件中的地址。一切都由链接器负责。是的,这正是我的观点。在这种情况下,您只需在应用程序中为向量表使用不同的基址。