【问题标题】:How do you handle interrupts in a bootloader?您如何处理引导加载程序中的中断?
【发布时间】:2014-02-04 05:28:24
【问题描述】:

我的引导加载程序需要使用中断向量,但我的应用程序也是如此。高向量从地址0x08 开始,低向量从地址0x18 开始。

如何共享中断向量,以便在引导加载程序和下载的应用程序中拥有单独的中断功能?我正在使用 PIC18F87J11 和 MPLAB XC8 编译器。

【问题讨论】:

  • 您的引导加载程序真的需要中断,还是您碰巧实现它的方式?在解决副作用之前,请检查原因。
  • 目前没有,我只是删除了引导加载程序代码中的所有中断。

标签: embedded microcontroller pic bootloader microchip


【解决方案1】:

我在工作中也遇到过类似的问题。

在 STM32 上,您可以在运行时更改向量表的位置,这很棒。

在 PIC18 上,我只是选择不在引导加载程序中使用中断,因此 0x08 和 0x18 处的中断向量可以使用 GOTO 指令无条件地重定向到应用程序部分中的等效位置。您确定需要在引导加载程序中使用中断吗?

如果您真的需要中断,我认为您需要有一些巧妙的方法来在运行时判断应用程序正在运行还是引导加载程序正在运行,以便您可以重定向到正确的位置。为简单起见,您希望能够在不影响 STATUS 寄存器或 RAM 的任何其他部分的情况下对此进行测试。

我建议保留一个特殊的 RAM 字节,也许是存取存储区的最高字节。 XC8 允许您绝对定位变量,因此(如果它不是错误的)您可以这样做:

unsigned char inBootloader @ 0x5F;

不幸的是,此引导加载程序加载的每个应用程序都必须了解此约定并在同一位置定义相同的变量。或者他们至少应该避免写入内存中的那个位置,并让引导加载程序代码维护变量的状态。

然后在 0x08 和 0x18 处的中断向量中放入一些简单的逻辑来重定向到正确的位置:

btfss inBootloader, 0
goto 0x4008   ; go to application high vector
goto bootloaderHighIsr

【讨论】:

  • 我会避免在引导加载程序中使用中断,但如果我不得不采取其他方式,我理解你的回答。
  • 请注意,STM32 上的向量表重定位是所有 ARM Cortex-M3/4 内核设备的特性,而不是专门的 STM32。
  • 对,Clifford,我应该在我的回答中说 Cortex-M3。
猜你喜欢
  • 2015-06-21
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多