0

我正在为使用相对复杂的通信接口的 ARM Cortex-M3 编写引导加载程序;这与实际应用程序使用的相同。该应用程序使用 Keil 的 RTX 作为其内核,而通信堆栈依赖于此。当然,使用 GCC。

引导加载程序执行以下基本步骤:

  1. 启动时,检查有效的应用图像;如果没有可用,则进入升级模式;
  2. 它检查按钮按下作为进入升级模式的请求;如果发现,则进入升级模式。
  3. 找到有效图像并且没有升级请求后,它会“启动”应用程序。

这是相当简化的,但它充分描述了我们的目的。

令人惊讶地证明困难的最后一个问题是启动应用程序。想法是禁用中断,设置向量表,堆栈指针,并跳转到新向量表中的应用程序的重置向量。所有这一切都很有效,除了不久之后,我得到了一个硬故障。

通过实验,如果我在一个简单的引导加载程序(不使用 RTX 或者,当然,通讯堆栈)中执行此操作,应用程序的引导工作正常。所以看来RTX是问题所在。

问题是,真正的引导加载程序在进入升级模式之前不需要 RTX。因此,显而易见的方法是在确定需要 RTX 之前不要启动它;但是,它似乎被黑进了启动代码,所以当我进入引导加载程序代码时,为时已晚;事实上,bootloader main() 函数已经是一个线程了!

最好的方法似乎不是启动 RTX(太糟糕了,我没有使用 FreeRTOS!),直到我需要它;但是,这似乎需要一些黑客攻击。另一种方法是以某种方式禁用所有中断和异常,但由于某种原因,我在那里也没有成功。有没有人有这两种方法的例子?

4

1 回答 1

0

万一有人遇到这种情况,解决方案其实很简单。我刚刚在 system_efm32gg.c 文件中自定义了 SystemInit() 函数!虽然 _efm32gg 是特定于供应商的,但似乎 system_X.c 是一种广泛使用的 ARM 结构——至少,我在 ST、NXP 和 EnergyMicro/SiliconLab 上见过它——所以这是一个不错的通用方法。

我应该知道的更好!

于 2016-07-30T16:07:00.637 回答