控制 Keil RTX 何时启动
Controlling when Keil RTX starts
我正在为使用相对复杂的通信接口的 ARM Cortex-M3 编写引导加载程序;这与实际应用程序使用的相同。该应用程序使用 Keil 的 RTX 作为其内核,并且通信堆栈依赖于它。当然是使用 GCC。
引导加载程序执行以下基本步骤:
- 启动时,检查有效的应用图像;如果none可用,则进入升级模式;
- 它检查是否按下按钮作为进入升级模式的请求;如果发现,它会进入升级模式。
- 已找到有效图像且没有升级请求,它 "boots" 应用程序。
这相当简单,但它充分描述了我们的目的场景。
最后一个出人意料地困难的问题是启动应用程序。这个想法是禁用中断,设置向量 table,堆栈指针,并跳转到新向量 table 中应用程序的重置向量。所有这一切都很好用,只是此后不久,我遇到了硬故障。
通过实验,如果我在一个普通的引导加载程序(不使用 RTX,当然也不使用通信堆栈)中执行此操作,则应用程序的引导工作正常。所以看来 RTX 是问题所在。
事实是,真正的引导加载程序在进入升级模式之前不需要 RTX。所以显而易见的方法是在我们确定需要它之前不要启动 RTX;然而,它似乎被侵入了启动代码,所以当我进入引导加载程序代码时,为时已晚;实际上,bootloader main() 函数已经是一个线程了!
最好的方法似乎是在我需要它之前不启动 RTX(太糟糕了,我没有使用 FreeRTOS!);然而,这似乎需要一些黑客攻击。另一种方法是以某种方式禁用所有中断和异常,但出于某种原因,我也没有成功。有没有人有这两种方法的例子?
万一遇到这种情况,解决方法其实很简单。我刚刚在 system_efm32gg.c 文件中自定义了 SystemInit() 函数!虽然 _efm32gg 是特定于供应商的,但 system_X.c 似乎确实是一种广泛使用的 ARM 构造 - 至少,我已经在 ST、NXP 和 EnergyMicro/SiliconLab 中看到过它 - 所以这是一个不错的通用方法.
我早该知道的! 感叹
我正在为使用相对复杂的通信接口的 ARM Cortex-M3 编写引导加载程序;这与实际应用程序使用的相同。该应用程序使用 Keil 的 RTX 作为其内核,并且通信堆栈依赖于它。当然是使用 GCC。
引导加载程序执行以下基本步骤:
- 启动时,检查有效的应用图像;如果none可用,则进入升级模式;
- 它检查是否按下按钮作为进入升级模式的请求;如果发现,它会进入升级模式。
- 已找到有效图像且没有升级请求,它 "boots" 应用程序。
这相当简单,但它充分描述了我们的目的场景。
最后一个出人意料地困难的问题是启动应用程序。这个想法是禁用中断,设置向量 table,堆栈指针,并跳转到新向量 table 中应用程序的重置向量。所有这一切都很好用,只是此后不久,我遇到了硬故障。
通过实验,如果我在一个普通的引导加载程序(不使用 RTX,当然也不使用通信堆栈)中执行此操作,则应用程序的引导工作正常。所以看来 RTX 是问题所在。
事实是,真正的引导加载程序在进入升级模式之前不需要 RTX。所以显而易见的方法是在我们确定需要它之前不要启动 RTX;然而,它似乎被侵入了启动代码,所以当我进入引导加载程序代码时,为时已晚;实际上,bootloader main() 函数已经是一个线程了!
最好的方法似乎是在我需要它之前不启动 RTX(太糟糕了,我没有使用 FreeRTOS!);然而,这似乎需要一些黑客攻击。另一种方法是以某种方式禁用所有中断和异常,但出于某种原因,我也没有成功。有没有人有这两种方法的例子?
万一遇到这种情况,解决方法其实很简单。我刚刚在 system_efm32gg.c 文件中自定义了 SystemInit() 函数!虽然 _efm32gg 是特定于供应商的,但 system_X.c 似乎确实是一种广泛使用的 ARM 构造 - 至少,我已经在 ST、NXP 和 EnergyMicro/SiliconLab 中看到过它 - 所以这是一个不错的通用方法.
我早该知道的! 感叹