控制Keil RTX何时启动

时间:2016-07-29 01:20:21

标签: gcc arm rtx

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

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

  1. 启动时,检查有效的应用图片;如果没有,则进入升级模式;
  2. 检查按下按钮是否为进入升级模式的请求;如果发现,则进入升级模式。
  3. 找到有效的图片并且没有升级请求,它就是" boots"应用程序。
  4. 这是相当简化的,但它为我们的目的充分描述了该场景。

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

    通过实验,如果我在一个简单的引导程序(不使用RTX,或者当然是通信堆栈)中这样做,启动到应用程序工作正常。所以似乎RTX就是问题所在。

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

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

1 个答案:

答案 0 :(得分:0)

如果有人遇到这种情况,解决方案实际上非常简单。我只是在system_efm32gg.c文件中定制了SystemInit()函数!虽然_efm32gg是特定于供应商的,但似乎system_X.c似乎是一个广泛使用的ARM构造 - 至少,我已经看过ST,NXP和EnergyMicro / SiliconLab - 所以这是一个不错的通用方法。 / p>

我应该知道的更好! 叹息